diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.zig | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/src/main.zig b/src/main.zig index e6975be..496d14f 100644 --- a/src/main.zig +++ b/src/main.zig @@ -25,13 +25,12 @@ const SudokuSolver = struct { fn possibleMovesForCell(self: SudokuSolver, row: usize, col: usize) std.StaticBitSet(9) { var cell_guesses: std.StaticBitSet(9) = .initEmpty(); - const constraints = join(self.rows[row], join(self.cols[col], self.boxes[boxOf(row, col)])); - inline for (1..10) |n| { + const related = join(self.rows[row], join(self.cols[col], self.boxes[boxOf(row, col)])); + inline for (0..9) |n| { // A number is a possible move iff it does not already exist in the current row, col, or box. - const n_vec: @Vector(@typeInfo(@TypeOf(constraints)).vector.len, u8) = @splat(n); - const equals = constraints == n_vec; - if (!@reduce(.Or, equals)) { - cell_guesses.set(n - 1); + const n_vec: @TypeOf(related) = @splat(n + 1); + if (!@reduce(.Or, related == n_vec)) { + cell_guesses.set(n); } } @@ -95,12 +94,11 @@ const SudokuSolver = struct { } fn isSolved(self: SudokuSolver) bool { - for (self.rows) |row| { - const z_vec: @Vector(@typeInfo(@TypeOf(row)).vector.len, u8) = @splat(0); - const equals = row == z_vec; - if (@reduce(.Or, equals)) return false; - } - return true; + // Not solved if any row contains a zero. + const z_vec: @Vector(9, u8) = @splat(0); + return for (self.rows) |row| { + if (@reduce(.Or, row == z_vec)) break false; + } else true; } fn setCell(self: *SudokuSolver, row: usize, col: usize, value: u8) void { |