From e2d0320f3e2e694da27f9a391cc6616b34a09b1c Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Sun, 20 Dec 2020 14:10:47 +0100 Subject: day19 --- day19.clj | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 day19.clj (limited to 'day19.clj') diff --git a/day19.clj b/day19.clj new file mode 100644 index 0000000..74c78fe --- /dev/null +++ b/day19.clj @@ -0,0 +1,40 @@ +(let [[r m] (clojure.string/split (slurp "day19") #"\n\n")] + (def rules (clojure.string/split-lines r)) + (def messages (clojure.string/split-lines m))) + +(def rules + (into {} + (map (fn [rule] + (let [[id r] (clojure.string/split rule #": *") + rs (clojure.string/split r #" *\| *") + rss (map #(clojure.string/split % #" ") rs) + rsp (map (partial map #(case % + ("\"a\"" "\"b\"") (second %) + (read-string %))) rss)] + {(read-string id) rsp})) + rules))) + +(defn lookup [rules id depth] + (if (> depth 15) + "NEVER" + (if (char? id) + id + (let [v (rules id)] + (str "(" + (clojure.string/join + "|" + (map (fn [a] + (clojure.string/join + (map #(lookup rules % (inc depth)) a))) v)) + ")"))))) + +(let [pattern (re-pattern (lookup rules 0 0))] + (count (filter (partial re-matches pattern) messages))) +;; => 126 + +(let [rules2 (into rules + [[8 '((42) (42 8))] + [11 '((42 31) (42 11 31))]]) + pattern (re-pattern (lookup rules2 0 0))] + (count (filter (partial re-matches pattern) messages))) +;; => 282 -- cgit 1.4.1