about summary refs log tree commit diff
path: root/day21.clj
diff options
context:
space:
mode:
Diffstat (limited to 'day21.clj')
-rw-r--r--day21.clj54
1 files changed, 54 insertions, 0 deletions
diff --git a/day21.clj b/day21.clj
new file mode 100644
index 0000000..0ad8fc4
--- /dev/null
+++ b/day21.clj
@@ -0,0 +1,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"