Compare commits

...

4 Commits

Author SHA1 Message Date
Adam Jeniski
e4480066b7 do day 3 2026-06-01 11:12:05 -04:00
56738fd7f9 Merge branch 'master' of git.ajet.fyi:ajet/advent-of-code 2026-05-15 09:39:52 -04:00
b62c9346f5 cons is for boomers 2026-05-13 07:55:24 -04:00
505453974b refactor day 03 2026-05-13 07:39:51 -04:00
2 changed files with 70 additions and 25 deletions
+51
View File
@@ -0,0 +1,51 @@
(ns day03
(:require input-manager))
(def input (parse-long (input-manager/get-input-raw 2017 3)))
(def directions [:right :up :left :down])
(def to-the-left {:right :up
:up :left
:down :right
:left :down})
(def cardinal-dir-offsets {:right [1 0]
:left [-1 0]
:down [0 -1]
:up [0 1]})
(def all-offsets #{[1 0] [-1 0] [0 -1] [0 1] [1 1] [-1 -1] [1 -1] [-1 1]})
(->> (loop [loc [1 0]
i 2
grid {[0 0] 1}
[dir :as dirs] (cycle directions)]
(if (< i input)
(let [left-loc (mapv + loc (cardinal-dir-offsets (to-the-left dir)))
grid' (assoc grid loc i)
i' (inc i)]
(if (contains? grid left-loc)
(recur (mapv + loc (cardinal-dir-offsets dir)) i' grid' dirs)
(recur left-loc i' grid' (rest dirs))))
loc))
(map abs)
(apply +))
(->> (loop [loc [1 0]
grid {[0 0] 1}
[dir :as dirs] (cycle directions)]
(let [left-loc (mapv + loc (cardinal-dir-offsets (to-the-left dir)))
value (->> all-offsets
(map (comp
#(or (grid %) 0)
#(mapv + % loc)))
(reduce +))
grid' (assoc grid loc value)]
(cond
(> value input)
value
(contains? grid left-loc)
(recur (mapv + loc (cardinal-dir-offsets dir)) grid' dirs)
:else
(recur left-loc grid' (rest dirs))))))
+19 -25
View File
@@ -1,37 +1,31 @@
(ns day03
(:require [core :as c]
[input-manager :refer [get-input]]
(:require [input-manager]
[clojure.string :as str]))
(def input (str/join (get-input 3)))
(def input (input-manager/get-input-raw 2024 3))
(defn parse-muls
"takes in a string containing mul instructions
returns list of parsed integral multiplication results"
[s]
(->> (c/get-match-groups #"mul\((\d{1,3}),(\d{1,3})\)" s)
(map #(map parse-long %))
(map #(reduce * %))))
(defn compute-muls [s]
(map (comp #(reduce * %)
#(map parse-long %)
#(str/split % #",")
#(subs % 4 (dec (count %)))) ;; remove `mul(` prefix and `)` suffix
s))
(defn enforce-toggles [[el & rst]]
(cond (= el "do()") (recur rst)
(= el "don't()") (recur (drop-while #(not= % "do()") rst))
el (conj (lazy-seq (enforce-toggles rst)) el)))
;; part 1
(->> input
parse-muls
(re-seq #"mul\(\d{1,3},\d{1,3}\)")
compute-muls
(reduce +))
;; part 2
(->> input
(c/re-pos #"mul\((\d{1,3}),(\d{1,3})\)|(do\(\))|(don't\(\))")
(sort-by key)
(reduce
(fn [acc [_idx instr]]
(cond
(.startsWith instr "mul") (if (:on acc)
(update acc :val
+ (->> instr parse-muls first))
acc)
(.startsWith instr "don't") (assoc acc :on false)
(.startsWith instr "do") (assoc acc :on true)))
{:on true
:val 0})
:val)
(re-seq #"mul\(\d{1,3},\d{1,3}\)|do\(\)|don't\(\)")
enforce-toggles
compute-muls
(reduce +))