diff options
-rw-r--r-- | day11 | 10 | ||||
-rw-r--r-- | day11.bqn | 14 | ||||
-rw-r--r-- | day11.clj | 51 |
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 |