我在在线编辑器上尝试了所有方法,但仍然出现错误。但是当我在我机器上的 VSCode 上执行它时,它工作正常。我很迷茫,没有发现错误就无法提交代码。我不知道该去哪里找了。我希望有另一双眼睛帮我看看这个。我真的很感激。
//puzzle
let puzzle = [
[8, 9, 5, 7, 4, 2, 1, 3, 6],
[2, 7, 1, 9, 6, 3, 4, 8, 5],
[4, 6, 3, 5, 8, 1, 7, 9, 2],
[9, 3, 4, 6, 1, 7, 2, 5, 8],
[5, 1, 7, 2, 3, 8, 9, 6, 4],
[6, 8, 2, 4, 5, 9, 3, 7, 1],
[1, 5, 9, 8, 7, 4, 6, 2, 3],
[7, 4, 6, 3, 2, 5, 8, 1, 9],
[3, 2, 8, 1, 9, 6, 5, 4, 7],
];
//puzzle 2
let puzzleTwo = [
[8, 9, 5, 7, 4, 2, 1, 3, 6],
[8, 7, 1, 9, 6, 3, 4, 8, 5],
[4, 6, 3, 5, 8, 1, 7, 9, 2],
[9, 3, 4, 6, 1, 7, 2, 5, 8],
[5, 1, 7, 2, 3, 8, 9, 6, 4],
[6, 8, 2, 4, 5, 9, 3, 7, 1],
[1, 5, 9, 8, 7, 4, 6, 2, 3],
[7, 4, 6, 3, 2, 5, 8, 1, 9],
[3, 2, 8, 1, 9, 6, 5, 4, 7],
];
//DO NOT EDIT ABOVE
function getRow(puzzle, row) {
let array = [];
for (let i = 0; i < puzzle.length; i++) {
if (i === row)
for (let j = 0; j < puzzle[i].length; j++) array.push(puzzle[i][j]);
}
return array;
}
function getColumn(puzzle, col) {
let array = [];
for (let i = 0; i < puzzle.length; i++) {
for (let j = 0; j < puzzle[i].length; j++)
if (j === col) array.push(puzzle[i][col]);
}
return array;
}
function getSection(puzzle, x, y) {
let array = [];
let xIndex = 0;
let yIndex = 0;
if (x === 0) yIndex = 0;
else if (x === 1) yIndex = 3;
else yIndex = 6;
if (y === 0) xIndex = 0;
else if (y === 1) xIndex = 3;
else xIndex = 6;
for (let i = xIndex; i < xIndex + 3; i++)
for (let j = yIndex; j < yIndex + 3; j++) array.push(puzzle[i][j]);
return array;
}
function includes1To9(arr) {
let prev = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] === prev) return false;
prev = arr[i];
}
return true;
}
function sudokuIsValid(puzzle) {
for (let x = 0; x < 3; x++)
for (let y = 0; y < 3; y++)
if (includes1To9(getSection(puzzle, x, y)) === false) return false;
for (let i = 0; i < puzzle.length; i++) {
if (includes1To9(getRow(puzzle, i)) === false) return false;
if (includes1To9(getColumn(puzzle, i)) === false) return false;
}
return true;
}
console.log(sudokuIsValid(puzzle)); //Returns true
console.log(sudokuIsValid(puzzleTwo)); //Returns false
这是我收到的错误消息。提示要求我在数独无效时返回 false。如您所见,它确实会为无效拼图返回 false,但并非所有无效拼图都返回 false。
FAIL ./index.test.js
sudoku sudokuIsValid
✓ returns false for an invalid puzzle (2 ms)
✕ returns false for other invalid puzzles (2 ms)
● sudoku sudokuIsValid › returns false for other invalid puzzles
expect(received).toBe(expected) // Object.is equality
Expected: false
Received: true
21 | ];
22 | let result = sudoku.sudokuIsValid(puzzle)
> 23 | expect(result).toBe(false);
| ^
24 | });
25 |
26 | });
at Object.<anonymous> (index.test.js:23:20)
你的
includes1To9()
只检查相邻元素是否相同:
function includes1To9(arr) {
let prev = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] === prev) return false;
prev = arr[i];
}
return true;
}
console.log(includes1To9([1, 2, 1, 4, 5, 6, 7, 8, 9]));
console.log(includes1To9([1, 2, 2, 4, 5, 6, 7, 8, 9]));
console.log(includes1To9([1, 2, 3, 4, 5, 6, 7, 8, 9]));
您可以尝试使用其他方法,例如使用 Set 查看是否存在重复元素:
function includes1To9(arr) {
return new Set(arr).size === arr.length;
}
console.log(includes1To9([1, 2, 1, 4, 5, 6, 7, 8, 9]));
console.log(includes1To9([1, 2, 2, 4, 5, 6, 7, 8, 9]));
console.log(includes1To9([1, 2, 3, 4, 5, 6, 7, 8, 9]));