From 76030247711a51f1a0d6545d47db0a7b63622a6d Mon Sep 17 00:00:00 2001 From: James Raikes Date: Sun, 1 Oct 2017 19:49:55 +0100 Subject: [PATCH] Completed all --- .travis.yml | 4 +- src/sudoku.clj | 99 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 83 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index 455f3c0..45c29f6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: clojure -lein: lein2 -script: lein2 midje :config .midje-grading-config.clj +lein: lein +script: lein midje :config .midje-grading-config.clj jdk: - openjdk7 notifications: diff --git a/src/sudoku.clj b/src/sudoku.clj index 5254c46..1c2f381 100644 --- a/src/sudoku.clj +++ b/src/sudoku.clj @@ -3,56 +3,119 @@ (def board identity) +(def all-values #{1 2 3 4 5 6 7 8 9}) + +;(def sudoku-board +; (board [[5 3 0 0 7 0 0 0 0] +; [6 0 0 1 9 5 0 0 0] +; [0 9 8 0 0 0 0 6 0] +; [8 0 0 0 6 0 0 0 3] +; [4 0 0 8 0 3 0 0 1] +; [7 0 0 0 2 0 0 0 6] +; [0 6 0 0 0 0 2 8 0] +; [0 0 0 4 1 9 0 0 5] +; [0 0 0 0 8 0 0 7 9]])) +; +;(def solved-board +; (board [[5 3 4 6 7 8 9 1 2] +; [6 7 2 1 9 5 3 4 8] +; [1 9 8 3 4 2 5 6 7] +; [8 5 9 7 6 1 4 2 3] +; [4 2 6 8 5 3 7 9 1] +; [7 1 3 9 2 4 8 5 6] +; [9 6 1 5 3 7 2 8 4] +; [2 8 7 4 1 9 6 3 5] +; [3 4 5 2 8 6 1 7 9]])) +; +;(def invalid-board +; (board [[5 3 4 6 7 8 9 1 1] +; [6 7 2 1 9 5 3 4 8] +; [1 9 8 3 4 2 5 6 7] +; [8 5 9 7 6 1 4 2 3] +; [4 2 6 8 5 3 7 9 1] +; [7 1 3 9 2 4 8 5 6] +; [9 6 1 5 3 7 2 8 4] +; [2 8 7 4 1 9 6 3 5] +; [3 4 5 2 8 6 1 7 9]])) + (defn value-at [board coord] - nil) + (get-in board coord)) (defn has-value? [board coord] - nil) + (not= 0 (value-at board coord))) (defn row-values [board coord] - nil) + (let [[row _] coord] + (set (get board row)))) (defn col-values [board coord] - nil) + (let [[_ col] coord] + (set (for [row board] + (get row col))))) (defn coord-pairs [coords] - nil) + (vec (for [row coords + col coords] + [row col]))) (defn block-values [board coord] - nil) + (let [square-coords (coord-pairs [0 1 2]) + block-corner (mapv #(- % (mod % 3)) coord)] + (set (map #(value-at board (map + block-corner %)) square-coords)))) (defn valid-values-for [board coord] - nil) + (if (has-value? board coord) + #{} + (set/difference all-values (set/union (row-values board coord) + (col-values board coord) + (block-values board coord))))) (defn filled? [board] - nil) + (every? #(every? pos? %) board)) + +(defn valid-set? [a-set] + (= all-values a-set)) (defn rows [board] - nil) + (mapv #(row-values board [% 0]) (range 9))) (defn valid-rows? [board] - nil) + (every? valid-set? (rows board))) (defn cols [board] - nil) + (mapv #(col-values board [0 %]) (range 9))) (defn valid-cols? [board] - nil) + (every? valid-set? (cols board))) (defn blocks [board] - nil) + (map #(block-values board %) (coord-pairs [0 3 6]))) (defn valid-blocks? [board] - nil) + (every? valid-set? (blocks board))) (defn valid-solution? [board] - nil) + (every? identity ((juxt valid-cols? valid-rows? valid-blocks?) board))) (defn set-value-at [board coord new-value] - nil) + (assoc-in board coord new-value)) (defn find-empty-point [board] - nil) + (let [row (first (keep-indexed #(when (some zero? %2) %1) board)) + col (first (keep-indexed #(when (zero? %2) %1) (get board row)))] + [row col])) + +;(defn solver-helper) (defn solve [board] - nil) + (if (filled? board) + (if (valid-solution? board) + board + '()) + (let [gap (find-empty-point board)] + (for [guess (valid-values-for board gap) + solution (solve (set-value-at board gap guess))] + solution)))) + + +