about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2021-12-12 01:50:27 +0100
committerLeah Neukirchen <leah@vuxu.org>2021-12-12 01:50:27 +0100
commit5ff78d12414b9c756fab419896cbc4d561188080 (patch)
treeaa21fedeb23ab1e457ad9f1e78857851d5717fb6
parent0f872eb46fac8b9835c8ae2b39c084404b05663c (diff)
downloadadventofcode2021-5ff78d12414b9c756fab419896cbc4d561188080.tar.gz
adventofcode2021-5ff78d12414b9c756fab419896cbc4d561188080.tar.xz
adventofcode2021-5ff78d12414b9c756fab419896cbc4d561188080.zip
day11
-rw-r--r--day1110
-rw-r--r--day11.bqn14
-rw-r--r--day11.clj51
3 files changed, 75 insertions, 0 deletions
diff --git a/day11 b/day11
new file mode 100644
index 0000000..95f25a9
--- /dev/null
+++ b/day11
@@ -0,0 +1,10 @@
+4781623888
+1784156114
+3265645122
+4371551414
+3377154886
+7882314455
+6421348681
+7175424287
+5488242184
+2448568261
diff --git a/day11.bqn b/day11.bqn
new file mode 100644
index 0000000..03d4dcd
--- /dev/null
+++ b/day11.bqn
@@ -0,0 +1,14 @@
+While ← {𝕩{π”½βŸπ”Ύβˆ˜π”½_𝕣_π”Ύβˆ˜π”½βŸπ”Ύπ•©}𝕨@}Β΄
+d←>'0'-Λœβ€’FLines"day11"
+
+Step ← {
+  g←f←0Γ— x←𝕩+1
+  While {𝕀 β‹„ f β‰’ f ∨ g ↩ (Β¬f) ∧ x>9 }β€Ώ{𝕀
+    x +↩ (+Β΄+˝)βŽ‰2 3β€Ώ3↕{βŒ½β‰0βˆΎΛ˜π•©}⍟4 g
+    f βˆ¨β†© g
+  }
+  x Γ— Β¬f∨g
+}
+
+β€’Out +Β΄{+Β΄β₯Š0=𝕩}Β¨ Step⍟(↕101) d
+β€’Out 0 {∧´0=β₯Šπ•© ? 𝕨 ; (𝕨+1) π•Š Step 𝕩} d
diff --git a/day11.clj b/day11.clj
new file mode 100644
index 0000000..0b34170
--- /dev/null
+++ b/day11.clj
@@ -0,0 +1,51 @@
+(ns org.vuxu.aoc2021.day11
+  (:require [clojure.string :as str]
+            [clojure.set :as set]))
+
+;; attribution: https://www.reddit.com/r/adventofcode/comments/rds32p/2021_day_11_solutions/ho4d867/
+
+(defn parse-digit [char]
+  (Character/digit char 10))
+
+(def data
+  (->> (slurp "day11")
+       (str/split-lines)
+       (mapv (partial mapv parse-digit))))
+
+(def datamap
+  (zipmap (for [x (range (count data))
+                y (range (count (data x)))]
+            [x y])
+          (flatten data)))
+
+(defn neighbours [[x y]]
+  (for [dx [-1 0 1]
+        dy [-1 0 1]
+        :when (< -1 (+ x dx) (count data))
+        :when (< -1 (+ y dy) (count (first data)))]
+    [(+ x dx) (+ y dy)]))
+
+(defn trigger [flashed grid]
+  (let [flashing (set/difference
+                  (set (map first (filter (fn [[k v]] (> v 9)) grid)))
+                  flashed)
+        new-grid (reduce (fn [g p] (update g p inc))
+                         grid
+                         (mapcat neighbours flashing))]
+    (if (empty? flashing)
+      [flashed grid]
+      (trigger (set/union flashed flashing) new-grid))))
+
+(defn step [[_ grid]]
+  (let [[flashed updated] (trigger #{} (update-vals grid inc))]
+    [(count flashed)
+     (apply merge updated (map #(vector % 0) flashed))]))
+
+(def part1
+  (apply + (take 101 (map first (iterate step [0 datamap])))))
+;; => 1713
+
+(def part2
+  (count (take-while #(< % (* (count data) (count (first data))))
+                     (map first (iterate step [0 datamap])))))
+;; => 502