summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock35
-rw-r--r--Cargo.toml1
-rw-r--r--inputs/day5512
-rw-r--r--src/bin/day5.rs113
4 files changed, 661 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
index c0c9382..6448977 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5,3 +5,38 @@ version = 3
[[package]]
name = "advent"
version = "0.1.0"
+dependencies = [
+ "regex",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "regex"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
diff --git a/Cargo.toml b/Cargo.toml
index bb0c0e0..02de396 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,3 +5,4 @@ authors = ["Reiner Herrmann <reiner@reiner-h.de>"]
edition = "2021"
[dependencies]
+regex = "1"
diff --git a/inputs/day5 b/inputs/day5
new file mode 100644
index 0000000..42c96a4
--- /dev/null
+++ b/inputs/day5
@@ -0,0 +1,512 @@
+ [B] [L] [J]
+ [B] [Q] [R] [D] [T]
+ [G] [H] [H] [M] [N] [F]
+ [J] [N] [D] [F] [J] [H] [B]
+ [Q] [F] [W] [S] [V] [N] [F] [N]
+[W] [N] [H] [M] [L] [B] [R] [T] [Q]
+[L] [T] [C] [R] [R] [J] [W] [Z] [L]
+[S] [J] [S] [T] [T] [M] [D] [B] [H]
+ 1 2 3 4 5 6 7 8 9
+
+move 5 from 4 to 5
+move 2 from 5 to 8
+move 2 from 9 to 1
+move 2 from 9 to 1
+move 1 from 5 to 3
+move 10 from 5 to 8
+move 1 from 4 to 7
+move 1 from 1 to 2
+move 5 from 3 to 7
+move 1 from 2 to 8
+move 21 from 8 to 5
+move 13 from 5 to 7
+move 2 from 9 to 4
+move 1 from 7 to 4
+move 5 from 1 to 4
+move 1 from 5 to 7
+move 2 from 2 to 7
+move 1 from 3 to 2
+move 1 from 1 to 6
+move 7 from 5 to 9
+move 16 from 7 to 4
+move 7 from 9 to 3
+move 1 from 7 to 5
+move 1 from 3 to 8
+move 3 from 2 to 7
+move 1 from 8 to 9
+move 3 from 3 to 6
+move 21 from 4 to 9
+move 1 from 5 to 7
+move 4 from 4 to 9
+move 8 from 6 to 3
+move 6 from 7 to 1
+move 12 from 9 to 8
+move 6 from 7 to 2
+move 3 from 6 to 5
+move 1 from 6 to 9
+move 4 from 8 to 6
+move 3 from 8 to 5
+move 4 from 1 to 8
+move 4 from 6 to 1
+move 2 from 1 to 3
+move 1 from 5 to 8
+move 2 from 2 to 8
+move 5 from 8 to 3
+move 4 from 2 to 7
+move 5 from 8 to 1
+move 2 from 1 to 7
+move 1 from 8 to 2
+move 2 from 1 to 7
+move 11 from 9 to 2
+move 1 from 8 to 5
+move 2 from 9 to 4
+move 3 from 9 to 5
+move 2 from 5 to 1
+move 6 from 5 to 8
+move 2 from 4 to 2
+move 1 from 5 to 6
+move 7 from 1 to 8
+move 2 from 2 to 7
+move 13 from 8 to 1
+move 16 from 3 to 1
+move 3 from 2 to 1
+move 12 from 7 to 6
+move 15 from 1 to 8
+move 2 from 3 to 8
+move 16 from 1 to 2
+move 24 from 2 to 8
+move 1 from 1 to 5
+move 1 from 5 to 8
+move 3 from 6 to 7
+move 26 from 8 to 3
+move 20 from 3 to 9
+move 1 from 2 to 9
+move 16 from 9 to 3
+move 14 from 3 to 1
+move 13 from 1 to 6
+move 3 from 3 to 4
+move 3 from 9 to 4
+move 1 from 7 to 8
+move 5 from 8 to 2
+move 8 from 8 to 5
+move 18 from 6 to 1
+move 4 from 8 to 5
+move 6 from 4 to 1
+move 2 from 2 to 5
+move 5 from 3 to 8
+move 5 from 8 to 7
+move 2 from 5 to 8
+move 5 from 5 to 4
+move 3 from 2 to 8
+move 22 from 1 to 2
+move 1 from 1 to 2
+move 5 from 8 to 2
+move 2 from 5 to 2
+move 1 from 1 to 6
+move 5 from 5 to 2
+move 1 from 9 to 8
+move 5 from 4 to 1
+move 6 from 6 to 9
+move 3 from 1 to 9
+move 1 from 1 to 7
+move 8 from 9 to 6
+move 6 from 7 to 1
+move 5 from 6 to 5
+move 27 from 2 to 1
+move 4 from 5 to 7
+move 9 from 1 to 5
+move 1 from 9 to 1
+move 3 from 6 to 2
+move 9 from 2 to 1
+move 2 from 7 to 2
+move 1 from 8 to 7
+move 10 from 5 to 9
+move 1 from 9 to 7
+move 25 from 1 to 8
+move 6 from 7 to 4
+move 11 from 1 to 7
+move 3 from 8 to 1
+move 3 from 2 to 6
+move 3 from 8 to 9
+move 11 from 8 to 6
+move 1 from 2 to 6
+move 12 from 6 to 4
+move 13 from 4 to 5
+move 1 from 6 to 1
+move 3 from 7 to 5
+move 5 from 8 to 7
+move 1 from 7 to 1
+move 5 from 1 to 6
+move 3 from 6 to 4
+move 3 from 8 to 6
+move 2 from 5 to 2
+move 12 from 5 to 9
+move 5 from 6 to 2
+move 2 from 5 to 9
+move 6 from 4 to 9
+move 11 from 7 to 3
+move 1 from 2 to 5
+move 1 from 7 to 8
+move 1 from 5 to 7
+move 1 from 7 to 1
+move 1 from 8 to 1
+move 2 from 4 to 7
+move 2 from 6 to 8
+move 5 from 3 to 6
+move 2 from 7 to 2
+move 2 from 2 to 9
+move 1 from 2 to 9
+move 1 from 1 to 6
+move 35 from 9 to 7
+move 2 from 8 to 7
+move 3 from 3 to 8
+move 5 from 2 to 4
+move 3 from 3 to 7
+move 2 from 4 to 7
+move 4 from 6 to 5
+move 4 from 5 to 9
+move 3 from 4 to 5
+move 1 from 8 to 3
+move 4 from 9 to 8
+move 1 from 9 to 6
+move 38 from 7 to 2
+move 1 from 3 to 5
+move 1 from 1 to 7
+move 4 from 7 to 3
+move 3 from 6 to 1
+move 22 from 2 to 7
+move 1 from 5 to 8
+move 7 from 8 to 4
+move 8 from 2 to 8
+move 3 from 5 to 1
+move 4 from 3 to 9
+move 1 from 8 to 3
+move 1 from 3 to 7
+move 2 from 2 to 3
+move 5 from 8 to 9
+move 3 from 9 to 1
+move 2 from 1 to 7
+move 6 from 2 to 3
+move 6 from 3 to 1
+move 2 from 3 to 6
+move 1 from 6 to 1
+move 14 from 7 to 2
+move 4 from 1 to 6
+move 8 from 1 to 3
+move 4 from 3 to 6
+move 3 from 9 to 5
+move 1 from 8 to 6
+move 1 from 8 to 4
+move 9 from 7 to 1
+move 8 from 2 to 4
+move 4 from 2 to 9
+move 2 from 2 to 1
+move 3 from 5 to 8
+move 1 from 8 to 6
+move 1 from 7 to 8
+move 1 from 6 to 5
+move 3 from 9 to 5
+move 2 from 9 to 5
+move 4 from 3 to 9
+move 3 from 6 to 3
+move 3 from 6 to 9
+move 9 from 4 to 1
+move 1 from 9 to 8
+move 3 from 3 to 6
+move 2 from 7 to 4
+move 4 from 8 to 5
+move 7 from 5 to 6
+move 19 from 1 to 9
+move 5 from 9 to 3
+move 2 from 1 to 6
+move 1 from 4 to 6
+move 4 from 3 to 2
+move 21 from 9 to 7
+move 1 from 1 to 2
+move 1 from 9 to 1
+move 1 from 1 to 8
+move 16 from 7 to 6
+move 24 from 6 to 5
+move 7 from 4 to 5
+move 1 from 8 to 3
+move 2 from 2 to 8
+move 31 from 5 to 8
+move 1 from 4 to 6
+move 2 from 6 to 9
+move 1 from 7 to 4
+move 3 from 7 to 9
+move 1 from 4 to 8
+move 2 from 3 to 5
+move 1 from 2 to 3
+move 1 from 3 to 7
+move 1 from 7 to 9
+move 24 from 8 to 6
+move 1 from 8 to 1
+move 30 from 6 to 1
+move 2 from 5 to 2
+move 1 from 6 to 9
+move 6 from 9 to 7
+move 1 from 6 to 4
+move 1 from 4 to 6
+move 23 from 1 to 3
+move 21 from 3 to 4
+move 4 from 2 to 6
+move 3 from 6 to 1
+move 1 from 5 to 1
+move 4 from 1 to 9
+move 3 from 9 to 6
+move 8 from 1 to 6
+move 4 from 8 to 5
+move 2 from 7 to 5
+move 7 from 4 to 3
+move 3 from 4 to 9
+move 9 from 3 to 9
+move 1 from 7 to 6
+move 6 from 5 to 8
+move 14 from 6 to 2
+move 4 from 8 to 4
+move 7 from 4 to 5
+move 1 from 7 to 9
+move 6 from 4 to 3
+move 13 from 2 to 6
+move 5 from 3 to 7
+move 1 from 3 to 8
+move 1 from 8 to 2
+move 4 from 8 to 3
+move 6 from 6 to 4
+move 2 from 2 to 8
+move 5 from 4 to 7
+move 3 from 7 to 5
+move 1 from 7 to 9
+move 2 from 3 to 9
+move 3 from 7 to 3
+move 1 from 7 to 9
+move 1 from 7 to 9
+move 3 from 4 to 1
+move 6 from 6 to 1
+move 2 from 7 to 5
+move 1 from 3 to 5
+move 11 from 9 to 4
+move 9 from 4 to 5
+move 3 from 3 to 4
+move 1 from 3 to 9
+move 2 from 8 to 1
+move 9 from 1 to 8
+move 22 from 5 to 8
+move 2 from 1 to 3
+move 3 from 4 to 6
+move 14 from 8 to 9
+move 1 from 3 to 9
+move 19 from 9 to 3
+move 3 from 9 to 4
+move 2 from 7 to 2
+move 1 from 4 to 6
+move 1 from 3 to 8
+move 8 from 3 to 1
+move 2 from 9 to 6
+move 1 from 2 to 5
+move 3 from 4 to 9
+move 1 from 2 to 3
+move 20 from 8 to 3
+move 4 from 9 to 5
+move 1 from 4 to 2
+move 26 from 3 to 5
+move 1 from 8 to 3
+move 8 from 1 to 4
+move 1 from 3 to 7
+move 1 from 2 to 1
+move 1 from 1 to 6
+move 1 from 6 to 7
+move 4 from 5 to 3
+move 3 from 4 to 2
+move 5 from 5 to 3
+move 2 from 2 to 6
+move 3 from 3 to 5
+move 2 from 4 to 8
+move 5 from 3 to 9
+move 5 from 9 to 8
+move 19 from 5 to 9
+move 1 from 5 to 2
+move 2 from 7 to 1
+move 1 from 1 to 7
+move 1 from 7 to 4
+move 13 from 9 to 3
+move 8 from 6 to 2
+move 10 from 3 to 5
+move 14 from 5 to 4
+move 7 from 8 to 4
+move 1 from 6 to 2
+move 6 from 3 to 8
+move 4 from 9 to 7
+move 2 from 9 to 8
+move 1 from 7 to 1
+move 3 from 2 to 7
+move 1 from 5 to 3
+move 7 from 8 to 6
+move 5 from 6 to 2
+move 8 from 4 to 5
+move 3 from 5 to 8
+move 3 from 8 to 6
+move 5 from 7 to 9
+move 5 from 3 to 6
+move 1 from 9 to 4
+move 17 from 4 to 7
+move 1 from 8 to 1
+move 12 from 7 to 8
+move 3 from 1 to 4
+move 2 from 4 to 6
+move 8 from 6 to 1
+move 4 from 6 to 3
+move 1 from 7 to 8
+move 5 from 5 to 8
+move 4 from 7 to 1
+move 3 from 2 to 6
+move 2 from 5 to 1
+move 6 from 1 to 6
+move 4 from 3 to 5
+move 4 from 5 to 3
+move 1 from 4 to 8
+move 3 from 3 to 2
+move 17 from 8 to 4
+move 6 from 6 to 3
+move 14 from 4 to 9
+move 1 from 3 to 8
+move 1 from 7 to 4
+move 3 from 8 to 3
+move 5 from 2 to 5
+move 6 from 1 to 7
+move 2 from 6 to 4
+move 4 from 5 to 7
+move 1 from 1 to 5
+move 1 from 6 to 3
+move 10 from 7 to 4
+move 1 from 5 to 4
+move 1 from 2 to 3
+move 15 from 4 to 5
+move 3 from 3 to 1
+move 6 from 2 to 6
+move 1 from 2 to 3
+move 2 from 4 to 7
+move 2 from 7 to 8
+move 1 from 4 to 2
+move 2 from 1 to 7
+move 1 from 7 to 2
+move 12 from 9 to 1
+move 4 from 9 to 5
+move 4 from 6 to 2
+move 1 from 7 to 3
+move 6 from 2 to 4
+move 1 from 8 to 5
+move 2 from 4 to 2
+move 11 from 1 to 7
+move 3 from 1 to 4
+move 17 from 5 to 6
+move 15 from 6 to 4
+move 1 from 8 to 9
+move 10 from 4 to 1
+move 1 from 3 to 9
+move 2 from 6 to 5
+move 1 from 2 to 6
+move 4 from 5 to 6
+move 4 from 1 to 2
+move 6 from 6 to 7
+move 2 from 2 to 6
+move 9 from 4 to 9
+move 6 from 1 to 2
+move 3 from 4 to 1
+move 10 from 9 to 8
+move 4 from 2 to 1
+move 1 from 1 to 2
+move 5 from 8 to 6
+move 1 from 2 to 7
+move 1 from 9 to 4
+move 2 from 6 to 9
+move 13 from 7 to 2
+move 5 from 7 to 5
+move 2 from 5 to 2
+move 1 from 4 to 5
+move 4 from 8 to 4
+move 17 from 2 to 6
+move 3 from 4 to 6
+move 2 from 9 to 1
+move 7 from 6 to 8
+move 1 from 5 to 2
+move 1 from 4 to 1
+move 2 from 9 to 4
+move 1 from 3 to 9
+move 4 from 3 to 7
+move 2 from 8 to 5
+move 3 from 7 to 5
+move 10 from 5 to 8
+move 2 from 2 to 4
+move 6 from 1 to 2
+move 4 from 6 to 3
+move 8 from 2 to 6
+move 1 from 7 to 4
+move 5 from 4 to 5
+move 7 from 6 to 7
+move 5 from 3 to 5
+move 5 from 5 to 2
+move 4 from 8 to 1
+move 6 from 1 to 6
+move 3 from 3 to 2
+move 22 from 6 to 2
+move 1 from 9 to 7
+move 8 from 8 to 6
+move 1 from 7 to 6
+move 2 from 5 to 7
+move 4 from 8 to 5
+move 7 from 6 to 7
+move 2 from 6 to 4
+move 14 from 2 to 1
+move 7 from 1 to 3
+move 12 from 7 to 3
+move 1 from 4 to 3
+move 2 from 5 to 8
+move 2 from 8 to 1
+move 1 from 4 to 3
+move 6 from 2 to 9
+move 6 from 9 to 2
+move 2 from 2 to 7
+move 6 from 7 to 5
+move 13 from 3 to 5
+move 5 from 2 to 6
+move 5 from 6 to 1
+move 2 from 3 to 6
+move 1 from 6 to 5
+move 1 from 6 to 1
+move 3 from 1 to 9
+move 6 from 2 to 7
+move 1 from 2 to 3
+move 24 from 5 to 2
+move 7 from 3 to 7
+move 13 from 7 to 9
+move 4 from 1 to 9
+move 4 from 1 to 6
+move 1 from 5 to 6
+move 16 from 9 to 5
+move 1 from 6 to 4
+move 1 from 5 to 2
+move 5 from 1 to 3
+move 11 from 2 to 1
+move 4 from 9 to 6
+move 1 from 4 to 7
+move 2 from 3 to 4
+move 6 from 6 to 9
+move 1 from 1 to 3
+move 2 from 9 to 4
+move 1 from 7 to 9
+move 4 from 2 to 9
+move 8 from 9 to 2
+move 3 from 3 to 2
+move 1 from 9 to 4
+move 5 from 1 to 7
+move 1 from 4 to 8
+move 2 from 1 to 9
+move 1 from 8 to 7
+move 6 from 5 to 3
+move 1 from 5 to 1
+move 5 from 2 to 3
+move 4 from 1 to 5
+move 4 from 7 to 1
+move 8 from 5 to 8
diff --git a/src/bin/day5.rs b/src/bin/day5.rs
new file mode 100644
index 0000000..a5e28fd
--- /dev/null
+++ b/src/bin/day5.rs
@@ -0,0 +1,113 @@
+use std::collections::VecDeque;
+use regex::Regex;
+
+static DAY: u8 = 5;
+
+fn main() {
+ let input = advent::read_lines(DAY);
+ println!("{DAY}a: {}", find_top_crates(&input));
+ println!("{DAY}b: {}", find_top_crates_9001(&input));
+}
+
+struct CrateMover {
+ instructions: Vec<Instruction>,
+ stacks: Vec<VecDeque<char>>,
+}
+
+struct Instruction {
+ amount: usize,
+ from: usize,
+ to: usize,
+}
+
+impl CrateMover {
+ fn new(input: &[String]) -> CrateMover {
+ let re_instruction = Regex::new("move ([0-9]+) from ([0-9]+) to ([0-9]+)").unwrap();
+
+ let mut instructions = Vec::new();
+ let mut stacks = Vec::new();
+ for line in input {
+ if let Some(cap) = re_instruction.captures(line) {
+ instructions.push(Instruction {
+ amount: cap[1].parse::<usize>().unwrap(),
+ from: cap[2].parse::<usize>().unwrap() - 1,
+ to: cap[3].parse::<usize>().unwrap() - 1,
+ });
+ }
+
+ if line.find('[').is_some() {
+ let chars = line.chars().collect::<Vec<_>>();
+ for (index, chunk) in chars.chunks(4).enumerate() {
+ // chunk: "[x] "
+ let name = chunk[1];
+ if name == ' ' {
+ // empty position
+ continue;
+ }
+ if index >= stacks.len() {
+ stacks.resize(index + 1, VecDeque::new());
+ }
+ stacks[index].push_front(name);
+ }
+ }
+ }
+
+ CrateMover { stacks, instructions }
+ }
+
+ fn move_crates(&mut self) {
+ for instruction in &self.instructions {
+ for _ in 0 .. instruction.amount {
+ let name = self.stacks[instruction.from].pop_back().expect("Stack has no crate");
+ self.stacks[instruction.to].push_back(name);
+ }
+ }
+ }
+
+ fn move_crates_9001(&mut self) {
+ for instruction in &self.instructions {
+ let drain_from = self.stacks[instruction.from].len() - instruction.amount;
+ let moved_stack = self.stacks[instruction.from].drain(drain_from ..).collect::<Vec<_>>();
+ self.stacks[instruction.to].extend(moved_stack);
+ }
+ }
+}
+
+fn find_top_crates(input: &[String]) -> String {
+ let mut cratemover = CrateMover::new(input);
+ cratemover.move_crates();
+ cratemover.stacks.iter()
+ .map(|stack| stack.back().unwrap())
+ .collect()
+}
+
+fn find_top_crates_9001(input: &[String]) -> String {
+ let mut cratemover = CrateMover::new(input);
+ cratemover.move_crates_9001();
+ cratemover.stacks.iter()
+ .map(|stack| stack.back().unwrap())
+ .collect()
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test() {
+ let input = [
+ " [D] ".to_string(),
+ "[N] [C] ".to_string(),
+ "[Z] [M] [P]".to_string(),
+ " 1 2 3 ".to_string(),
+ "".to_string(),
+ "move 1 from 2 to 1".to_string(),
+ "move 3 from 1 to 3".to_string(),
+ "move 2 from 2 to 1".to_string(),
+ "move 1 from 1 to 2".to_string(),
+ ];
+
+ assert_eq!(find_top_crates(&input), "CMZ");
+ assert_eq!(find_top_crates_9001(&input), "MCD");
+ }
+}