summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-05 03:05:10 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-05 03:05:10 -0500
commit9880e1dccf36ca7762fabd44b6091db6a03e1fad (patch)
tree9f898e4e1906d5ad145d0a914dc1411b28f82afd
parent42aa5f340f0953451da432d2c6101bf4105a5cda (diff)
downloadadvent-of-code-9880e1dccf36ca7762fabd44b6091db6a03e1fad.tar.gz
advent-of-code-9880e1dccf36ca7762fabd44b6091db6a03e1fad.zip
day 5
-rw-r--r--data/2022/5.txt511
-rw-r--r--src/2022/5/mod.rs141
-rw-r--r--src/2022/mod.rs4
3 files changed, 656 insertions, 0 deletions
diff --git a/data/2022/5.txt b/data/2022/5.txt
new file mode 100644
index 0000000..c336b42
--- /dev/null
+++ b/data/2022/5.txt
@@ -0,0 +1,511 @@
+[B] [N] [H]
+[V] [P] [T] [V] [P]
+[W] [C] [T] [S] [H] [N]
+[T] [J] [Z] [M] [N] [F] [L]
+[Q] [W] [N] [J] [T] [Q] [R] [B]
+[N] [B] [Q] [R] [V] [F] [D] [F] [M]
+[H] [W] [S] [J] [P] [W] [L] [P] [S]
+[D] [D] [T] [F] [G] [B] [B] [H] [Z]
+ 1 2 3 4 5 6 7 8 9
+
+move 2 from 8 to 1
+move 4 from 9 to 8
+move 2 from 1 to 6
+move 7 from 4 to 2
+move 10 from 2 to 7
+move 2 from 1 to 6
+move 1 from 9 to 4
+move 1 from 4 to 1
+move 8 from 6 to 4
+move 7 from 1 to 8
+move 6 from 8 to 1
+move 1 from 4 to 1
+move 8 from 7 to 3
+move 2 from 5 to 2
+move 5 from 3 to 2
+move 5 from 2 to 1
+move 1 from 6 to 5
+move 2 from 2 to 6
+move 5 from 8 to 7
+move 12 from 7 to 4
+move 3 from 5 to 4
+move 2 from 6 to 4
+move 9 from 1 to 7
+move 4 from 3 to 7
+move 4 from 3 to 4
+move 3 from 1 to 7
+move 1 from 9 to 1
+move 1 from 1 to 4
+move 2 from 5 to 2
+move 1 from 3 to 7
+move 15 from 7 to 2
+move 4 from 7 to 9
+move 6 from 9 to 2
+move 2 from 8 to 3
+move 3 from 2 to 8
+move 1 from 7 to 6
+move 8 from 2 to 5
+move 2 from 8 to 4
+move 2 from 3 to 8
+move 9 from 5 to 9
+move 7 from 4 to 2
+move 1 from 8 to 6
+move 6 from 9 to 2
+move 3 from 9 to 7
+move 2 from 8 to 4
+move 7 from 2 to 6
+move 7 from 4 to 1
+move 3 from 1 to 8
+move 2 from 1 to 8
+move 4 from 8 to 2
+move 2 from 1 to 5
+move 19 from 2 to 7
+move 8 from 4 to 7
+move 18 from 7 to 1
+move 11 from 7 to 4
+move 15 from 1 to 7
+move 9 from 4 to 3
+move 2 from 3 to 1
+move 9 from 4 to 5
+move 1 from 8 to 1
+move 8 from 6 to 5
+move 3 from 2 to 5
+move 1 from 6 to 7
+move 4 from 4 to 3
+move 8 from 5 to 1
+move 13 from 1 to 6
+move 12 from 7 to 1
+move 12 from 6 to 3
+move 1 from 7 to 6
+move 1 from 7 to 5
+move 1 from 1 to 9
+move 1 from 3 to 1
+move 3 from 1 to 9
+move 12 from 3 to 8
+move 1 from 9 to 3
+move 1 from 6 to 8
+move 5 from 5 to 1
+move 1 from 6 to 2
+move 10 from 8 to 9
+move 13 from 9 to 2
+move 10 from 3 to 4
+move 1 from 8 to 9
+move 2 from 8 to 7
+move 1 from 3 to 1
+move 1 from 5 to 6
+move 13 from 2 to 5
+move 1 from 9 to 2
+move 7 from 1 to 4
+move 2 from 2 to 5
+move 2 from 7 to 8
+move 1 from 6 to 8
+move 10 from 5 to 8
+move 3 from 7 to 2
+move 4 from 1 to 4
+move 12 from 4 to 2
+move 10 from 5 to 3
+move 6 from 2 to 1
+move 2 from 4 to 8
+move 3 from 4 to 8
+move 6 from 1 to 7
+move 1 from 7 to 5
+move 12 from 8 to 2
+move 3 from 4 to 9
+move 1 from 4 to 3
+move 2 from 9 to 6
+move 2 from 6 to 8
+move 1 from 1 to 3
+move 8 from 2 to 6
+move 4 from 1 to 8
+move 12 from 2 to 3
+move 4 from 6 to 8
+move 10 from 8 to 3
+move 14 from 3 to 8
+move 5 from 5 to 8
+move 1 from 7 to 8
+move 5 from 3 to 5
+move 4 from 7 to 2
+move 2 from 6 to 1
+move 4 from 3 to 7
+move 4 from 5 to 1
+move 21 from 8 to 6
+move 7 from 3 to 2
+move 1 from 5 to 1
+move 4 from 8 to 9
+move 16 from 6 to 1
+move 1 from 8 to 4
+move 5 from 9 to 2
+move 7 from 1 to 7
+move 10 from 1 to 3
+move 1 from 4 to 2
+move 6 from 6 to 5
+move 6 from 1 to 4
+move 4 from 7 to 9
+move 1 from 6 to 5
+move 5 from 7 to 6
+move 3 from 6 to 8
+move 1 from 7 to 6
+move 6 from 4 to 8
+move 4 from 8 to 3
+move 4 from 8 to 4
+move 17 from 2 to 1
+move 8 from 3 to 4
+move 5 from 4 to 3
+move 10 from 1 to 5
+move 11 from 3 to 5
+move 1 from 7 to 9
+move 3 from 6 to 4
+move 9 from 4 to 9
+move 7 from 1 to 3
+move 1 from 4 to 8
+move 7 from 5 to 4
+move 18 from 5 to 1
+move 13 from 1 to 6
+move 1 from 1 to 5
+move 1 from 1 to 6
+move 2 from 3 to 1
+move 1 from 3 to 1
+move 5 from 1 to 6
+move 4 from 5 to 8
+move 2 from 4 to 9
+move 1 from 1 to 9
+move 6 from 3 to 8
+move 1 from 4 to 5
+move 10 from 8 to 7
+move 16 from 6 to 7
+move 1 from 5 to 4
+move 1 from 7 to 2
+move 2 from 2 to 6
+move 2 from 8 to 5
+move 5 from 4 to 9
+move 2 from 5 to 9
+move 7 from 9 to 8
+move 2 from 6 to 9
+move 4 from 8 to 9
+move 7 from 9 to 7
+move 13 from 9 to 5
+move 10 from 5 to 1
+move 3 from 8 to 4
+move 5 from 1 to 3
+move 3 from 5 to 6
+move 3 from 9 to 7
+move 1 from 1 to 7
+move 2 from 1 to 3
+move 1 from 6 to 1
+move 4 from 3 to 8
+move 1 from 8 to 9
+move 1 from 8 to 7
+move 1 from 8 to 4
+move 1 from 9 to 7
+move 1 from 8 to 5
+move 2 from 4 to 3
+move 4 from 6 to 3
+move 1 from 5 to 1
+move 1 from 6 to 4
+move 2 from 4 to 5
+move 1 from 4 to 6
+move 1 from 6 to 4
+move 30 from 7 to 3
+move 1 from 5 to 1
+move 6 from 7 to 3
+move 2 from 1 to 7
+move 2 from 1 to 2
+move 2 from 2 to 1
+move 1 from 4 to 9
+move 3 from 1 to 2
+move 1 from 9 to 5
+move 2 from 7 to 1
+move 1 from 7 to 3
+move 1 from 1 to 9
+move 1 from 5 to 8
+move 1 from 1 to 2
+move 1 from 7 to 3
+move 1 from 9 to 4
+move 18 from 3 to 4
+move 1 from 5 to 9
+move 1 from 9 to 6
+move 1 from 2 to 7
+move 1 from 8 to 7
+move 1 from 6 to 3
+move 1 from 7 to 2
+move 14 from 4 to 6
+move 1 from 7 to 6
+move 15 from 6 to 4
+move 20 from 3 to 1
+move 5 from 4 to 9
+move 5 from 4 to 2
+move 15 from 1 to 7
+move 11 from 7 to 9
+move 2 from 7 to 6
+move 1 from 6 to 4
+move 1 from 6 to 3
+move 2 from 7 to 8
+move 10 from 4 to 3
+move 15 from 9 to 3
+move 1 from 9 to 7
+move 29 from 3 to 6
+move 3 from 1 to 6
+move 1 from 8 to 4
+move 2 from 4 to 3
+move 1 from 8 to 9
+move 4 from 6 to 1
+move 20 from 6 to 2
+move 5 from 1 to 9
+move 3 from 6 to 2
+move 4 from 6 to 3
+move 4 from 3 to 1
+move 4 from 1 to 4
+move 3 from 4 to 8
+move 6 from 3 to 4
+move 6 from 2 to 6
+move 1 from 7 to 1
+move 3 from 6 to 8
+move 6 from 9 to 3
+move 1 from 1 to 4
+move 1 from 1 to 7
+move 3 from 4 to 5
+move 2 from 6 to 4
+move 2 from 5 to 6
+move 4 from 8 to 7
+move 1 from 5 to 6
+move 1 from 8 to 4
+move 1 from 8 to 4
+move 2 from 4 to 9
+move 4 from 7 to 8
+move 4 from 4 to 3
+move 1 from 7 to 9
+move 4 from 8 to 6
+move 1 from 3 to 4
+move 1 from 3 to 5
+move 2 from 4 to 7
+move 4 from 6 to 3
+move 2 from 9 to 1
+move 2 from 7 to 4
+move 1 from 5 to 1
+move 1 from 3 to 4
+move 1 from 9 to 3
+move 4 from 4 to 5
+move 2 from 5 to 3
+move 1 from 5 to 7
+move 1 from 5 to 8
+move 2 from 6 to 4
+move 3 from 1 to 3
+move 21 from 3 to 5
+move 3 from 6 to 1
+move 1 from 7 to 1
+move 4 from 2 to 6
+move 1 from 8 to 2
+move 10 from 2 to 4
+move 4 from 1 to 2
+move 1 from 6 to 5
+move 2 from 6 to 9
+move 7 from 4 to 9
+move 1 from 6 to 5
+move 3 from 9 to 4
+move 6 from 2 to 8
+move 3 from 9 to 1
+move 8 from 4 to 3
+move 1 from 9 to 4
+move 21 from 5 to 7
+move 1 from 1 to 3
+move 2 from 9 to 6
+move 14 from 7 to 1
+move 2 from 4 to 1
+move 2 from 8 to 7
+move 1 from 8 to 2
+move 11 from 2 to 9
+move 8 from 9 to 6
+move 4 from 7 to 1
+move 1 from 7 to 4
+move 2 from 3 to 5
+move 1 from 1 to 6
+move 1 from 8 to 2
+move 3 from 7 to 5
+move 6 from 1 to 7
+move 1 from 8 to 7
+move 1 from 4 to 5
+move 4 from 6 to 5
+move 6 from 7 to 6
+move 3 from 9 to 1
+move 1 from 7 to 3
+move 11 from 5 to 1
+move 1 from 5 to 2
+move 9 from 6 to 4
+move 1 from 7 to 3
+move 2 from 6 to 1
+move 1 from 2 to 1
+move 1 from 2 to 6
+move 14 from 1 to 5
+move 1 from 8 to 4
+move 10 from 1 to 5
+move 3 from 5 to 1
+move 8 from 3 to 8
+move 16 from 5 to 7
+move 2 from 1 to 9
+move 3 from 8 to 1
+move 1 from 2 to 4
+move 6 from 7 to 4
+move 3 from 5 to 8
+move 2 from 3 to 6
+move 7 from 1 to 7
+move 14 from 4 to 3
+move 9 from 7 to 8
+move 2 from 4 to 1
+move 9 from 8 to 4
+move 7 from 8 to 2
+move 6 from 1 to 8
+move 1 from 9 to 7
+move 1 from 1 to 6
+move 1 from 9 to 6
+move 1 from 5 to 9
+move 1 from 5 to 3
+move 9 from 4 to 9
+move 3 from 3 to 6
+move 8 from 6 to 3
+move 1 from 2 to 9
+move 8 from 9 to 8
+move 6 from 2 to 9
+move 2 from 6 to 1
+move 7 from 8 to 6
+move 2 from 9 to 6
+move 8 from 7 to 8
+move 1 from 4 to 5
+move 9 from 3 to 5
+move 2 from 1 to 4
+move 1 from 7 to 4
+move 2 from 4 to 3
+move 11 from 8 to 1
+move 1 from 4 to 7
+move 1 from 7 to 8
+move 5 from 1 to 3
+move 4 from 6 to 4
+move 2 from 4 to 8
+move 1 from 4 to 8
+move 7 from 8 to 9
+move 1 from 8 to 9
+move 1 from 8 to 5
+move 18 from 3 to 2
+move 17 from 2 to 7
+move 6 from 5 to 4
+move 1 from 2 to 5
+move 4 from 4 to 6
+move 4 from 6 to 9
+move 15 from 7 to 9
+move 2 from 1 to 6
+move 2 from 7 to 9
+move 28 from 9 to 2
+move 1 from 6 to 7
+move 4 from 6 to 9
+move 3 from 1 to 7
+move 2 from 6 to 3
+move 1 from 4 to 7
+move 8 from 9 to 5
+move 13 from 5 to 3
+move 1 from 5 to 7
+move 3 from 9 to 4
+move 8 from 3 to 7
+move 28 from 2 to 5
+move 1 from 9 to 8
+move 4 from 3 to 4
+move 4 from 7 to 5
+move 2 from 3 to 9
+move 21 from 5 to 4
+move 1 from 5 to 7
+move 1 from 3 to 5
+move 3 from 5 to 7
+move 1 from 1 to 3
+move 3 from 7 to 3
+move 5 from 7 to 6
+move 10 from 4 to 8
+move 6 from 5 to 4
+move 1 from 9 to 3
+move 15 from 4 to 5
+move 10 from 4 to 7
+move 3 from 3 to 7
+move 1 from 3 to 4
+move 1 from 3 to 4
+move 7 from 5 to 1
+move 2 from 4 to 7
+move 1 from 9 to 2
+move 2 from 6 to 9
+move 1 from 5 to 3
+move 1 from 3 to 8
+move 10 from 7 to 9
+move 2 from 8 to 1
+move 9 from 9 to 2
+move 1 from 4 to 3
+move 9 from 8 to 7
+move 1 from 2 to 8
+move 5 from 5 to 4
+move 1 from 3 to 2
+move 5 from 4 to 3
+move 3 from 5 to 9
+move 6 from 7 to 3
+move 1 from 6 to 5
+move 5 from 9 to 7
+move 2 from 5 to 6
+move 3 from 6 to 7
+move 4 from 1 to 4
+move 6 from 2 to 7
+move 17 from 7 to 5
+move 1 from 6 to 1
+move 5 from 3 to 6
+move 10 from 7 to 2
+move 1 from 8 to 4
+move 1 from 9 to 8
+move 3 from 4 to 1
+move 1 from 7 to 4
+move 5 from 5 to 9
+move 2 from 8 to 7
+move 3 from 3 to 7
+move 4 from 2 to 3
+move 3 from 4 to 6
+move 7 from 5 to 8
+move 7 from 2 to 8
+move 4 from 9 to 8
+move 12 from 8 to 3
+move 17 from 3 to 2
+move 1 from 7 to 9
+move 1 from 3 to 9
+move 3 from 9 to 1
+move 2 from 5 to 1
+move 1 from 3 to 5
+move 4 from 5 to 8
+move 6 from 8 to 1
+move 17 from 2 to 3
+move 13 from 3 to 2
+move 1 from 3 to 9
+move 1 from 8 to 4
+move 1 from 4 to 8
+move 1 from 9 to 1
+move 2 from 7 to 2
+move 8 from 6 to 2
+move 2 from 7 to 5
+move 9 from 1 to 3
+move 13 from 2 to 9
+move 6 from 1 to 4
+move 6 from 4 to 5
+move 3 from 8 to 1
+move 2 from 1 to 8
+move 8 from 5 to 7
+move 2 from 3 to 1
+move 9 from 3 to 1
+move 3 from 8 to 2
+move 1 from 1 to 9
+move 1 from 3 to 9
+move 6 from 7 to 3
+move 4 from 2 to 7
+move 14 from 1 to 6
+move 2 from 3 to 9
+move 3 from 3 to 7
+move 6 from 2 to 1
+move 2 from 1 to 2
+move 9 from 6 to 3
+move 11 from 9 to 5
+move 9 from 7 to 6
+move 6 from 6 to 2
+move 1 from 1 to 8
+move 5 from 9 to 4
+move 1 from 8 to 5
+move 9 from 2 to 7
+move 10 from 5 to 8
diff --git a/src/2022/5/mod.rs b/src/2022/5/mod.rs
new file mode 100644
index 0000000..74e4285
--- /dev/null
+++ b/src/2022/5/mod.rs
@@ -0,0 +1,141 @@
+#![allow(dead_code)]
+#![allow(unused_variables)]
+
+use crate::prelude::*;
+
+#[derive(Default)]
+pub struct Pile(Vec<char>);
+
+impl Pile {
+ fn move_from(&mut self, other: &mut Self, n: usize) {
+ for _ in 0..n {
+ self.0.push(other.0.pop().unwrap());
+ }
+ }
+
+ fn unshift(&mut self, c: char) {
+ self.0.insert(0, c);
+ }
+
+ fn push(&mut self, c: char) {
+ self.0.push(c);
+ }
+
+ fn pop(&mut self) -> Option<char> {
+ self.0.pop()
+ }
+
+ fn top(&self) -> Option<char> {
+ self.0.last().copied()
+ }
+}
+
+struct Instruction {
+ count: usize,
+ from: usize,
+ to: usize,
+}
+
+pub struct Crates {
+ piles: Vec<Pile>,
+ instructions: Vec<Instruction>,
+}
+
+pub fn parse(fh: File) -> Result<Crates> {
+ let mut lines = parse::lines(fh);
+ let mut piles: Vec<Pile> = vec![];
+
+ for line in lines.by_ref() {
+ if line.starts_with(" 1 ") {
+ break;
+ }
+
+ let pile_count = (line.len() + 1) / 4;
+ piles.resize_with(pile_count, Default::default);
+
+ for (pile_idx, pile) in piles.iter_mut().enumerate() {
+ let idx = pile_idx * 4;
+ assert!([' ', '['].contains(&line.chars().nth(idx).unwrap()));
+ let crate_name = line.chars().nth(idx + 1).unwrap();
+ if crate_name != ' ' {
+ pile.unshift(crate_name);
+ }
+ assert!([' ', ']'].contains(&line.chars().nth(idx + 2).unwrap()));
+ assert!([Some(' '), None].contains(&line.chars().nth(idx + 3)));
+ }
+ }
+
+ assert_eq!(lines.next().unwrap(), "");
+
+ let mut instructions = vec![];
+ for line in lines {
+ let captures = regex_captures!(
+ r"^move ([0-9]+) from ([0-9]+) to ([0-9]+)$",
+ &line
+ )
+ .unwrap();
+ let count = captures[1].parse().unwrap();
+ let from = captures[2].parse().unwrap();
+ let to = captures[3].parse().unwrap();
+ instructions.push(Instruction { count, from, to });
+ }
+
+ Ok(Crates {
+ piles,
+ instructions,
+ })
+}
+
+fn part1_str(mut crates: Crates) -> Result<String> {
+ for Instruction { count, from, to } in crates.instructions {
+ for _ in 0..count {
+ let c = crates.piles[from - 1].pop().unwrap();
+ crates.piles[to - 1].push(c);
+ }
+ }
+ Ok(crates
+ .piles
+ .iter()
+ .map(|pile| pile.top().unwrap())
+ .collect())
+}
+
+pub fn part1(crates: Crates) -> Result<i64> {
+ println!("{}", part1_str(crates)?);
+ Ok(0)
+}
+
+fn part2_str(mut crates: Crates) -> Result<String> {
+ for Instruction { count, from, to } in crates.instructions {
+ let mut tmp = vec![];
+ for _ in 0..count {
+ let c = crates.piles[from - 1].pop().unwrap();
+ tmp.push(c);
+ }
+ for c in tmp.iter().copied().rev() {
+ crates.piles[to - 1].push(c);
+ }
+ }
+ Ok(crates
+ .piles
+ .iter()
+ .map(|pile| pile.top().unwrap())
+ .collect())
+}
+
+pub fn part2(crates: Crates) -> Result<i64> {
+ println!("{}", part2_str(crates)?);
+ Ok(0)
+}
+
+#[test]
+fn test() {
+ assert_eq!(
+ part1_str(parse(parse::data(2022, 5).unwrap()).unwrap()).unwrap(),
+ "PSNRGBTFT"
+ );
+ assert_eq!(
+ part2_str(parse(parse::data(2022, 5).unwrap()).unwrap()).unwrap(),
+ "BNTZFPMMW"
+ );
+}
diff --git a/src/2022/mod.rs b/src/2022/mod.rs
index 1488c13..23bf3bc 100644
--- a/src/2022/mod.rs
+++ b/src/2022/mod.rs
@@ -8,6 +8,8 @@ mod day2;
mod day3;
#[path = "4/mod.rs"]
mod day4;
+#[path = "5/mod.rs"]
+mod day5;
// NEXT MOD
pub fn run(day: u8, puzzle: u8) -> Result<i64> {
@@ -21,6 +23,8 @@ pub fn run(day: u8, puzzle: u8) -> Result<i64> {
(3, 2) => day3::part2(day3::parse(parse::data(2022, 3)?)?),
(4, 1) => day4::part1(day4::parse(parse::data(2022, 4)?)?),
(4, 2) => day4::part2(day4::parse(parse::data(2022, 4)?)?),
+ (5, 1) => day5::part1(day5::parse(parse::data(2022, 5)?)?),
+ (5, 2) => day5::part2(day5::parse(parse::data(2022, 5)?)?),
// NEXT PART
_ => Err(anyhow!("unknown puzzle {}-{}", day, puzzle)),
}