嘗試撰寫一個腳本來檢查數獨謎題是否正確解決。我嘗試使用 2 個周期和測驗方法檢查每個值,如果測驗回傳 true,則將值替換為“0”,但腳本沒有替換所有值,我不明白為什么。您能否解釋一下為什么腳本會替換某些值,而其他值不會?
const doneOrNot = (sudoku) => {
const copiedSudoku = JSON.parse(JSON.stringify(sudoku));
console.log(copiedSudoku);
const testNums = [1, 2, 3, 4, 5, 6, 7, 8, 9];
for (const num in copiedSudoku) {
for (const newnum in copiedSudoku[num]) {
const regexp = RegExp(`${testNums[newnum]}`);
if (regexp.test(copiedSudoku[num])) {
copiedSudoku[num][newnum] = 0;
}
}
}
return copiedSudoku;
};
console.log(doneOrNot(
[[5, 3, 4, 6, 7, 8, 9, 1, 2],
[6, 7, 2, 1, 9, 5, 3, 4, 8],
[1, 9, 8, 3, 4, 2, 5, 6, 7],
[8, 5, 9, 7, 6, 1, 4, 2, 3],
[4, 2, 6, 8, 5, 3, 7, 9, 1],
[7, 1, 3, 9, 2, 4, 8, 5, 6],
[9, 6, 1, 5, 3, 7, 2, 8, 4],
[2, 8, 7, 4, 1, 9, 6, 3, 5],
[3, 4, 5, 2, 8, 6, 1, 7, 9]],
));
uj5u.com熱心網友回復:
但腳本不會替換所有值,我不明白為什么。
發生這種情況是因為您的代碼在當前行中查找列號作為值,但該值可能已經更改為 0,因此不匹配,并且當前值不會被 0 替換。
在您的示例中,這發生在第一行,當內部回圈處于其第 3 次迭代時。然后newnum等于 2,此時當前的數獨行copiedSudoku[num]如下所示:
[0, 0, 4, 6, 7, 8, 9, 1, 2]
如您所見,內部回圈的前兩次迭代放置了一個零,但現在testNums[newnum]是 3,并且該數字已被洗掉,因此test方法呼叫將回傳 false,因此 4 不會被清除。
問題
對這個演算法的主要評論是在給定的數獨中應該沒有必要修改任何東西。該演算法應該只是查看和計算。
創建一個正則運算式只是為了找到一個數字是多余的。為此,您可以使用
include陣列方法。RegExp 方法需要一個字串作為引數,但您將
.test它傳遞給一個陣列。這意味著陣列被轉換為逗號分隔的字串,所以它仍然可以作業,但當然不建議這樣做。在陣列上使用
for..in回圈不是一個好習慣。如果您對陣列中的值感興趣,請使用回圈。for..of由于您的函式名稱暗示了一個布爾回傳值,它不應該回傳數獨,而是用真偽指示成功。
只讀解決方案
如前所述,應該沒有必要放置零。這無助于實作您的目標。
const hasAllDigits = arr =>
arr.reduce((acc, digit) => acc | (1 << digit), 0) == 0x3FE;
const doneOrNot = (sudoku) => {
for (let i = 0; i < 9; i =3) {
for (let j = 0; j < 3; j ) {
let k = i j;
// Check k-th row
if (!hasAllDigits(sudoku[k])) return false;
// Check k-th column
if (!hasAllDigits(sudoku.map(row => row[k]))) return false;
// Check k-th 3x3 box
if (!hasAllDigits(sudoku.slice(j*3, j*3 3)
.flatMap(row => row.slice(i, i 3)))) return false;
}
}
return true;
};
console.log(doneOrNot(
[[5, 3, 4, 6, 7, 8, 9, 1, 2],
[6, 7, 2, 1, 9, 5, 3, 4, 8],
[1, 9, 8, 3, 4, 2, 5, 6, 7],
[8, 5, 9, 7, 6, 1, 4, 2, 3],
[4, 2, 6, 8, 5, 3, 7, 9, 1],
[7, 1, 3, 9, 2, 4, 8, 5, 6],
[9, 6, 1, 5, 3, 7, 2, 8, 4],
[2, 8, 7, 4, 1, 9, 6, 3, 5],
[3, 4, 5, 2, 8, 6, 1, 7, 9]],
));
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/482684.html
標籤:javascript 数组 测试
上一篇:斷言不會捕獲錯誤
