From f7712f98ea3d5dba0117a9f006e16e0827e6ddaf Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Mon, 5 Dec 2022 17:16:06 +0100 Subject: [PATCH] aoc2022 day 05 --- src/aoc2022/day05/input.txt | 514 ++++++++++++++++++++++++++++++++++++ src/aoc2022/day05/mod.rs | 131 +++++++++ src/aoc2022/mod.rs | 1 + src/main.rs | 3 + 4 files changed, 649 insertions(+) create mode 100644 src/aoc2022/day05/input.txt create mode 100644 src/aoc2022/day05/mod.rs diff --git a/src/aoc2022/day05/input.txt b/src/aoc2022/day05/input.txt new file mode 100644 index 0000000..20662a6 --- /dev/null +++ b/src/aoc2022/day05/input.txt @@ -0,0 +1,514 @@ +[T] [P] [J] +[F] [S] [T] [R] [B] +[V] [M] [H] [S] [F] [R] +[Z] [P] [Q] [B] [S] [W] [P] +[C] [Q] [R] [D] [Z] [N] [H] [Q] +[W] [B] [T] [F] [L] [T] [M] [F] [T] +[S] [R] [Z] [V] [G] [R] [Q] [N] [Z] +[Q] [Q] [B] [D] [J] [W] [H] [R] [J] + 1 2 3 4 5 6 7 8 9 + +move 3 from 8 to 2 +move 3 from 1 to 5 +move 3 from 1 to 4 +move 2 from 7 to 4 +move 3 from 7 to 4 +move 8 from 5 to 7 +move 2 from 1 to 8 +move 7 from 3 to 2 +move 1 from 5 to 2 +move 1 from 6 to 7 +move 2 from 5 to 9 +move 1 from 9 to 1 +move 3 from 9 to 6 +move 5 from 6 to 2 +move 10 from 7 to 2 +move 3 from 8 to 9 +move 7 from 9 to 2 +move 1 from 1 to 2 +move 1 from 9 to 6 +move 1 from 4 to 1 +move 1 from 8 to 2 +move 11 from 4 to 2 +move 1 from 7 to 9 +move 1 from 4 to 6 +move 1 from 9 to 7 +move 1 from 1 to 3 +move 1 from 7 to 5 +move 1 from 4 to 9 +move 1 from 5 to 2 +move 1 from 3 to 8 +move 1 from 6 to 9 +move 1 from 8 to 6 +move 11 from 2 to 1 +move 1 from 6 to 8 +move 7 from 2 to 1 +move 14 from 2 to 7 +move 1 from 6 to 3 +move 1 from 8 to 2 +move 1 from 3 to 9 +move 7 from 7 to 1 +move 1 from 6 to 5 +move 5 from 7 to 6 +move 4 from 2 to 8 +move 3 from 6 to 7 +move 3 from 7 to 8 +move 9 from 1 to 3 +move 8 from 3 to 7 +move 1 from 3 to 1 +move 2 from 2 to 3 +move 1 from 6 to 7 +move 2 from 1 to 7 +move 7 from 1 to 6 +move 1 from 3 to 5 +move 2 from 5 to 3 +move 7 from 6 to 3 +move 9 from 7 to 5 +move 1 from 9 to 1 +move 4 from 8 to 5 +move 7 from 1 to 5 +move 4 from 7 to 2 +move 1 from 7 to 8 +move 1 from 6 to 4 +move 10 from 5 to 3 +move 8 from 5 to 1 +move 2 from 8 to 3 +move 2 from 8 to 9 +move 8 from 2 to 7 +move 4 from 9 to 8 +move 13 from 3 to 7 +move 1 from 5 to 3 +move 6 from 3 to 9 +move 10 from 1 to 9 +move 1 from 3 to 4 +move 6 from 9 to 7 +move 1 from 5 to 8 +move 14 from 7 to 6 +move 14 from 6 to 1 +move 13 from 1 to 8 +move 1 from 1 to 2 +move 9 from 8 to 9 +move 6 from 8 to 5 +move 2 from 4 to 6 +move 1 from 8 to 1 +move 2 from 2 to 1 +move 2 from 8 to 6 +move 3 from 1 to 2 +move 3 from 3 to 9 +move 16 from 9 to 1 +move 3 from 2 to 4 +move 3 from 7 to 2 +move 6 from 5 to 4 +move 5 from 7 to 3 +move 4 from 6 to 1 +move 10 from 2 to 9 +move 13 from 9 to 1 +move 5 from 7 to 2 +move 2 from 4 to 6 +move 1 from 9 to 1 +move 2 from 9 to 5 +move 2 from 6 to 8 +move 2 from 5 to 3 +move 1 from 8 to 3 +move 31 from 1 to 7 +move 2 from 1 to 5 +move 12 from 7 to 3 +move 11 from 3 to 2 +move 1 from 8 to 4 +move 6 from 4 to 5 +move 1 from 3 to 4 +move 8 from 3 to 2 +move 5 from 5 to 6 +move 2 from 6 to 7 +move 4 from 7 to 3 +move 1 from 6 to 9 +move 13 from 7 to 6 +move 13 from 2 to 3 +move 1 from 4 to 8 +move 10 from 2 to 3 +move 3 from 7 to 3 +move 2 from 2 to 1 +move 1 from 8 to 2 +move 2 from 4 to 7 +move 1 from 9 to 2 +move 3 from 7 to 3 +move 1 from 5 to 1 +move 2 from 5 to 2 +move 15 from 6 to 7 +move 4 from 1 to 9 +move 22 from 3 to 9 +move 7 from 3 to 9 +move 4 from 3 to 8 +move 4 from 9 to 4 +move 3 from 2 to 4 +move 5 from 7 to 1 +move 7 from 4 to 7 +move 2 from 8 to 4 +move 1 from 4 to 8 +move 3 from 1 to 5 +move 2 from 1 to 4 +move 1 from 2 to 9 +move 2 from 5 to 7 +move 1 from 5 to 9 +move 3 from 8 to 6 +move 8 from 7 to 1 +move 6 from 7 to 1 +move 10 from 1 to 9 +move 3 from 6 to 2 +move 2 from 1 to 3 +move 2 from 3 to 6 +move 3 from 7 to 4 +move 2 from 7 to 1 +move 1 from 2 to 5 +move 13 from 9 to 5 +move 12 from 9 to 3 +move 6 from 5 to 3 +move 2 from 9 to 1 +move 11 from 9 to 3 +move 1 from 4 to 6 +move 2 from 5 to 3 +move 1 from 1 to 8 +move 24 from 3 to 5 +move 2 from 9 to 3 +move 2 from 2 to 4 +move 1 from 9 to 2 +move 2 from 6 to 8 +move 5 from 3 to 5 +move 2 from 8 to 9 +move 1 from 9 to 8 +move 4 from 1 to 4 +move 1 from 9 to 4 +move 1 from 8 to 4 +move 1 from 8 to 4 +move 7 from 4 to 5 +move 1 from 1 to 8 +move 1 from 6 to 5 +move 35 from 5 to 4 +move 18 from 4 to 3 +move 6 from 4 to 3 +move 8 from 5 to 8 +move 8 from 8 to 1 +move 2 from 4 to 9 +move 23 from 3 to 1 +move 1 from 8 to 5 +move 1 from 9 to 1 +move 1 from 5 to 1 +move 1 from 9 to 4 +move 11 from 1 to 2 +move 16 from 4 to 5 +move 3 from 3 to 5 +move 9 from 2 to 5 +move 1 from 4 to 1 +move 2 from 2 to 6 +move 1 from 2 to 9 +move 1 from 6 to 2 +move 1 from 3 to 5 +move 1 from 3 to 9 +move 1 from 2 to 9 +move 23 from 1 to 5 +move 1 from 6 to 9 +move 1 from 9 to 8 +move 27 from 5 to 1 +move 1 from 9 to 3 +move 18 from 5 to 8 +move 6 from 5 to 7 +move 1 from 5 to 6 +move 1 from 9 to 8 +move 12 from 8 to 3 +move 1 from 1 to 4 +move 6 from 7 to 8 +move 1 from 6 to 3 +move 1 from 4 to 2 +move 2 from 1 to 8 +move 1 from 2 to 9 +move 8 from 3 to 2 +move 2 from 9 to 7 +move 5 from 2 to 7 +move 7 from 7 to 2 +move 2 from 8 to 2 +move 3 from 1 to 9 +move 5 from 1 to 2 +move 3 from 9 to 8 +move 3 from 8 to 7 +move 5 from 2 to 5 +move 2 from 7 to 6 +move 12 from 8 to 9 +move 12 from 1 to 4 +move 9 from 9 to 3 +move 4 from 5 to 8 +move 12 from 3 to 8 +move 1 from 7 to 9 +move 3 from 9 to 2 +move 1 from 4 to 7 +move 3 from 1 to 7 +move 7 from 4 to 6 +move 3 from 6 to 2 +move 2 from 7 to 9 +move 18 from 8 to 1 +move 2 from 4 to 7 +move 1 from 2 to 8 +move 1 from 8 to 2 +move 10 from 2 to 3 +move 3 from 9 to 8 +move 2 from 6 to 7 +move 13 from 3 to 1 +move 2 from 8 to 9 +move 28 from 1 to 8 +move 1 from 5 to 2 +move 1 from 4 to 3 +move 4 from 7 to 6 +move 5 from 6 to 7 +move 7 from 2 to 6 +move 1 from 9 to 6 +move 2 from 2 to 4 +move 1 from 9 to 1 +move 4 from 1 to 2 +move 3 from 2 to 5 +move 3 from 4 to 9 +move 3 from 5 to 7 +move 1 from 1 to 4 +move 6 from 7 to 6 +move 1 from 2 to 6 +move 1 from 4 to 1 +move 1 from 1 to 8 +move 3 from 9 to 4 +move 18 from 6 to 3 +move 4 from 3 to 6 +move 1 from 7 to 9 +move 1 from 6 to 9 +move 2 from 3 to 6 +move 1 from 9 to 6 +move 1 from 9 to 2 +move 6 from 6 to 8 +move 3 from 4 to 7 +move 2 from 7 to 2 +move 35 from 8 to 7 +move 3 from 3 to 1 +move 26 from 7 to 2 +move 10 from 3 to 9 +move 6 from 9 to 4 +move 3 from 1 to 2 +move 1 from 4 to 3 +move 4 from 4 to 1 +move 1 from 3 to 6 +move 1 from 8 to 3 +move 1 from 6 to 2 +move 1 from 3 to 2 +move 13 from 7 to 3 +move 3 from 1 to 4 +move 4 from 3 to 1 +move 3 from 1 to 9 +move 2 from 1 to 9 +move 10 from 2 to 9 +move 19 from 2 to 9 +move 6 from 3 to 9 +move 2 from 3 to 4 +move 2 from 2 to 6 +move 17 from 9 to 8 +move 1 from 2 to 8 +move 2 from 9 to 3 +move 2 from 6 to 7 +move 8 from 9 to 3 +move 5 from 4 to 5 +move 14 from 9 to 4 +move 1 from 2 to 3 +move 1 from 7 to 2 +move 2 from 9 to 3 +move 1 from 2 to 7 +move 5 from 5 to 1 +move 1 from 2 to 1 +move 1 from 3 to 1 +move 1 from 9 to 7 +move 3 from 7 to 2 +move 3 from 3 to 7 +move 1 from 2 to 4 +move 1 from 3 to 8 +move 1 from 2 to 4 +move 4 from 3 to 4 +move 16 from 8 to 9 +move 3 from 1 to 4 +move 21 from 4 to 6 +move 1 from 7 to 2 +move 1 from 8 to 2 +move 1 from 1 to 3 +move 6 from 6 to 7 +move 3 from 1 to 9 +move 3 from 7 to 3 +move 1 from 4 to 6 +move 1 from 4 to 7 +move 2 from 2 to 6 +move 1 from 8 to 6 +move 13 from 6 to 7 +move 1 from 2 to 3 +move 15 from 9 to 8 +move 6 from 6 to 3 +move 13 from 8 to 3 +move 4 from 9 to 4 +move 5 from 4 to 8 +move 19 from 3 to 9 +move 3 from 3 to 1 +move 5 from 8 to 9 +move 17 from 9 to 7 +move 1 from 1 to 8 +move 4 from 9 to 6 +move 3 from 3 to 8 +move 1 from 1 to 2 +move 3 from 3 to 1 +move 36 from 7 to 6 +move 1 from 1 to 2 +move 7 from 8 to 2 +move 24 from 6 to 5 +move 2 from 6 to 7 +move 1 from 3 to 2 +move 4 from 6 to 8 +move 19 from 5 to 1 +move 8 from 6 to 4 +move 7 from 2 to 5 +move 3 from 2 to 8 +move 15 from 1 to 6 +move 2 from 9 to 5 +move 2 from 7 to 8 +move 3 from 4 to 1 +move 4 from 5 to 6 +move 1 from 9 to 7 +move 1 from 8 to 3 +move 3 from 6 to 1 +move 2 from 4 to 7 +move 13 from 1 to 8 +move 1 from 3 to 7 +move 1 from 4 to 5 +move 19 from 8 to 6 +move 1 from 7 to 3 +move 8 from 5 to 8 +move 1 from 6 to 8 +move 3 from 5 to 9 +move 1 from 6 to 4 +move 3 from 4 to 7 +move 1 from 3 to 9 +move 4 from 7 to 9 +move 20 from 6 to 3 +move 1 from 8 to 4 +move 2 from 9 to 4 +move 2 from 9 to 2 +move 2 from 9 to 3 +move 13 from 6 to 9 +move 9 from 9 to 8 +move 2 from 6 to 3 +move 8 from 8 to 2 +move 2 from 7 to 3 +move 5 from 9 to 3 +move 12 from 3 to 5 +move 1 from 4 to 7 +move 8 from 2 to 4 +move 8 from 4 to 7 +move 2 from 2 to 6 +move 2 from 8 to 9 +move 2 from 6 to 8 +move 2 from 9 to 6 +move 2 from 6 to 9 +move 2 from 4 to 8 +move 2 from 9 to 2 +move 6 from 3 to 1 +move 2 from 2 to 9 +move 3 from 9 to 3 +move 8 from 7 to 2 +move 6 from 1 to 2 +move 8 from 3 to 8 +move 1 from 7 to 3 +move 5 from 3 to 8 +move 6 from 2 to 7 +move 3 from 7 to 6 +move 2 from 7 to 9 +move 1 from 7 to 8 +move 8 from 5 to 7 +move 7 from 2 to 1 +move 7 from 1 to 6 +move 7 from 7 to 9 +move 1 from 7 to 6 +move 2 from 3 to 9 +move 2 from 8 to 5 +move 25 from 8 to 5 +move 5 from 5 to 1 +move 1 from 6 to 4 +move 17 from 5 to 4 +move 5 from 5 to 4 +move 23 from 4 to 7 +move 2 from 5 to 2 +move 4 from 6 to 3 +move 6 from 3 to 7 +move 1 from 5 to 2 +move 1 from 1 to 7 +move 2 from 2 to 8 +move 2 from 2 to 9 +move 1 from 5 to 7 +move 4 from 1 to 6 +move 2 from 8 to 3 +move 2 from 9 to 4 +move 1 from 4 to 8 +move 7 from 9 to 1 +move 2 from 3 to 5 +move 28 from 7 to 4 +move 4 from 6 to 2 +move 2 from 6 to 2 +move 3 from 7 to 4 +move 2 from 5 to 6 +move 4 from 2 to 6 +move 9 from 6 to 5 +move 4 from 1 to 7 +move 1 from 6 to 2 +move 3 from 2 to 3 +move 1 from 8 to 6 +move 1 from 7 to 4 +move 2 from 3 to 4 +move 1 from 7 to 4 +move 2 from 1 to 6 +move 1 from 7 to 9 +move 1 from 7 to 9 +move 1 from 6 to 2 +move 7 from 5 to 8 +move 1 from 3 to 9 +move 1 from 5 to 2 +move 7 from 8 to 7 +move 4 from 4 to 8 +move 2 from 8 to 4 +move 2 from 2 to 7 +move 1 from 1 to 7 +move 1 from 5 to 6 +move 32 from 4 to 7 +move 2 from 6 to 5 +move 2 from 8 to 2 +move 1 from 2 to 1 +move 2 from 5 to 4 +move 1 from 2 to 5 +move 1 from 1 to 4 +move 4 from 4 to 3 +move 1 from 6 to 4 +move 1 from 5 to 4 +move 5 from 9 to 1 +move 4 from 3 to 5 +move 3 from 1 to 6 +move 2 from 9 to 5 +move 2 from 1 to 3 +move 15 from 7 to 1 +move 5 from 5 to 3 +move 1 from 5 to 2 +move 3 from 4 to 5 +move 2 from 5 to 9 +move 3 from 3 to 6 +move 3 from 3 to 4 +move 1 from 3 to 8 +move 1 from 9 to 3 +move 2 from 4 to 9 +move 1 from 5 to 3 +move 2 from 9 to 6 +move 1 from 8 to 1 +move 1 from 3 to 2 +move 1 from 4 to 9 +move 2 from 9 to 3 +move 9 from 1 to 3 +move 5 from 3 to 4 +move 2 from 1 to 3 +move 4 from 1 to 5 +move 1 from 2 to 8 +move 3 from 4 to 9 + diff --git a/src/aoc2022/day05/mod.rs b/src/aoc2022/day05/mod.rs new file mode 100644 index 0000000..437d7b7 --- /dev/null +++ b/src/aoc2022/day05/mod.rs @@ -0,0 +1,131 @@ +use std::collections::{HashMap, VecDeque}; + +const AMOUNT_OF_STACKS: usize = 9; +const MAX_STACK_HEIGHT: usize = 8; + +fn transform_starting_point(input: &str) -> HashMap> { + let mut collection_of_stacks: HashMap> = HashMap::new(); + + let mut start_situation: Vec<&str> = Vec::new(); + + for line in input.lines() { + if line.is_empty() { + break; + } + start_situation.push(line); + } + + for crate_nr in 1..=MAX_STACK_HEIGHT { + let line = start_situation[MAX_STACK_HEIGHT - crate_nr]; + let chars: Vec = line.chars().collect(); + + for stack_nr in 1..=AMOUNT_OF_STACKS { + let c = chars[1 + ((stack_nr - 1) * 4)]; + if crate_nr == 1 { + collection_of_stacks.insert(stack_nr, VecDeque::new()); + } + + if c.is_ascii_alphabetic() { + collection_of_stacks + .get_mut(&stack_nr) + .unwrap() + .push_back(c); + } + } + } + + // println!("{:?}", collection_of_stacks.get(&1).unwrap()); + // println!("{:?}", collection_of_stacks.get(&2).unwrap()); + // println!("{:?}", collection_of_stacks.get(&3).unwrap()); + // println!("{:?}", collection_of_stacks.get(&4).unwrap()); + // println!("{:?}", collection_of_stacks.get(&6).unwrap()); + + collection_of_stacks +} + +pub fn task_one(input: &str) -> String { + let mut collection_of_stacks = transform_starting_point(&input); + + for line in input.lines().skip(MAX_STACK_HEIGHT + 2) { + if line.is_empty() { + continue; + } + + let mut splitter = line.split_whitespace(); + let amount = splitter.nth(1).unwrap(); + let from = splitter.nth(1).unwrap(); + let to = splitter.nth(1).unwrap(); + + for _ in 1..=amount.parse::().unwrap() { + let source_stack = collection_of_stacks + .get_mut(&from.parse::().unwrap()) + .unwrap(); + let c = source_stack.pop_back().unwrap(); + + let target_stack = collection_of_stacks + .get_mut(&to.parse::().unwrap()) + .unwrap(); + target_stack.push_back(c); + } + } + + let mut solution = String::new(); + + for i in 1..=AMOUNT_OF_STACKS { + solution.push( + collection_of_stacks + .get_mut(&i) + .unwrap() + .pop_back() + .unwrap(), + ); + } + + solution +} + +pub fn task_two(input: &str) -> String { + let mut collection_of_stacks = transform_starting_point(&input); + + for line in input.lines().skip(MAX_STACK_HEIGHT + 2) { + if line.is_empty() { + continue; + } + + let mut splitter = line.split_whitespace(); + let amount = splitter.nth(1).unwrap(); + let from = splitter.nth(1).unwrap(); + let to = splitter.nth(1).unwrap(); + + let source_stack = collection_of_stacks + .get_mut(&from.parse::().unwrap()) + .unwrap(); + let mut cache: VecDeque = VecDeque::new(); + + for _ in 1..=amount.parse::().unwrap() { + let c = source_stack.pop_back().unwrap(); + cache.push_front(c); + } + let target_stack = collection_of_stacks + .get_mut(&to.parse::().unwrap()) + .unwrap(); + + while let Some(c) = cache.pop_front() { + target_stack.push_back(c); + } + } + + let mut solution = String::new(); + + for i in 1..=AMOUNT_OF_STACKS { + solution.push( + collection_of_stacks + .get_mut(&i) + .unwrap() + .pop_back() + .unwrap(), + ); + } + + solution +} diff --git a/src/aoc2022/mod.rs b/src/aoc2022/mod.rs index e051fbd..f290640 100644 --- a/src/aoc2022/mod.rs +++ b/src/aoc2022/mod.rs @@ -2,3 +2,4 @@ pub mod day01; pub mod day02; pub mod day03; pub mod day04; +pub mod day05; diff --git a/src/main.rs b/src/main.rs index 0e5f406..d3f9f45 100644 --- a/src/main.rs +++ b/src/main.rs @@ -48,4 +48,7 @@ fn main() { puzzle = Puzzle { day: 4, year: 2022, task_one: aoc2022::day04::task_one, task_two: aoc2022::day04::task_two }; puzzle.solve_and_print(); + + puzzle = Puzzle { day: 5, year: 2022, task_one: aoc2022::day05::task_one, task_two: aoc2022::day05::task_two }; + puzzle.solve_and_print(); }