diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2022-12-05 14:19:50 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2022-12-05 14:19:50 +0100 |
| commit | 7526b65381c7e60b9d45298be099e9a665494ec9 (patch) | |
| tree | 04d20ee6108451e5ae0966a2e137f4dc1744e048 | |
| parent | 8080b91d88245dce76c1c879bc380a3395167b0a (diff) | |
day5
| -rw-r--r-- | Cargo.lock | 35 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | inputs/day5 | 512 | ||||
| -rw-r--r-- | src/bin/day5.rs | 113 |
4 files changed, 661 insertions, 0 deletions
@@ -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" @@ -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"); + } +} |
