diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2022-12-05 19:59:26 +0200 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2022-12-05 20:00:09 +0200 |
| commit | 2b46b81a517e6d0f1ebba3642c6950a58f9b5d1e (patch) | |
| tree | adaf30dde47a60cfb2e2bbab97ec239ae07c015a /src | |
| parent | 686339d1fae622df20fa73b72b632ca3cb7fd7be (diff) | |
Solve day05
Diffstat (limited to 'src')
| -rw-r--r-- | src/aoc_2022/day05.clj | 74 | ||||
| -rw-r--r-- | src/aoc_2022/utils.clj | 3 |
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] |
