about summary refs log tree commit diff
path: root/day19.clj
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2020-12-20 14:10:47 +0100
committerLeah Neukirchen <leah@vuxu.org>2020-12-20 14:10:47 +0100
commite2d0320f3e2e694da27f9a391cc6616b34a09b1c (patch)
treee08d56ae222f95985b2d545f92b8176ca14284f5 /day19.clj
parent7d40e89b5f28a859cd082a8d6af1ab46b02bd610 (diff)
downloadadventofcode2020-e2d0320f3e2e694da27f9a391cc6616b34a09b1c.tar.gz
adventofcode2020-e2d0320f3e2e694da27f9a391cc6616b34a09b1c.tar.xz
adventofcode2020-e2d0320f3e2e694da27f9a391cc6616b34a09b1c.zip
day19
Diffstat (limited to 'day19.clj')
-rw-r--r--day19.clj40
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