diff options
| author | Maksymilian Jopek <maks@jopek.eu> | 2022-12-19 21:04:23 +0100 |
|---|---|---|
| committer | Maksymilian Jopek <maks@jopek.eu> | 2022-12-19 21:04:23 +0100 |
| commit | 44ff6231441024d16fddc2b7cb648539522b04cb (patch) | |
| tree | 8302d0734f4ce931631ffe6d43af5b9a5da284a0 /src/lib/sudoku/solve.ts | |
| parent | 9f4618c5ef618521ce1ab680d82ed9cc941d10d8 (diff) | |
| download | digit-single-44ff6231441024d16fddc2b7cb648539522b04cb.tar.gz digit-single-44ff6231441024d16fddc2b7cb648539522b04cb.tar.zst digit-single-44ff6231441024d16fddc2b7cb648539522b04cb.zip | |
v1.0.0
Added everything that's in the spec
Diffstat (limited to 'src/lib/sudoku/solve.ts')
| -rw-r--r-- | src/lib/sudoku/solve.ts | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/lib/sudoku/solve.ts b/src/lib/sudoku/solve.ts new file mode 100644 index 0000000..eedb576 --- /dev/null +++ b/src/lib/sudoku/solve.ts @@ -0,0 +1,35 @@ +function solve() { + let board = self.readBoard(true); + let backtrack = 0; + let guesswork = 0; + let dcount = 0; + let time = Date.now(); + if (solve()) { + stats(); + self.writeBytes(board); + el.classList.add("solved"); + } else { + stats(); + alert("no solution"); + } + function solve() { + let { index, moves, len } = analyze(board); + if (index == null) return true; + if (len > 1) guesswork++; + for (let m = 1; moves; m <<= 1) { + if (moves & m) { + dcount++; + board[index] = m; + if (solve()) return true; + moves ^= m; + } + } + board[index] = 0; + ++backtrack; + return false; + } + function stats() { + log(el, `${dcount} digits placed<br>${backtrack} take-backs<br>${guesswork} guesses<br>${Date.now() - time} milliseconds`); + } +} + |
