Skip to content

Instantly share code, notes, and snippets.

@aamedina
Created November 19, 2013 17:01
Show Gist options
  • Select an option

  • Save aamedina/7548675 to your computer and use it in GitHub Desktop.

Select an option

Save aamedina/7548675 to your computer and use it in GitHub Desktop.
(defn get-square [rows x y]
(for [x (range x (core/+ x 3))
y (range y (core/+ y 3))]
(get-in rows [x y])))
(defn init [vars hints]
(if (seq vars)
(let [hint (first hints)]
(all
(if-not (zero? hint)
(l/== (first vars) hint)
l/succeed)
(init (next vars) (next hints))))
l/succeed))
(defn sudokufd [hints]
(let [vars (repeatedly 81 l/lvar)
rows (->> vars (partition 9) (map vec) (into []))
cols (apply map vector rows)
sqs (for [x (range 0 9 3)
y (range 0 9 3)]
(get-square rows x y))]
(run 1 [q]
(init vars hints)
(l/== q vars)
(l/everyg #(in % (domain 1 2 3 4 5 6 7 8 9)) vars)
(l/everyg distinct rows)
(l/everyg distinct cols)
(l/everyg distinct sqs)
)))
(comment
(simple-benchmark
[hints [0 0 3 0 2 0 6 0 0
9 0 0 3 0 5 0 0 1
0 0 1 8 0 6 4 0 0
0 0 8 1 0 2 9 0 0
7 0 0 0 0 0 0 0 8
0 0 6 7 0 8 2 0 0
0 0 2 6 0 9 5 0 0
8 0 0 2 0 3 0 0 9
0 0 5 0 1 0 3 0 0]]
(doall (sudokufd hints)) 1))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment