aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--resources/day05_actual.txt514
-rw-r--r--resources/day05_sample.txt9
-rw-r--r--src/aoc_2022/day05.clj74
-rw-r--r--src/aoc_2022/utils.clj3
4 files changed, 595 insertions, 5 deletions
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]