blob: 0ad8fc4ca806142ea7329f9881c956ef2d78b8e0 (
plain) (
blame)
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
(def data
(->> (slurp "day21")
clojure.string/split-lines
(map #(clojure.string/split % #"\(contains "))
(map (fn [[f a]]
[(clojure.string/split f #" ")
(clojure.string/split a #"[,)]+ *")]))))
(def food
(->> data
(map (fn [[f a]]
(for [sa a]
{sa [(set f)]})))
(apply concat)
(apply merge-with concat)))
(def recipes
(->> data
(map first)
flatten))
(defn find-allergens [confirmed]
(->> (for [[k v] food
:when (not (confirmed k))
]
(let [i (reduce clojure.set/intersection v)]
(if (= 1 (count i))
[k (first i)]
(let [d (clojure.set/difference i (set (vals confirmed)))]
(if (= 1 (count d))
[k (first d)]
nil)))))
(remove nil?)
(into {})
(merge confirmed)))
(defn fix [l]
(reduce #(if (= %1 %2) (reduced %1) %2) l))
(def allergens
(->> {}
(iterate find-allergens)
fix))
(count
(filter (->> allergens vals set complement) recipes))
;; => 2627
(->> allergens
keys
sort
(map allergens)
(clojure.string/join ","))
;; => "hn,dgsdtj,kpksf,sjcvsr,bstzgn,kmmqmv,vkdxfj,bsfqgb"
|