22 lines
612 B
Clojure
22 lines
612 B
Clojure
(def blocks
|
|
(-> "BO XK DQ CP NA GT RE TG QD FS JW HU VI AN OB ER FS LY PC ZM" (.split " ") vec))
|
|
|
|
(defn omit
|
|
"return bs with (one instance of) b omitted"
|
|
[bs b]
|
|
(let [[before after] (split-with #(not= b %) bs)]
|
|
(concat before (rest after))))
|
|
|
|
(defn abc
|
|
"return lazy sequence of solutions (i.e. block lists)"
|
|
[blocks [c & cs]]
|
|
(if (some? c)
|
|
(for [b blocks :when (some #(= c %) b)
|
|
bs (abc (omit blocks b) cs)]
|
|
(cons b bs))
|
|
[[]]))
|
|
|
|
|
|
(doseq [word ["A" "BARK" "Book" "treat" "COMMON" "SQUAD" "CONFUSE"]]
|
|
(->> word .toUpperCase (abc blocks) first (printf "%s: %b\n" word)))
|