Skip to content

Instantly share code, notes, and snippets.

@rm-hull rm-hull/sudoku.cljs forked from swannodette/gist:3217582
Last active Dec 24, 2015

Embed
What would you like to do?
(ns sudoku
;(:refer-clojure :exclude [==])
(:require-macros [cljs.core.logic.macros :as m])
(:use [cljs.core.logic :only [everyg infd distinctfd]]))
(defn get-square [rows x y]
(for [x (range x (+ x 3))
y (range y (+ y 3))]
(get-in rows [x y])))
(defn init [vars hints]
(if (seq vars)
(let [hint (first hints)]
(all
(if-not (zero? hint)
(== (first vars) hint)
succeed)
(init (next vars) (next hints))))
succeed))
(defn sudokufd [hints]
(let [vars (repeatedly 81 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))]
(m/run 1 [q]
(== q vars)
(everyg #(infd % (domain 1 2 3 4 5 6 7 8 9)) vars)
(init vars hints)
(everyg distinctfd rows)
(everyg distinctfd cols)
(everyg distinctfd sqs))))
;; ====
(println
(sudokufd
[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])
)
@rm-hull

This comment has been minimized.

Copy link
Owner Author

commented Oct 3, 2013

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.