aboutsummaryrefslogtreecommitdiffstats
path: root/AoC2022/aocclj
diff options
context:
space:
mode:
Diffstat (limited to 'AoC2022/aocclj')
-rw-r--r--AoC2022/aocclj/src/aocclj/day05.clj38
-rw-r--r--AoC2022/aocclj/test/aocclj/core_test.clj7
2 files changed, 45 insertions, 0 deletions
diff --git a/AoC2022/aocclj/src/aocclj/day05.clj b/AoC2022/aocclj/src/aocclj/day05.clj
new file mode 100644
index 0000000..09317a8
--- /dev/null
+++ b/AoC2022/aocclj/src/aocclj/day05.clj
@@ -0,0 +1,38 @@
+(ns aocclj.day05
+ (:require [clojure.string :as str]))
+
+(defn parse-instruction [line]
+ (->> (re-seq #"\d+" line)
+ (map parse-long)
+ (apply (fn [move from to]
+ [move (dec from) (dec to)]))))
+
+(defn parse-input [input]
+ (let [[stacks instructions] (str/split input #"\n\n")]
+ {:stacks
+ (mapv
+ (fn [col] (filter #(not= % \space) col))
+ (apply mapv vector
+ (map (comp (partial map second)
+ (partial partition-all 4))
+ (butlast (str/split-lines stacks)))))
+ :instructions
+ (map parse-instruction (str/split-lines instructions))}))
+
+(defn mover [f stacks [amount from to]]
+ (let [stuff (f (take amount (get stacks from)))]
+ (-> stacks
+ (update to #(apply conj % stuff))
+ (update from (partial drop amount)))))
+
+(defn solver [single? input]
+ (let [{:keys [stacks instructions]}
+ (parse-input input)]
+ (->>
+ (reduce
+ (partial mover (if single? identity reverse))
+ stacks
+ instructions)
+ (map first)
+ (apply str))))
+
diff --git a/AoC2022/aocclj/test/aocclj/core_test.clj b/AoC2022/aocclj/test/aocclj/core_test.clj
index c42285f..38e4f72 100644
--- a/AoC2022/aocclj/test/aocclj/core_test.clj
+++ b/AoC2022/aocclj/test/aocclj/core_test.clj
@@ -4,6 +4,7 @@
[aocclj.day02 :as day02]
[aocclj.day03 :as day03]
[aocclj.day04 :as day04]
+ [aocclj.day05 :as day05]
[aocclj.core :refer :all]
[clojure.string :as str]))
@@ -30,3 +31,9 @@
(are [expected function] (= expected (day04/solver function input))
515 day04/subcontained
883 day04/overlap)))
+
+(deftest day05
+ (let [input (slurp "../05/input")]
+ (are [expected single] (= expected (day05/solver single input))
+ "TPGVQPFDH" true
+ "DMRDFRHHH" false)))