summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Wernick <justin@worthe-it.co.za>2022-12-05 19:17:38 +0200
committerJustin Wernick <justin@worthe-it.co.za>2022-12-05 19:17:38 +0200
commitce2b10e9ba524205f127d3387e3ec026bccc2f8a (patch)
tree7353b25fd667527fc09836ef68f4653044c718ea
parent8374ef5bc9d23c35b23ff1c9a9ba5f096b150921 (diff)
Day 5
-rw-r--r--2022/inputs/day_5.txt512
-rw-r--r--2022/src/bin/day_5.rs147
2 files changed, 659 insertions, 0 deletions
diff --git a/2022/inputs/day_5.txt b/2022/inputs/day_5.txt
new file mode 100644
index 0000000..e34750c
--- /dev/null
+++ b/2022/inputs/day_5.txt
@@ -0,0 +1,512 @@
+[N] [G] [Q]
+[H] [B] [B] [R] [H]
+[S] [N] [Q] [M] [T] [Z]
+[J] [T] [R] [V] [H] [R] [S]
+[F] [Q] [W] [T] [V] [J] [V] [M]
+[W] [P] [V] [S] [F] [B] [Q] [J] [H]
+[T] [R] [Q] [B] [D] [D] [B] [N] [N]
+[D] [H] [L] [N] [N] [M] [D] [D] [B]
+ 1 2 3 4 5 6 7 8 9
+
+move 3 from 1 to 2
+move 1 from 7 to 1
+move 1 from 6 to 5
+move 5 from 5 to 9
+move 2 from 5 to 2
+move 1 from 6 to 8
+move 1 from 5 to 7
+move 5 from 4 to 6
+move 1 from 7 to 6
+move 1 from 2 to 4
+move 5 from 2 to 6
+move 2 from 1 to 5
+move 2 from 1 to 9
+move 16 from 6 to 4
+move 6 from 8 to 3
+move 7 from 2 to 4
+move 5 from 9 to 3
+move 1 from 1 to 4
+move 1 from 1 to 3
+move 3 from 7 to 4
+move 2 from 5 to 4
+move 31 from 4 to 8
+move 22 from 8 to 4
+move 9 from 3 to 6
+move 7 from 9 to 5
+move 4 from 5 to 6
+move 6 from 3 to 2
+move 2 from 6 to 7
+move 5 from 2 to 7
+move 1 from 2 to 4
+move 1 from 7 to 5
+move 4 from 5 to 4
+move 2 from 6 to 9
+move 2 from 4 to 6
+move 7 from 6 to 4
+move 2 from 6 to 1
+move 1 from 6 to 8
+move 8 from 8 to 1
+move 1 from 7 to 6
+move 4 from 1 to 5
+move 9 from 4 to 8
+move 4 from 1 to 7
+move 3 from 5 to 3
+move 2 from 1 to 9
+move 1 from 3 to 2
+move 1 from 9 to 8
+move 1 from 2 to 1
+move 1 from 1 to 8
+move 1 from 5 to 1
+move 2 from 3 to 1
+move 2 from 6 to 9
+move 19 from 4 to 1
+move 4 from 4 to 2
+move 6 from 1 to 4
+move 1 from 2 to 4
+move 4 from 4 to 3
+move 7 from 7 to 3
+move 7 from 8 to 2
+move 2 from 7 to 4
+move 3 from 2 to 1
+move 8 from 8 to 2
+move 3 from 9 to 1
+move 2 from 9 to 1
+move 10 from 2 to 7
+move 4 from 3 to 1
+move 1 from 8 to 3
+move 1 from 4 to 5
+move 1 from 3 to 6
+move 1 from 2 to 1
+move 10 from 1 to 3
+move 1 from 4 to 7
+move 1 from 6 to 4
+move 7 from 3 to 2
+move 5 from 2 to 8
+move 11 from 7 to 2
+move 3 from 4 to 3
+move 1 from 4 to 3
+move 5 from 8 to 9
+move 17 from 2 to 4
+move 11 from 1 to 5
+move 4 from 1 to 3
+move 5 from 9 to 2
+move 4 from 2 to 1
+move 3 from 5 to 7
+move 6 from 5 to 3
+move 1 from 5 to 8
+move 6 from 1 to 8
+move 3 from 8 to 5
+move 1 from 1 to 4
+move 1 from 7 to 2
+move 15 from 3 to 4
+move 1 from 1 to 3
+move 10 from 3 to 9
+move 2 from 7 to 4
+move 1 from 2 to 8
+move 21 from 4 to 9
+move 1 from 2 to 3
+move 1 from 8 to 1
+move 9 from 4 to 2
+move 1 from 1 to 5
+move 5 from 2 to 7
+move 2 from 8 to 5
+move 1 from 8 to 1
+move 2 from 2 to 8
+move 2 from 4 to 9
+move 24 from 9 to 5
+move 3 from 4 to 1
+move 2 from 2 to 5
+move 12 from 5 to 1
+move 10 from 1 to 5
+move 23 from 5 to 6
+move 8 from 9 to 1
+move 3 from 8 to 1
+move 1 from 1 to 2
+move 1 from 3 to 7
+move 11 from 6 to 1
+move 1 from 2 to 4
+move 6 from 6 to 8
+move 4 from 6 to 7
+move 1 from 7 to 3
+move 1 from 3 to 4
+move 23 from 1 to 8
+move 1 from 4 to 2
+move 1 from 2 to 1
+move 1 from 6 to 7
+move 6 from 5 to 3
+move 1 from 7 to 8
+move 1 from 1 to 8
+move 1 from 9 to 3
+move 6 from 7 to 2
+move 3 from 5 to 9
+move 5 from 2 to 3
+move 28 from 8 to 3
+move 4 from 1 to 9
+move 5 from 9 to 5
+move 2 from 8 to 5
+move 1 from 9 to 4
+move 2 from 7 to 5
+move 1 from 4 to 2
+move 1 from 4 to 8
+move 2 from 8 to 3
+move 6 from 5 to 2
+move 1 from 7 to 2
+move 39 from 3 to 2
+move 2 from 3 to 8
+move 1 from 9 to 6
+move 2 from 2 to 9
+move 2 from 9 to 6
+move 1 from 8 to 1
+move 1 from 1 to 6
+move 5 from 6 to 9
+move 2 from 5 to 8
+move 20 from 2 to 4
+move 2 from 4 to 8
+move 2 from 8 to 3
+move 3 from 3 to 1
+move 22 from 2 to 5
+move 2 from 9 to 1
+move 3 from 1 to 7
+move 1 from 2 to 6
+move 1 from 2 to 9
+move 1 from 1 to 8
+move 2 from 7 to 9
+move 1 from 6 to 8
+move 1 from 2 to 7
+move 1 from 1 to 3
+move 1 from 9 to 8
+move 1 from 8 to 5
+move 3 from 8 to 7
+move 3 from 7 to 8
+move 15 from 4 to 1
+move 1 from 4 to 3
+move 10 from 1 to 6
+move 3 from 8 to 1
+move 5 from 9 to 4
+move 7 from 5 to 1
+move 4 from 6 to 3
+move 15 from 5 to 2
+move 4 from 6 to 4
+move 7 from 2 to 1
+move 6 from 4 to 6
+move 1 from 5 to 9
+move 1 from 5 to 7
+move 1 from 3 to 5
+move 11 from 1 to 8
+move 3 from 4 to 6
+move 4 from 1 to 5
+move 1 from 2 to 5
+move 2 from 8 to 3
+move 11 from 6 to 1
+move 1 from 3 to 7
+move 1 from 9 to 8
+move 6 from 5 to 8
+move 3 from 8 to 4
+move 1 from 4 to 5
+move 3 from 3 to 1
+move 9 from 8 to 2
+move 2 from 1 to 5
+move 11 from 2 to 5
+move 1 from 3 to 6
+move 2 from 8 to 5
+move 3 from 4 to 6
+move 1 from 8 to 3
+move 2 from 1 to 9
+move 1 from 3 to 8
+move 16 from 5 to 7
+move 3 from 1 to 6
+move 1 from 3 to 5
+move 1 from 6 to 7
+move 1 from 9 to 4
+move 1 from 5 to 4
+move 1 from 3 to 2
+move 1 from 1 to 2
+move 3 from 4 to 9
+move 1 from 2 to 7
+move 2 from 8 to 3
+move 6 from 2 to 8
+move 11 from 1 to 3
+move 6 from 3 to 1
+move 4 from 3 to 2
+move 2 from 3 to 1
+move 1 from 1 to 3
+move 4 from 8 to 4
+move 4 from 8 to 2
+move 11 from 7 to 2
+move 9 from 7 to 5
+move 1 from 7 to 3
+move 4 from 5 to 7
+move 14 from 2 to 3
+move 17 from 3 to 7
+move 2 from 5 to 2
+move 1 from 5 to 7
+move 1 from 5 to 6
+move 4 from 6 to 7
+move 8 from 1 to 2
+move 2 from 6 to 4
+move 1 from 6 to 8
+move 6 from 4 to 1
+move 1 from 8 to 5
+move 6 from 7 to 8
+move 5 from 8 to 3
+move 12 from 2 to 1
+move 1 from 8 to 4
+move 4 from 3 to 1
+move 4 from 2 to 4
+move 3 from 9 to 3
+move 3 from 3 to 2
+move 1 from 3 to 2
+move 3 from 4 to 1
+move 2 from 5 to 7
+move 22 from 1 to 8
+move 17 from 8 to 6
+move 21 from 7 to 6
+move 3 from 2 to 8
+move 3 from 1 to 5
+move 3 from 5 to 2
+move 2 from 4 to 6
+move 7 from 6 to 5
+move 1 from 9 to 4
+move 14 from 6 to 4
+move 5 from 8 to 3
+move 1 from 6 to 3
+move 3 from 3 to 9
+move 2 from 9 to 1
+move 2 from 7 to 1
+move 16 from 6 to 8
+move 2 from 6 to 7
+move 1 from 2 to 7
+move 1 from 3 to 8
+move 7 from 4 to 1
+move 2 from 7 to 2
+move 4 from 4 to 7
+move 5 from 2 to 4
+move 1 from 7 to 3
+move 3 from 5 to 8
+move 1 from 7 to 5
+move 12 from 1 to 6
+move 3 from 7 to 2
+move 7 from 4 to 2
+move 3 from 3 to 2
+move 1 from 4 to 2
+move 1 from 9 to 8
+move 8 from 6 to 8
+move 12 from 2 to 4
+move 5 from 5 to 2
+move 11 from 4 to 9
+move 3 from 6 to 3
+move 2 from 4 to 2
+move 4 from 2 to 6
+move 5 from 2 to 8
+move 12 from 8 to 4
+move 20 from 8 to 5
+move 13 from 5 to 3
+move 1 from 8 to 5
+move 5 from 5 to 9
+move 16 from 9 to 1
+move 9 from 4 to 5
+move 12 from 3 to 9
+move 5 from 6 to 5
+move 9 from 9 to 7
+move 14 from 1 to 4
+move 14 from 4 to 1
+move 15 from 5 to 7
+move 4 from 8 to 2
+move 3 from 4 to 3
+move 3 from 1 to 8
+move 1 from 5 to 9
+move 1 from 5 to 3
+move 3 from 9 to 8
+move 4 from 3 to 4
+move 1 from 4 to 6
+move 20 from 7 to 2
+move 2 from 3 to 8
+move 3 from 7 to 2
+move 4 from 2 to 1
+move 1 from 6 to 7
+move 3 from 4 to 2
+move 2 from 2 to 3
+move 4 from 3 to 4
+move 1 from 8 to 1
+move 3 from 8 to 1
+move 2 from 7 to 8
+move 1 from 4 to 5
+move 14 from 2 to 5
+move 6 from 1 to 5
+move 1 from 4 to 3
+move 15 from 1 to 4
+move 1 from 8 to 2
+move 1 from 9 to 5
+move 4 from 8 to 7
+move 13 from 5 to 6
+move 1 from 8 to 1
+move 2 from 7 to 9
+move 12 from 6 to 4
+move 1 from 3 to 6
+move 1 from 1 to 6
+move 4 from 5 to 2
+move 5 from 5 to 6
+move 2 from 6 to 2
+move 1 from 7 to 5
+move 2 from 6 to 9
+move 1 from 5 to 9
+move 16 from 2 to 5
+move 17 from 4 to 1
+move 3 from 1 to 3
+move 1 from 2 to 6
+move 2 from 6 to 1
+move 3 from 3 to 1
+move 14 from 1 to 8
+move 3 from 5 to 2
+move 4 from 8 to 2
+move 3 from 4 to 5
+move 15 from 5 to 3
+move 1 from 7 to 6
+move 3 from 1 to 8
+move 2 from 3 to 7
+move 1 from 1 to 2
+move 1 from 7 to 6
+move 4 from 2 to 8
+move 2 from 6 to 2
+move 1 from 7 to 6
+move 3 from 8 to 2
+move 12 from 8 to 6
+move 1 from 5 to 6
+move 3 from 2 to 5
+move 2 from 2 to 5
+move 4 from 6 to 5
+move 4 from 3 to 5
+move 1 from 8 to 4
+move 11 from 6 to 4
+move 6 from 3 to 1
+move 2 from 9 to 8
+move 20 from 4 to 5
+move 1 from 4 to 9
+move 2 from 3 to 8
+move 1 from 3 to 8
+move 17 from 5 to 8
+move 5 from 5 to 9
+move 9 from 5 to 1
+move 2 from 6 to 7
+move 23 from 8 to 2
+move 2 from 7 to 5
+move 3 from 9 to 4
+move 16 from 2 to 4
+move 11 from 1 to 8
+move 4 from 5 to 8
+move 11 from 2 to 6
+move 2 from 6 to 1
+move 5 from 9 to 5
+move 5 from 5 to 6
+move 5 from 8 to 6
+move 1 from 6 to 7
+move 7 from 8 to 1
+move 12 from 1 to 2
+move 1 from 9 to 5
+move 1 from 1 to 3
+move 1 from 1 to 4
+move 1 from 5 to 3
+move 1 from 3 to 6
+move 1 from 8 to 2
+move 18 from 6 to 2
+move 1 from 6 to 2
+move 2 from 8 to 3
+move 3 from 3 to 8
+move 18 from 4 to 9
+move 11 from 9 to 2
+move 2 from 9 to 6
+move 2 from 4 to 1
+move 1 from 1 to 5
+move 1 from 5 to 4
+move 1 from 4 to 8
+move 42 from 2 to 1
+move 3 from 9 to 3
+move 1 from 8 to 1
+move 1 from 3 to 4
+move 3 from 8 to 7
+move 1 from 4 to 1
+move 2 from 3 to 2
+move 17 from 1 to 6
+move 15 from 6 to 3
+move 2 from 9 to 7
+move 1 from 3 to 6
+move 2 from 7 to 6
+move 2 from 2 to 4
+move 1 from 2 to 3
+move 1 from 4 to 9
+move 1 from 4 to 1
+move 1 from 6 to 3
+move 20 from 1 to 9
+move 6 from 1 to 9
+move 7 from 9 to 3
+move 20 from 9 to 1
+move 1 from 6 to 7
+move 2 from 6 to 7
+move 1 from 6 to 5
+move 1 from 6 to 8
+move 4 from 7 to 3
+move 3 from 7 to 2
+move 1 from 6 to 4
+move 1 from 2 to 1
+move 1 from 4 to 9
+move 21 from 3 to 2
+move 5 from 3 to 8
+move 1 from 5 to 1
+move 2 from 8 to 7
+move 4 from 8 to 3
+move 4 from 2 to 5
+move 19 from 2 to 3
+move 1 from 9 to 2
+move 23 from 3 to 2
+move 2 from 7 to 4
+move 3 from 5 to 9
+move 16 from 2 to 1
+move 1 from 5 to 4
+move 1 from 9 to 3
+move 2 from 3 to 8
+move 3 from 4 to 6
+move 1 from 6 to 2
+move 1 from 8 to 6
+move 5 from 2 to 6
+move 7 from 6 to 5
+move 4 from 2 to 6
+move 6 from 5 to 9
+move 1 from 8 to 4
+move 18 from 1 to 9
+move 1 from 5 to 2
+move 9 from 9 to 4
+move 5 from 6 to 3
+move 9 from 4 to 1
+move 4 from 9 to 2
+move 1 from 4 to 8
+move 1 from 8 to 3
+move 7 from 1 to 8
+move 6 from 3 to 2
+move 10 from 2 to 9
+move 21 from 1 to 8
+move 1 from 2 to 8
+move 19 from 8 to 4
+move 1 from 8 to 3
+move 16 from 4 to 8
+move 1 from 4 to 2
+move 2 from 1 to 5
+move 1 from 2 to 3
+move 1 from 4 to 5
+move 1 from 4 to 8
+move 2 from 1 to 3
+move 3 from 3 to 2
+move 5 from 9 to 1
+move 1 from 3 to 4
+move 4 from 9 to 4
+move 2 from 1 to 9
+move 2 from 2 to 5
+move 1 from 2 to 7
+move 3 from 1 to 7
+move 10 from 8 to 6
+move 4 from 8 to 5
+move 3 from 4 to 3
+move 3 from 3 to 4
+move 1 from 9 to 8
+move 2 from 7 to 2
+move 1 from 2 to 1
+move 4 from 9 to 3
diff --git a/2022/src/bin/day_5.rs b/2022/src/bin/day_5.rs
new file mode 100644
index 0000000..f06012c
--- /dev/null
+++ b/2022/src/bin/day_5.rs
@@ -0,0 +1,147 @@
+use nom::{
+ branch::alt,
+ bytes::complete::tag,
+ character::complete::{
+ anychar, char as nom_char, line_ending, not_line_ending, u32 as nom_u32,
+ },
+ combinator::map,
+ multi::separated_list1,
+ sequence::tuple,
+ IResult,
+};
+use std::fs;
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+ let input = fs::read_to_string("inputs/day_5.txt")?;
+ let state = CraneState::parser(&input).unwrap().1;
+
+ let mut state_part_1 = state.clone();
+ while !state_part_1.done() {
+ state_part_1.process_next_instruction(false);
+ }
+ dbg!(state_part_1.read_top_row());
+
+ let mut state_part_2 = state.clone();
+ while !state_part_2.done() {
+ state_part_2.process_next_instruction(true);
+ }
+ dbg!(state_part_2.read_top_row());
+
+ Ok(())
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+struct CraneState {
+ towers: Vec<Tower>,
+ instructions: Vec<Instruction>,
+}
+
+#[derive(Debug, Default, PartialEq, Eq, Clone)]
+struct Tower {
+ crates: Vec<char>,
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+struct Instruction {
+ number: usize,
+ src: usize,
+ dest: usize,
+}
+
+impl CraneState {
+ fn parser(input: &str) -> IResult<&str, CraneState> {
+ let single_crate = alt((
+ map(tuple((tag("["), anychar, tag("]"))), |(_, c, _)| Some(c)),
+ map(tag(" "), |_| None),
+ ));
+ let crate_row = separated_list1(nom_char(' '), single_crate);
+
+ map(
+ tuple((
+ separated_list1(line_ending, crate_row),
+ line_ending,
+ not_line_ending,
+ line_ending,
+ line_ending,
+ separated_list1(line_ending, Instruction::parser),
+ )),
+ |(crate_rows, _, _, _, _, mut instructions)| {
+ let mut towers = Vec::new();
+ for row in &crate_rows {
+ for (i, c) in row
+ .iter()
+ .enumerate()
+ .filter_map(|(i, c)| c.map(|some_c| (i, some_c)))
+ {
+ while i >= towers.len() {
+ towers.push(Tower::default());
+ }
+ towers[i].crates.push(c);
+ }
+ }
+ for tower in &mut towers {
+ tower.crates.reverse();
+ }
+
+ instructions.reverse();
+ CraneState {
+ towers,
+ instructions,
+ }
+ },
+ )(input)
+ }
+
+ fn process_next_instruction(&mut self, maintain_order: bool) {
+ let Some(instruction) = self.instructions.pop() else {
+ return
+ };
+ let mut to_move = Vec::new();
+ for _ in 0..instruction.number {
+ let Some(crate_to_move) = self.towers[instruction.src].crates.pop() else {
+ panic!("Invalid puzzle input: failed to get crate");
+ };
+ to_move.push(crate_to_move);
+ }
+ if maintain_order {
+ to_move.reverse();
+ }
+ for crate_to_move in to_move {
+ self.towers[instruction.dest].crates.push(crate_to_move);
+ }
+ }
+
+ fn done(&self) -> bool {
+ self.instructions.len() == 0
+ }
+
+ fn read_top_row(&self) -> String {
+ let mut res = String::new();
+ for tower in &self.towers {
+ if let Some(top) = tower.crates.last() {
+ res.push(*top);
+ }
+ }
+ res
+ }
+}
+
+impl Instruction {
+ fn parser(input: &str) -> IResult<&str, Instruction> {
+ map(
+ tuple((
+ tag("move "),
+ nom_u32,
+ tag(" from "),
+ nom_u32,
+ tag(" to "),
+ nom_u32,
+ )),
+ |(_, number, _, src, _, dest)| Instruction {
+ number: number as usize,
+ src: (src - 1) as usize,
+ dest: (dest - 1) as usize,
+ },
+ )(input)
+ }
+}