From 2b46b81a517e6d0f1ebba3642c6950a58f9b5d1e Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 5 Dec 2022 19:59:26 +0200 Subject: Solve day05 --- resources/day05_actual.txt | 514 +++++++++++++++++++++++++++++++++++++++++++++ resources/day05_sample.txt | 9 + src/aoc_2022/day05.clj | 74 ++++++- src/aoc_2022/utils.clj | 3 + 4 files changed, 595 insertions(+), 5 deletions(-) create mode 100644 resources/day05_actual.txt create mode 100644 resources/day05_sample.txt diff --git a/resources/day05_actual.txt b/resources/day05_actual.txt new file mode 100644 index 0000000..f3e1ad7 --- /dev/null +++ b/resources/day05_actual.txt @@ -0,0 +1,514 @@ + [S] [C] [Z] +[F] [J] [P] [T] [N] +[G] [H] [G] [Q] [G] [D] +[V] [V] [D] [G] [F] [D] [V] +[R] [B] [F] [N] [N] [Q] [L] [S] +[J] [M] [M] [P] [H] [V] [B] [B] [D] +[L] [P] [H] [D] [L] [F] [D] [J] [L] +[D] [T] [V] [M] [J] [N] [F] [M] [G] + 1 2 3 4 5 6 7 8 9 + +move 3 from 4 to 6 +move 1 from 5 to 8 +move 3 from 7 to 3 +move 4 from 5 to 7 +move 1 from 7 to 8 +move 3 from 9 to 4 +move 2 from 8 to 2 +move 4 from 4 to 5 +move 2 from 5 to 1 +move 2 from 5 to 6 +move 7 from 8 to 1 +move 9 from 3 to 9 +move 11 from 6 to 5 +move 2 from 6 to 7 +move 12 from 1 to 4 +move 10 from 2 to 9 +move 2 from 3 to 9 +move 1 from 7 to 5 +move 4 from 7 to 6 +move 2 from 6 to 1 +move 5 from 1 to 6 +move 10 from 9 to 1 +move 9 from 9 to 8 +move 13 from 4 to 3 +move 7 from 6 to 2 +move 2 from 8 to 5 +move 9 from 3 to 9 +move 8 from 9 to 8 +move 4 from 8 to 4 +move 1 from 7 to 5 +move 3 from 9 to 1 +move 7 from 2 to 1 +move 1 from 3 to 1 +move 1 from 3 to 6 +move 1 from 6 to 1 +move 2 from 3 to 6 +move 5 from 4 to 1 +move 1 from 6 to 1 +move 3 from 8 to 7 +move 8 from 8 to 4 +move 3 from 5 to 4 +move 1 from 6 to 7 +move 1 from 5 to 8 +move 4 from 5 to 2 +move 7 from 5 to 8 +move 3 from 2 to 7 +move 7 from 4 to 8 +move 11 from 8 to 4 +move 15 from 4 to 1 +move 25 from 1 to 6 +move 4 from 8 to 7 +move 1 from 2 to 4 +move 11 from 6 to 4 +move 12 from 6 to 3 +move 1 from 1 to 9 +move 1 from 9 to 8 +move 16 from 1 to 3 +move 1 from 8 to 7 +move 12 from 4 to 6 +move 9 from 6 to 5 +move 3 from 6 to 5 +move 6 from 7 to 5 +move 3 from 3 to 5 +move 2 from 6 to 3 +move 11 from 5 to 8 +move 2 from 8 to 3 +move 2 from 1 to 4 +move 7 from 3 to 1 +move 2 from 4 to 6 +move 2 from 6 to 2 +move 5 from 7 to 3 +move 1 from 1 to 6 +move 1 from 1 to 8 +move 2 from 2 to 5 +move 1 from 7 to 4 +move 1 from 1 to 2 +move 10 from 3 to 5 +move 11 from 3 to 6 +move 1 from 4 to 9 +move 1 from 9 to 4 +move 1 from 4 to 2 +move 2 from 5 to 9 +move 2 from 2 to 8 +move 2 from 1 to 6 +move 2 from 1 to 2 +move 2 from 3 to 6 +move 3 from 8 to 1 +move 3 from 1 to 4 +move 7 from 8 to 3 +move 2 from 9 to 5 +move 2 from 4 to 9 +move 7 from 5 to 6 +move 2 from 8 to 6 +move 1 from 4 to 8 +move 2 from 2 to 4 +move 21 from 6 to 3 +move 10 from 5 to 7 +move 7 from 7 to 6 +move 1 from 9 to 3 +move 1 from 4 to 9 +move 1 from 9 to 4 +move 1 from 8 to 4 +move 8 from 6 to 4 +move 1 from 4 to 5 +move 1 from 5 to 8 +move 4 from 3 to 6 +move 1 from 8 to 2 +move 1 from 4 to 2 +move 2 from 7 to 3 +move 2 from 2 to 7 +move 22 from 3 to 5 +move 4 from 6 to 2 +move 2 from 6 to 9 +move 7 from 3 to 9 +move 6 from 9 to 1 +move 18 from 5 to 3 +move 2 from 5 to 4 +move 20 from 3 to 5 +move 3 from 7 to 3 +move 5 from 1 to 2 +move 11 from 5 to 7 +move 1 from 1 to 7 +move 3 from 9 to 3 +move 16 from 5 to 8 +move 7 from 8 to 7 +move 1 from 9 to 2 +move 8 from 2 to 3 +move 2 from 2 to 4 +move 3 from 3 to 1 +move 9 from 3 to 8 +move 1 from 6 to 3 +move 9 from 7 to 3 +move 3 from 1 to 8 +move 1 from 7 to 9 +move 1 from 9 to 4 +move 1 from 7 to 5 +move 10 from 4 to 5 +move 2 from 4 to 2 +move 19 from 8 to 5 +move 1 from 8 to 3 +move 4 from 3 to 5 +move 2 from 4 to 8 +move 4 from 7 to 8 +move 4 from 3 to 9 +move 4 from 7 to 6 +move 2 from 2 to 5 +move 2 from 3 to 2 +move 6 from 8 to 7 +move 1 from 8 to 4 +move 2 from 6 to 4 +move 3 from 4 to 8 +move 3 from 9 to 2 +move 4 from 7 to 8 +move 28 from 5 to 8 +move 16 from 8 to 4 +move 11 from 8 to 4 +move 3 from 3 to 4 +move 7 from 5 to 8 +move 13 from 8 to 7 +move 1 from 5 to 6 +move 1 from 6 to 7 +move 1 from 9 to 2 +move 2 from 6 to 2 +move 12 from 4 to 9 +move 4 from 4 to 1 +move 2 from 9 to 8 +move 4 from 8 to 3 +move 3 from 4 to 5 +move 4 from 4 to 1 +move 4 from 4 to 7 +move 3 from 7 to 9 +move 5 from 9 to 7 +move 7 from 2 to 3 +move 1 from 5 to 7 +move 8 from 1 to 5 +move 1 from 2 to 4 +move 11 from 3 to 1 +move 10 from 5 to 3 +move 3 from 9 to 1 +move 3 from 9 to 6 +move 5 from 1 to 6 +move 7 from 6 to 9 +move 8 from 9 to 7 +move 9 from 3 to 4 +move 1 from 6 to 9 +move 8 from 7 to 1 +move 9 from 4 to 2 +move 2 from 1 to 6 +move 3 from 2 to 6 +move 4 from 4 to 6 +move 2 from 9 to 8 +move 2 from 1 to 2 +move 1 from 3 to 8 +move 2 from 8 to 4 +move 1 from 6 to 8 +move 11 from 1 to 6 +move 1 from 1 to 5 +move 3 from 2 to 9 +move 2 from 9 to 3 +move 1 from 1 to 7 +move 2 from 4 to 9 +move 4 from 2 to 9 +move 2 from 8 to 5 +move 10 from 6 to 1 +move 2 from 5 to 6 +move 5 from 9 to 8 +move 5 from 8 to 7 +move 1 from 2 to 1 +move 7 from 1 to 2 +move 2 from 9 to 4 +move 1 from 3 to 5 +move 15 from 7 to 2 +move 8 from 6 to 3 +move 2 from 4 to 3 +move 2 from 6 to 4 +move 4 from 7 to 1 +move 4 from 7 to 5 +move 1 from 6 to 4 +move 3 from 1 to 7 +move 5 from 7 to 6 +move 4 from 7 to 5 +move 18 from 2 to 4 +move 5 from 6 to 4 +move 4 from 1 to 2 +move 8 from 3 to 8 +move 2 from 8 to 4 +move 2 from 3 to 7 +move 1 from 5 to 7 +move 3 from 8 to 4 +move 2 from 7 to 2 +move 1 from 3 to 8 +move 9 from 2 to 6 +move 2 from 8 to 6 +move 1 from 7 to 3 +move 1 from 3 to 5 +move 3 from 6 to 8 +move 1 from 8 to 5 +move 1 from 5 to 9 +move 1 from 1 to 2 +move 5 from 4 to 6 +move 10 from 6 to 2 +move 5 from 2 to 6 +move 5 from 6 to 4 +move 1 from 6 to 3 +move 6 from 4 to 6 +move 3 from 2 to 6 +move 2 from 2 to 3 +move 11 from 4 to 6 +move 1 from 9 to 5 +move 4 from 6 to 7 +move 1 from 4 to 3 +move 12 from 4 to 3 +move 1 from 8 to 6 +move 9 from 5 to 7 +move 1 from 5 to 2 +move 1 from 8 to 5 +move 1 from 4 to 9 +move 9 from 7 to 9 +move 1 from 3 to 4 +move 2 from 3 to 6 +move 2 from 5 to 6 +move 2 from 8 to 5 +move 11 from 3 to 4 +move 2 from 3 to 1 +move 1 from 2 to 3 +move 1 from 3 to 8 +move 3 from 7 to 9 +move 5 from 4 to 2 +move 2 from 5 to 8 +move 6 from 4 to 2 +move 1 from 1 to 3 +move 12 from 9 to 1 +move 6 from 1 to 6 +move 1 from 8 to 4 +move 1 from 8 to 3 +move 5 from 2 to 7 +move 2 from 3 to 9 +move 5 from 7 to 1 +move 1 from 7 to 5 +move 2 from 9 to 1 +move 14 from 1 to 7 +move 2 from 4 to 7 +move 7 from 2 to 4 +move 1 from 2 to 1 +move 1 from 1 to 3 +move 1 from 5 to 4 +move 1 from 9 to 6 +move 16 from 6 to 5 +move 2 from 5 to 4 +move 12 from 6 to 8 +move 10 from 4 to 8 +move 9 from 7 to 3 +move 4 from 7 to 6 +move 11 from 5 to 8 +move 2 from 5 to 2 +move 14 from 8 to 9 +move 1 from 5 to 1 +move 3 from 9 to 4 +move 2 from 2 to 1 +move 7 from 8 to 3 +move 6 from 3 to 5 +move 8 from 9 to 8 +move 1 from 6 to 1 +move 1 from 4 to 2 +move 4 from 3 to 8 +move 1 from 7 to 2 +move 3 from 1 to 5 +move 2 from 5 to 7 +move 3 from 9 to 2 +move 1 from 1 to 8 +move 5 from 5 to 4 +move 2 from 7 to 8 +move 4 from 2 to 5 +move 1 from 2 to 4 +move 2 from 7 to 8 +move 4 from 6 to 2 +move 6 from 5 to 3 +move 1 from 6 to 5 +move 1 from 5 to 3 +move 1 from 3 to 8 +move 8 from 8 to 3 +move 9 from 8 to 5 +move 9 from 8 to 2 +move 2 from 8 to 9 +move 2 from 3 to 8 +move 5 from 5 to 8 +move 1 from 3 to 7 +move 2 from 9 to 5 +move 7 from 2 to 4 +move 14 from 4 to 6 +move 2 from 2 to 7 +move 1 from 7 to 3 +move 1 from 7 to 9 +move 3 from 5 to 2 +move 1 from 7 to 1 +move 3 from 2 to 4 +move 7 from 8 to 2 +move 3 from 6 to 1 +move 17 from 3 to 1 +move 2 from 8 to 3 +move 6 from 2 to 7 +move 2 from 7 to 9 +move 3 from 6 to 8 +move 2 from 8 to 6 +move 4 from 2 to 1 +move 3 from 4 to 7 +move 1 from 8 to 7 +move 1 from 8 to 9 +move 1 from 4 to 2 +move 3 from 5 to 7 +move 2 from 3 to 1 +move 2 from 3 to 5 +move 5 from 7 to 4 +move 5 from 7 to 3 +move 1 from 4 to 8 +move 3 from 3 to 1 +move 6 from 1 to 3 +move 1 from 7 to 5 +move 2 from 9 to 2 +move 3 from 5 to 8 +move 1 from 8 to 1 +move 8 from 3 to 5 +move 1 from 4 to 9 +move 3 from 6 to 5 +move 3 from 6 to 3 +move 2 from 3 to 7 +move 1 from 4 to 7 +move 3 from 6 to 4 +move 2 from 7 to 2 +move 1 from 7 to 8 +move 2 from 5 to 4 +move 1 from 6 to 1 +move 7 from 4 to 7 +move 7 from 5 to 2 +move 10 from 2 to 3 +move 3 from 2 to 6 +move 3 from 8 to 1 +move 1 from 8 to 7 +move 2 from 6 to 3 +move 1 from 6 to 9 +move 4 from 7 to 5 +move 16 from 1 to 5 +move 1 from 9 to 7 +move 3 from 7 to 6 +move 11 from 5 to 6 +move 2 from 7 to 9 +move 12 from 6 to 4 +move 2 from 6 to 9 +move 6 from 3 to 2 +move 1 from 5 to 7 +move 5 from 9 to 5 +move 1 from 9 to 6 +move 4 from 3 to 7 +move 1 from 4 to 2 +move 7 from 2 to 5 +move 3 from 5 to 2 +move 6 from 5 to 6 +move 3 from 2 to 6 +move 9 from 6 to 8 +move 5 from 5 to 9 +move 5 from 7 to 1 +move 4 from 1 to 9 +move 2 from 9 to 4 +move 1 from 6 to 7 +move 9 from 4 to 1 +move 7 from 5 to 9 +move 18 from 1 to 3 +move 9 from 9 to 5 +move 8 from 8 to 2 +move 1 from 2 to 5 +move 4 from 2 to 3 +move 4 from 9 to 6 +move 1 from 4 to 8 +move 2 from 5 to 7 +move 2 from 9 to 2 +move 10 from 3 to 9 +move 5 from 5 to 9 +move 1 from 7 to 2 +move 2 from 8 to 7 +move 2 from 3 to 5 +move 2 from 9 to 1 +move 2 from 7 to 3 +move 1 from 2 to 1 +move 5 from 5 to 8 +move 1 from 2 to 1 +move 15 from 3 to 6 +move 1 from 7 to 6 +move 10 from 6 to 5 +move 1 from 7 to 8 +move 4 from 1 to 6 +move 1 from 8 to 3 +move 2 from 1 to 5 +move 3 from 8 to 1 +move 1 from 4 to 6 +move 1 from 4 to 2 +move 4 from 9 to 7 +move 6 from 5 to 7 +move 3 from 1 to 9 +move 10 from 6 to 8 +move 2 from 1 to 3 +move 8 from 7 to 9 +move 1 from 9 to 6 +move 2 from 7 to 9 +move 3 from 3 to 5 +move 1 from 2 to 6 +move 2 from 6 to 5 +move 5 from 9 to 4 +move 4 from 8 to 2 +move 1 from 1 to 3 +move 4 from 5 to 9 +move 3 from 6 to 1 +move 2 from 1 to 5 +move 3 from 5 to 2 +move 8 from 8 to 3 +move 11 from 9 to 4 +move 13 from 4 to 8 +move 2 from 9 to 2 +move 2 from 3 to 1 +move 1 from 4 to 1 +move 1 from 3 to 8 +move 2 from 6 to 9 +move 7 from 8 to 1 +move 3 from 2 to 5 +move 7 from 2 to 5 +move 3 from 4 to 6 +move 4 from 9 to 2 +move 2 from 3 to 5 +move 9 from 5 to 6 +move 5 from 2 to 7 +move 2 from 9 to 2 +move 2 from 9 to 7 +move 12 from 6 to 8 +move 5 from 5 to 7 +move 1 from 9 to 8 +move 3 from 1 to 6 +move 5 from 5 to 8 +move 6 from 1 to 9 +move 2 from 1 to 5 +move 1 from 6 to 9 +move 5 from 9 to 7 +move 2 from 5 to 8 +move 11 from 7 to 6 +move 20 from 8 to 1 +move 2 from 9 to 8 +move 4 from 7 to 6 +move 6 from 8 to 3 +move 13 from 6 to 9 +move 4 from 3 to 2 +move 4 from 6 to 3 +move 2 from 3 to 6 +move 5 from 9 to 8 +move 2 from 7 to 1 +move 2 from 6 to 9 +move 6 from 8 to 3 +move 6 from 3 to 6 +move 5 from 2 to 9 +move 22 from 1 to 3 +move 3 from 2 to 1 +move 5 from 9 to 3 +move 1 from 1 to 6 +move 3 from 6 to 2 +move 1 from 2 to 4 +move 33 from 3 to 5 +move 1 from 8 to 7 diff --git a/resources/day05_sample.txt b/resources/day05_sample.txt new file mode 100644 index 0000000..84933bb --- /dev/null +++ b/resources/day05_sample.txt @@ -0,0 +1,9 @@ + [D] +[N] [C] +[Z] [M] [P] + 1 2 3 + +move 1 from 2 to 1 +move 3 from 1 to 3 +move 2 from 2 to 1 +move 1 from 1 to 2 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] -- cgit v1.3