Кажется, что входные данные для судоку - это двумерный массив, подобный этому:
let grid = [
[2,4,1,7,6,8,5,3,9],
[5,7,3,9,2,4,1,8,6],
[8,9,6,5,3,1,7,4,2],
[7,3,4,2,9,5,6,1,8],
[1,8,9,4,7,6,3,2,5],
[6,5,2,8,1,3,4,9,7],
[4,6,5,3,8,2,9,7,1],
[3,2,7,1,5,9,8,6,4],
[9,1,8,6,4,7,2,5,3]
]
Чтобы проверить судоку, мы должны проверить все строки, столбцы и вложенные сетки
Объяснение кода:
p = a => eval(a.join("*")) == (1*2*3*4*5*6*7*8*9);
Это эквивалентно
p = function(a) {
return eval(a.join("*")) == (1*2*3*4*5*6*7*8*9);
}
Так что функция "p" получает массив целых чисел
[2,4,1,7,6,8,5,3,9]
объединяет все целые числа с "*", и в результате мы имеем:
"2*4*1*7*6*8*5*3*9"
, затем оцениваем эту строку и в результате получаем:
362880
Этото же значение, что и 1*2*3*4*5*6*7*8*9
Так что теперь мы можем проверить каждую строку, каждый столбец и каждую подсеть с помощью этой функции.
sudoku = grid =>
grid.every((r,i) =>
validRows &&
validColumns &&
validSubGrids )
- это то же самое, что:
sudoku = function(grid) {
grid.every( function(r, i) {
return
validRows &&
validColumns &&
validSubGrids
})
}
Метод every
выполняет предоставленную функцию обратного вызова один раз для каждого элемента, присутствующего в массиве, пока не найдет элемент, в котором обратный вызов возвращает ложное значение.В противном случае он возвращает true.
Действительное судоку означает, что обратный вызов нашей every
функции возвращает true
для всех элементов.
p(r)
- проверить каждую строку
p(grid.map(r => r[i]))
- проверить каждый столбец
функция map
создает новый массив.Например, для i=0
будет получен следующий результат:
[ grid[0][0], grid[0][1], grid[0][2],...]
p(r.map((_,j) => grid[3*(i/3|0)+(j/3|0)][3*(i%3)+(j%3)]) ) )
- проверить каждую подсеть
Эквивалентный код:
p(
r.map( function(_,j) {
let row = 3 * Math.floor(i/3) + Math.floor(j/3)
let column = 3 * (i%3) + (j%3)
return grid[row][column]
})
)
Таким образом, какВ результате мы проверили все строки, все столбцы и все вложенные сетки.