diff options
author | Leah Neukirchen <leah@vuxu.org> | 2020-12-20 14:10:47 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2020-12-20 14:10:47 +0100 |
commit | e2d0320f3e2e694da27f9a391cc6616b34a09b1c (patch) | |
tree | e08d56ae222f95985b2d545f92b8176ca14284f5 /day19.clj | |
parent | 7d40e89b5f28a859cd082a8d6af1ab46b02bd610 (diff) | |
download | adventofcode2020-e2d0320f3e2e694da27f9a391cc6616b34a09b1c.tar.gz adventofcode2020-e2d0320f3e2e694da27f9a391cc6616b34a09b1c.tar.xz adventofcode2020-e2d0320f3e2e694da27f9a391cc6616b34a09b1c.zip |
day19
Diffstat (limited to 'day19.clj')
-rw-r--r-- | day19.clj | 40 |
1 files changed, 40 insertions, 0 deletions
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 |