diff options
author | Leah Neukirchen <leah@vuxu.org> | 2020-12-22 14:10:11 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2020-12-22 14:10:11 +0100 |
commit | 4878c6f4efbeaccfd588d166267357404273cef2 (patch) | |
tree | 8b89dfa834e22c99539a79c7928acd60f01ff1e6 /day21.clj | |
parent | 9d5dc149e62a16a73d2c8371eac307807da7ecd0 (diff) | |
download | adventofcode2020-4878c6f4efbeaccfd588d166267357404273cef2.tar.gz adventofcode2020-4878c6f4efbeaccfd588d166267357404273cef2.tar.xz adventofcode2020-4878c6f4efbeaccfd588d166267357404273cef2.zip |
day21
Diffstat (limited to 'day21.clj')
-rw-r--r-- | day21.clj | 54 |
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" |