Compare commits
4 Commits
b89c7ce3f2
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4480066b7 | ||
| 56738fd7f9 | |||
| b62c9346f5 | |||
| 505453974b |
@@ -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
@@ -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 +))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user