1var sudokuBoard = [
2 [[5], [3], [], [], [7], [], [], [], []],
3 [[6], [], [], [1], [9], [5], [], [], []],
4 [[], [9], [8], [], [], [], [], [6], []],
5 [[8], [], [], [], [6], [], [], [], [3]],
6 [[4], [], [], [8], [], [3], [], [], [1]],
7 [[7], [], [], [], [2], [], [], [], [6]],
8 [[], [6], [], [], [], [], [2], [8], []],
9 [[], [], [], [4], [1], [9], [], [], [5]],
10 [[], [], [], [], [8], [], [], [7], [9]],
11];
12
13function getCoordsOfBoxesInSameSubBox(x, y) {
14 let subBoxX = Math.floor(x / 3);
15 let subBoxY = Math.floor(y / 3);
16 let coords = [];
17 for (let subBoxBoxX = 0; subBoxBoxX < 3; subBoxBoxX++) {
18 for (let subBoxBoxY = 0; subBoxBoxY < 3; subBoxBoxY++) {
19 let globalX = subBoxBoxX + subBoxX * 3;
20 let globalY = subBoxBoxY + subBoxY * 3;
21 if (!(globalX === x && globalY === y)) {
22 coords.push({ x: globalX, y: globalY });
23 }
24 }
25 }
26 return coords;
27}
28
29function getCoordsOfBoxesInSameXandY(x, y) {
30 let coords = [];
31 for (let boxX = 0; boxX < 9; boxX++) {
32 if (!(boxX === x)) {
33 coords.push({ x: boxX, y: y });
34 }
35 }
36 for (let boxY = 0; boxY < 9; boxY++) {
37 if (!(boxY === y)) {
38 coords.push({ x: x, y: boxY });
39 }
40 }
41 return coords;
42}
43
44function getPossibleNumbers(x, y, sudokuBoard) {
45 let possibleNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
46 let coordsToCheck = getCoordsOfBoxesInSameSubBox(x, y).concat(
47 getCoordsOfBoxesInSameXandY(x, y)
48 );
49 for (let coordIndex in coordsToCheck) {
50 let coord = coordsToCheck[coordIndex];
51 let boxData = sudokuBoard[coord.x][coord.y];
52 if (boxData.length === 1) {
53 var index = possibleNumbers.indexOf(boxData[0]);
54 if (index !== -1) {
55 possibleNumbers.splice(index, 1);
56 }
57 }
58 }
59 return possibleNumbers;
60}
61
62function iterativelySolveSudokuBoard(sudokuBoard) {
63 let newSudokuBoard = sudokuBoard;
64 for (let x in sudokuBoard) {
65 let sudokuBoardRow = sudokuBoard[x];
66 for (let y in sudokuBoard) {
67 let sudokuBox = sudokuBoardRow[y];
68 if (!(sudokuBox.length === 1)) {
69 newSudokuBoard[x][y] = getPossibleNumbers(x, y, sudokuBoard);
70 }
71 }
72 }
73 return newSudokuBoard;
74}
75
76let solved = false;
77while (!solved) {
78 sudokuBoard = iterativelySolveSudokuBoard(sudokuBoard);
79 solved = true;
80 for (let x in sudokuBoard) {
81 let sudokuBoardRow = sudokuBoard[x];
82 for (let y in sudokuBoard) {
83 let sudokuBox = sudokuBoardRow[y];
84 if (!(sudokuBox.length === 1)) {
85 solved = false;
86 }
87 }
88 }
89}
90console.log(sudokuBoard);