Я занимаюсь javascript и делаю игру судуко. Я нажимаю() некоторые числа внутри массива.
var sudukoNmb = [1,2,3,3,2,1,2,1,3]
и у меня есть это условие, чтобы читать числа по строкам и столбцам, но я думаю, что это не правильный путь.
if(sudukoNmb[0] === sudukoNmb[1] || sudukoNmb[0] === sudukoNmb[2] || sudukoNmb[1] === sudukoNmb[2] ||
sudukoNmb[0] === sudukoNmb[3] || sudukoNmb[0] === sudukoNmb[6] || sudukoNmb[3] === sudukoNmb[6] ||
sudukoNmb[1] === sudukoNmb[4] || sudukoNmb[1] === sudukoNmb[7] || sudukoNmb[4] === sudukoNmb[7] ||
sudukoNmb[3] === sudukoNmb[4] || sudukoNmb[3] === sudukoNmb[5] || sudukoNmb[4] === sudukoNmb[5] ||
sudukoNmb[6] === sudukoNmb[7] || sudukoNmb[6] === sudukoNmb[8] || sudukoNmb[7] === sudukoNmb[8] ||
sudukoNmb[2] === sudukoNmb[5] || sudukoNmb[2] === sudukoNmb[8] || sudukoNmb[5] === sudukoNmb[8]) {
console.log('error')
} else {
console.log('correct')
}
Есть ли другой способ минимизировать это условие?
Примечание: эти числа на самом деле поступают из индексов строк и столбцов 2D-массива (3x3), отображаемых в 1D-массиве. (sudukoNmb [3] для первой ячейки второго ряда и так далее...)
Его относительно трудно понять логику вашего состояния, но я обнаружил, что он сравнивает строки и столбцы 2D-массива (3x3), хранящиеся в 1D-массиве (всего 9 элементов).
Таким образом, массив содержит следующие элементы:
0 1 2
3 4 5
6 7 8
и мы должны проверять каждую строку или столбец так, чтобы они не имели одинаковых значений в каждой горизонтальной или вертикальной линии. Например:
поэтому формула для строк: check i,(i+1)/i,(i+2)/(i+1),(i+2)
а также
поэтому формула для строк: check i,(i+3)/i,(i+2*3)/(i+3),(i+2*3)
мы можем объединить обе формулы в один общий:
check i,(i+n) / i,(i+2*n) / (i+n),(i+2*n)
где n - 1 для строк и 3 для столбцов.
следующий код может проверять значения в каждом столбце или строке:
var sudukoNmb = [1,2,3, 4,5,6, 7,5,9];
function checkLine(a, i, n) //a:array, i: first cell index, n: offset to get next cell in row or column
{
return (a[i]===a[i+n] || a[i]===a[i+2*n] || a[i+n]===a[i+2*n]);
}
var msg = "OK";
for(var j=0; j<2; j++)
{
//if (checkLine(sudukoNmb, j, 3)) {msg="Error"; break;} //to check columns
//if (checkLine(sudukoNmb, j*3, 1)) {msg="Error"; break;} //to check rows
if (checkLine(sudukoNmb, j, 3) || checkLine(sudukoNmb, j*3, 1))
{msg = "Error"; break;}
}
console.log("Check result is: " + msg);
script
из кода, потому что OP не указывает на то, что это выполняется внутри HTML
script
тег произошел из-за фрагмента кода html-панели stackoverflow ... в любом случае, я перемещаю код на панель js, чтобы удалить его.
Предполагается, что девять значений "sudoku box" являются уникальными, поэтому можно было бы использовать класс Set
ES6, он сохраняет уникальные значения.
var sudukoNmb = [1,2,3,3,2,1,2,1,3]
if (new Set(sudukoNmb).size === 9) { // Set instance has [1,2,3] only
console.log('correct')
} else {
console.log('error')
}
sudukoNmb = [1,2,3, 4,5,6, 3,8,9]
поскольку повторяющиеся 3 не находятся в той же строке или столбце, но ваш код возвращает ошибку!
Попробуй это
var sudukoNmb = [1,2,3,3,2,1,2,1,3],
allow = [[1,2,3,6], [2,4,7], [5,8], [6,4,5], [7,5], [8], [7,8], [8]];
var f = 0;
allow.forEach(function(v,i){
v.forEach(function(vv){
if(sudukoNmb[i] == sudukoNmb[vv]) f=1;
})
})
if(f) console.log('error')
else console.log('correct')