-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path140-veitch-please.clj
36 lines (36 loc) · 1.74 KB
/
140-veitch-please.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(fn [algebra]
(letfn [(union [s1 s2]
(set (filter (complement nil?) (map #(if (s1 %) %) s2))))
(step [algebra]
(let [r (set (flatten (map
(fn [line]
(let [m (map
#(set (conj
(remove #{%} line)
(case (str %)
"a" 'A
"A" 'a
"b" 'B
"B" 'b
"c" 'C
"C" 'c
"d" 'D
"D" 'd)))
line)
s (filter (complement nil?) (map #(if (algebra %) (union line %)) m))]
(if (seq s) s line)))
algebra)))]
(if (not= r algebra) (step r) algebra)))
(power-set [s]
(set (reduce #(concat %1 (map (fn [i] (set (conj i %2))) %1)) #{#{}} s)))]
(let [ps (power-set (step algebra))]
(apply
(partial min-key count)
(filter
(complement nil?)
(map
(fn [s]
(let [r (set (mapcat (fn [e] (filter (fn [line] (every? #(line %) e)) algebra)) s))]
(if (= r algebra) s))
)
ps))))))