aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2022-12-05 19:59:26 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2022-12-05 20:00:09 +0200
commit2b46b81a517e6d0f1ebba3642c6950a58f9b5d1e (patch)
treeadaf30dde47a60cfb2e2bbab97ec239ae07c015a /src
parent686339d1fae622df20fa73b72b632ca3cb7fd7be (diff)
Solve day05
Diffstat (limited to 'src')
-rw-r--r--src/aoc_2022/day05.clj74
-rw-r--r--src/aoc_2022/utils.clj3
2 files changed, 72 insertions, 5 deletions
diff --git a/src/aoc_2022/day05.clj b/src/aoc_2022/day05.clj
index fcfda0b..9b07a16 100644
--- a/src/aoc_2022/day05.clj
+++ b/src/aoc_2022/day05.clj
@@ -1,10 +1,74 @@
(ns aoc-2022.day05)
(require '[aoc-2022.utils :refer :all])
-(def task1
- (chain))
+(defn split-by-empty-line [rows]
+ (split-by "" rows))
-(def task2
- (chain))
+(defn revv [v] (vec (rseq v)))
-(run-aoc "day05" task1 task2)
+(defn parse-stacks [stacks]
+ (->> stacks
+ transpose
+ (keep-indexed #(if (zero? (mod (- %1 1) 4)) %2 nil))
+ (map #(filter (partial not= \ ) %))
+ (map #(drop-last %))
+ (map vec)))
+
+(defn parse-instrs [instrs]
+ (->> instrs
+ (map #(split-by \ %))
+ (map (partial keep-indexed #(if (odd? %1) (apply str %2) nil)))
+ (map (partial map to-long))
+ (map vec)
+ ))
+
+(defn prepare [rows]
+ (let [[stack-rows instr-rows] (split-by-empty-line rows)
+ stacks (parse-stacks stack-rows)
+ instrs (parse-instrs instr-rows)]
+ (list (vec stacks) (vec instrs))))
+
+(defn run-instr1 [[n from to] stacks]
+ (if (zero? n)
+ stacks
+ (let [from-stack (stacks (dec from))
+ to-stack (stacks (dec to))
+ val (first from-stack)
+ new-from-stack (vec (rest from-stack))
+ new-to-stack (vec (cons val to-stack))
+ new-stacks' (assoc stacks (dec from) new-from-stack)
+ new-stacks (assoc new-stacks' (dec to) new-to-stack)]
+ (run-instr1 [(dec n) from to] new-stacks))))
+
+(defn run-instrs1 [[instr & is] stacks]
+ (if (seq instr)
+ (run-instrs1 (vec is) (run-instr1 instr stacks))
+ stacks))
+
+(defn task1 [rows]
+ (let [[stacks instrs] (prepare rows)]
+ (->> (run-instrs1 instrs stacks)
+ (map first)
+ (apply str))))
+
+(defn run-instr2 [[n from to] stacks]
+ (let [from-stack (stacks (dec from))
+ to-stack (stacks (dec to))
+ vals (vec (take n from-stack))
+ new-from-stack (vec (drop n from-stack))
+ new-to-stack (vec (concat vals to-stack))
+ new-stacks' (assoc stacks (dec from) new-from-stack)]
+ (assoc new-stacks' (dec to) new-to-stack)))
+
+(defn run-instrs2 [[instr & is] stacks]
+ (if (seq instr)
+ (run-instrs2 (vec is) (run-instr2 instr stacks))
+ stacks))
+
+(defn task2 [rows]
+ (let [[stacks instrs] (prepare rows)]
+ (->> (run-instrs2 instrs stacks)
+ (map first)
+ (apply str))))
+
+(run-aoc "day05" task1 task2) \ No newline at end of file
diff --git a/src/aoc_2022/utils.clj b/src/aoc_2022/utils.clj
index c59d498..cfa9530 100644
--- a/src/aoc_2022/utils.clj
+++ b/src/aoc_2022/utils.clj
@@ -21,6 +21,9 @@
(def split-by #(split-by' %1 '() %2))
+(defn transpose [m]
+ (apply mapv vector m))
+
; Advent of Code specific
(defn read-aoc [day]