Files
advent-of-code-2024/clojure/src/question_3.clj
T

53 lines
1.5 KiB
Clojure

(ns question-3
(:require [inputs]))
(def mock-input "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))")
(def mock-input-2 "xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))")
(defn get-instructions [input]
(->> input
(re-seq #"(don't\(\))|(do\(\))|(mul\(\d{0,3},\d{0,3}\))")
(map first)))
(defn parse-mul-instruction [mul-instruction]
(let [re #"\w+\((\w+),\s*(\w+)\)"
groups (re-matches re mul-instruction)]
(map parse-long (rest groups))))
(defn process-in-do [xf]
(let [prev (volatile! true)]
(fn
([] (xf))
([result] (xf result))
([result input]
(let [in-do? @prev]
(case input
"do()" (vreset! prev true)
"don't()" (vreset! prev false)
(when in-do? (xf result input))))))))
(defn question-3-a [input]
(let [instructions (get-instructions input)
xf (comp
(map parse-mul-instruction)
(filter seq?)
(map #(apply * %)))]
(transduce xf + 0 instructions)))
(defn question-3-b [input]
(let [instructions (get-instructions input)
xf (comp
process-in-do
(map parse-mul-instruction)
(map #(apply * %)))
products (sequence xf instructions)] ;; for some reason the transduce function throws an exception
(reduce + 0 products)))
(defn -main []
(println "Solution to question 3-a is: " (question-3-a inputs/question-3))
(println "Solution to question 3-b is: " (question-3-b inputs/question-3)))