From 3eb82e632ba8f74feb4d4a753ff3017a45cf59c6 Mon Sep 17 00:00:00 2001 From: belliash Date: Sun, 22 Dec 2019 22:44:15 +0100 Subject: [PATCH] Add new test - sudoku solver. --- tests/sudoku_solver.aer | 105 ++++++++++++++++++++++++++++++++++++++++ tests/sudoku_solver.exp | 19 ++++++++ 2 files changed, 124 insertions(+) create mode 100644 tests/sudoku_solver.aer create mode 100644 tests/sudoku_solver.exp diff --git a/tests/sudoku_solver.aer b/tests/sudoku_solver.aer new file mode 100644 index 0000000..b9483e6 --- /dev/null +++ b/tests/sudoku_solver.aer @@ -0,0 +1,105 @@ +import 'math'; + +class Sudoku { + public int[] $board; + int $size; + + public void __construct(int[] $board) { + $this->board = $board; + $this->size = sizeof($this->board); + } + + public bool isSafe(int $row, int $col, int $n) { + for(int $d = 0; $d < $this->size; $d++) { + if($this->board[$row][$d] == $n) { + return false; + } + } + for(int $r = 0; $r < $this->size; $r++) { + if($this->board[$r][$col] == $n) { + return false; + } + } + int $sqrt = (int) sqrt($this->size); + int $boxRowStart = $row - $row % $sqrt; + int $boxColStart = $col - $col % $sqrt; + for(int $w = $boxRowStart; $w < $boxRowStart + $sqrt; $w++) { + for(int $q = $boxColStart; $q < $boxColStart + $sqrt; $q++) { + if($this->board[$w][$q] == $n) { + return false; + } + } + } + return true; + } + + public void print() { + for(int $r = 0; $r < $this->size; $r++) { + for(int $d = 0; $d < $this->size; $d++) { + print($this->board[$r][$d] + " "); + } + print("\n"); + } + } + + public bool solve() { + int $row = -1; + int $col = -1; + bool $isEmpty = true; + for(int $i = 0; $i < $this->size; $i++) { + for(int $j = 0; $j < $this->size; $j++) { + if($this->board[$i][$j] == 0) { + $row = $i; + $col = $j; + $isEmpty = false; + break; + } + } + if(!$isEmpty) { + break; + } + } + if($isEmpty) { + return true; + } + for(int $n = 1; $n <= $this->size; $n++) { + if($this->isSafe($row, $col, $n)) { + $this->board[$row][$col] = $n; + if($this->solve()) { + return true; + } else { + $this->board[$row][$col] = 0; + } + } + } + return false; + } + +} + +class Program { + + void main() { + int[] $board = { + {3, 0, 6, 5, 0, 8, 4, 0, 0}, + {5, 2, 0, 0, 0, 0, 0, 0, 0}, + {0, 8, 7, 0, 0, 0, 0, 3, 1}, + {0, 0, 3, 0, 1, 0, 0, 8, 0}, + {9, 0, 0, 8, 6, 3, 0, 0, 5}, + {0, 5, 0, 0, 9, 0, 6, 0, 0}, + {1, 3, 0, 0, 0, 0, 2, 5, 0}, + {0, 0, 0, 0, 0, 0, 0, 7, 4}, + {0, 0, 5, 2, 0, 6, 3, 0, 0} + }; + object $sudoku = new Sudoku($board); + $sudoku->print(); + print("=================\n"); + if($sudoku->solve()) { + $sudoku->print(); + } else { + print("No solution found\n"); + $sudoku->print(); + } + } + +} diff --git a/tests/sudoku_solver.exp b/tests/sudoku_solver.exp new file mode 100644 index 0000000..9a6e871 --- /dev/null +++ b/tests/sudoku_solver.exp @@ -0,0 +1,19 @@ +3 0 6 5 0 8 4 0 0 +5 2 0 0 0 0 0 0 0 +0 8 7 0 0 0 0 3 1 +0 0 3 0 1 0 0 8 0 +9 0 0 8 6 3 0 0 5 +0 5 0 0 9 0 6 0 0 +1 3 0 0 0 0 2 5 0 +0 0 0 0 0 0 0 7 4 +0 0 5 2 0 6 3 0 0 +================= +3 1 6 5 7 8 4 9 2 +5 2 9 1 3 4 7 6 8 +4 8 7 6 2 9 5 3 1 +2 6 3 4 1 5 9 8 7 +9 7 4 8 6 3 1 2 5 +8 5 1 7 9 2 6 4 3 +1 3 8 9 4 7 2 5 6 +6 9 2 3 5 1 8 7 4 +7 4 5 2 8 6 3 1 9