Sudoku: Difference between revisions
Content deleted Content added
Line 152: | Line 152: | ||
See e.g. [http://www.techfinesse.com/game/sudoku_solver.php this GPLed solver] written in C. |
See e.g. [http://www.techfinesse.com/game/sudoku_solver.php this GPLed solver] written in C. |
||
=={{header|Clojure}}== |
|||
<lang clojure>(ns sudoku |
|||
(:use [clojure.contrib.math :only (sqrt)])) |
|||
(defn print-grid [grid] |
|||
(doseq [y (range (count grid))] |
|||
(doseq [x (range (count grid))] |
|||
(print (retrieve grid x y) " ")) |
|||
(println)) |
|||
(println)) |
|||
(defn retrieve [grid x y] |
|||
(get (get grid y) x)) |
|||
(defn store [grid x y n] |
|||
(assoc grid y (assoc (get grid y) x n))) |
|||
(defn coordinates [grid x y] |
|||
(let [n (sqrt (count grid)) |
|||
zx (* n (quot x n)) |
|||
zy (* n (quot y n))] |
|||
(for [x (range zx (+ zx n)) y (range zy (+ zy n))] |
|||
[x y]))) |
|||
(defn compatible? [grid x y n] |
|||
(or |
|||
(= n (retrieve grid x y)) |
|||
(and |
|||
(zero? (retrieve grid x y)) |
|||
(every? #(and (not= n (retrieve grid % y)) (not= n (retrieve grid x %))) (range (count grid))) |
|||
(every? #(not= n (retrieve grid (first %) (second %))) (coordinates grid x y))))) |
|||
(defn solve [grid x y] |
|||
(let [m (count grid)] |
|||
(if (= y m) |
|||
(print-grid grid) |
|||
(doseq [n (range 1 (inc m))] |
|||
(when (compatible? grid x y n) |
|||
(let [new-grid (store grid x y n)] |
|||
(if (= x (dec m)) |
|||
(solve new-grid 0 (inc y)) |
|||
(solve new-grid (inc x) y)))))))) |
|||
</lang> |
|||
<lang clojure>sudoku> (solve [[3 9 4 0 0 2 6 7 0] |
|||
[0 0 0 3 0 0 4 0 0] |
|||
[5 0 0 6 9 0 0 2 0] |
|||
[0 4 5 0 0 0 9 0 0] |
|||
[6 0 0 0 0 0 0 0 7] |
|||
[0 0 7 0 0 0 5 8 0] |
|||
[0 1 0 0 6 7 0 0 8] |
|||
[0 0 9 0 0 8 0 0 0] |
|||
[0 2 6 4 0 0 7 3 5]] |
|||
0 0) |
|||
3 9 4 8 5 2 6 7 1 |
|||
2 6 8 3 7 1 4 5 9 |
|||
5 7 1 6 9 4 8 2 3 |
|||
1 4 5 7 8 3 9 6 2 |
|||
6 8 2 9 4 5 3 1 7 |
|||
9 3 7 1 2 6 5 8 4 |
|||
4 1 3 5 6 7 2 9 8 |
|||
7 5 9 2 3 8 1 4 6 |
|||
8 2 6 4 1 9 7 3 5 |
|||
nil |
|||
</lang> |
|||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |
||