From 9880e1dccf36ca7762fabd44b6091db6a03e1fad Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 5 Dec 2022 03:05:10 -0500 Subject: day 5 --- data/2022/5.txt | 511 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/2022/5/mod.rs | 141 +++++++++++++++ src/2022/mod.rs | 4 + 3 files changed, 656 insertions(+) create mode 100644 data/2022/5.txt create mode 100644 src/2022/5/mod.rs 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); + +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 { + self.0.pop() + } + + fn top(&self) -> Option { + self.0.last().copied() + } +} + +struct Instruction { + count: usize, + from: usize, + to: usize, +} + +pub struct Crates { + piles: Vec, + instructions: Vec, +} + +pub fn parse(fh: File) -> Result { + let mut lines = parse::lines(fh); + let mut piles: Vec = 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 { + 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 { + println!("{}", part1_str(crates)?); + Ok(0) +} + +fn part2_str(mut crates: Crates) -> Result { + 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 { + 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 { @@ -21,6 +23,8 @@ pub fn run(day: u8, puzzle: u8) -> Result { (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)), } -- cgit v1.2.3-54-g00ecf