refactor day 03
This commit is contained in:
+19
-25
@@ -1,37 +1,31 @@
|
|||||||
(ns day03
|
(ns day03
|
||||||
(:require [core :as c]
|
(:require [input-manager]
|
||||||
[input-manager :refer [get-input]]
|
|
||||||
[clojure.string :as str]))
|
[clojure.string :as str]))
|
||||||
|
|
||||||
(def input (str/join (get-input 3)))
|
(def input (input-manager/get-input-raw 2024 3))
|
||||||
|
|
||||||
(defn parse-muls
|
(defn compute-muls [s]
|
||||||
"takes in a string containing mul instructions
|
(map (comp #(reduce * %)
|
||||||
returns list of parsed integral multiplication results"
|
#(map parse-long %)
|
||||||
[s]
|
#(str/split % #",")
|
||||||
(->> (c/get-match-groups #"mul\((\d{1,3}),(\d{1,3})\)" s)
|
#(subs % 4 (dec (count %)))) ;; remove `mul(` prefix and `)` suffix
|
||||||
(map #(map parse-long %))
|
s))
|
||||||
(map #(reduce * %))))
|
|
||||||
|
(defn enforce-toggles [[el & rst]]
|
||||||
|
(cond (= el "do()") (recur rst)
|
||||||
|
(= el "don't()") (recur (drop-while #(not= % "do()") rst))
|
||||||
|
el (cons el (lazy-seq (enforce-toggles rst)))))
|
||||||
|
|
||||||
;; part 1
|
;; part 1
|
||||||
(->> input
|
(->> input
|
||||||
parse-muls
|
(re-seq #"mul\(\d{1,3},\d{1,3}\)")
|
||||||
|
compute-muls
|
||||||
(reduce +))
|
(reduce +))
|
||||||
|
|
||||||
;; part 2
|
;; part 2
|
||||||
(->> input
|
(->> input
|
||||||
(c/re-pos #"mul\((\d{1,3}),(\d{1,3})\)|(do\(\))|(don't\(\))")
|
(re-seq #"mul\(\d{1,3},\d{1,3}\)|do\(\)|don't\(\)")
|
||||||
(sort-by key)
|
enforce-toggles
|
||||||
(reduce
|
compute-muls
|
||||||
(fn [acc [_idx instr]]
|
(reduce +))
|
||||||
(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)
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user