From 44adc1a4af56b1c824505ca67c3826a32ab8349b Mon Sep 17 00:00:00 2001 From: JonOfUs Date: Mon, 5 Dec 2022 15:33:19 +0100 Subject: [PATCH] Day 5 --- res/05/input.txt | 512 +++++++++++++++++++++++++++++++++++++++++++++++ src/d05.rs | 108 ++++++++++ src/main.rs | 4 +- 3 files changed, 622 insertions(+), 2 deletions(-) create mode 100644 res/05/input.txt create mode 100644 src/d05.rs diff --git a/res/05/input.txt b/res/05/input.txt new file mode 100644 index 0000000..75faefa --- /dev/null +++ b/res/05/input.txt @@ -0,0 +1,512 @@ +[P] [L] [T] +[L] [M] [G] [G] [S] +[M] [Q] [W] [H] [R] [G] +[N] [F] [M] [D] [V] [R] [N] +[W] [G] [Q] [P] [J] [F] [M] [C] +[V] [H] [B] [F] [H] [M] [B] [H] [B] +[B] [Q] [D] [T] [T] [B] [N] [L] [D] +[H] [M] [N] [Z] [M] [C] [M] [P] [P] + 1 2 3 4 5 6 7 8 9 + +move 8 from 3 to 2 +move 1 from 9 to 5 +move 5 from 4 to 7 +move 6 from 1 to 4 +move 8 from 6 to 8 +move 8 from 4 to 5 +move 4 from 9 to 5 +move 4 from 7 to 9 +move 7 from 7 to 2 +move 4 from 5 to 2 +move 11 from 8 to 3 +move 3 from 9 to 7 +move 11 from 2 to 8 +move 13 from 8 to 4 +move 11 from 5 to 6 +move 8 from 2 to 4 +move 1 from 5 to 4 +move 1 from 3 to 2 +move 2 from 2 to 1 +move 2 from 8 to 5 +move 3 from 7 to 5 +move 1 from 4 to 7 +move 9 from 6 to 7 +move 1 from 6 to 5 +move 1 from 1 to 4 +move 3 from 1 to 9 +move 15 from 4 to 3 +move 2 from 4 to 1 +move 1 from 1 to 9 +move 3 from 4 to 5 +move 1 from 4 to 1 +move 1 from 7 to 2 +move 1 from 6 to 3 +move 5 from 7 to 1 +move 19 from 3 to 9 +move 7 from 1 to 2 +move 24 from 9 to 7 +move 23 from 7 to 1 +move 1 from 4 to 6 +move 3 from 7 to 3 +move 1 from 6 to 1 +move 6 from 2 to 1 +move 21 from 1 to 9 +move 5 from 3 to 8 +move 2 from 2 to 5 +move 10 from 9 to 5 +move 1 from 2 to 1 +move 5 from 1 to 3 +move 6 from 3 to 4 +move 1 from 2 to 8 +move 3 from 5 to 2 +move 4 from 9 to 3 +move 13 from 5 to 9 +move 2 from 7 to 2 +move 3 from 4 to 7 +move 1 from 7 to 8 +move 5 from 1 to 3 +move 1 from 7 to 5 +move 1 from 8 to 1 +move 2 from 2 to 7 +move 19 from 9 to 2 +move 5 from 2 to 3 +move 7 from 5 to 9 +move 1 from 1 to 9 +move 5 from 9 to 2 +move 4 from 9 to 3 +move 20 from 3 to 9 +move 1 from 3 to 9 +move 3 from 7 to 3 +move 16 from 2 to 3 +move 12 from 3 to 4 +move 2 from 2 to 5 +move 1 from 2 to 4 +move 2 from 4 to 1 +move 4 from 8 to 1 +move 15 from 9 to 3 +move 2 from 5 to 3 +move 3 from 2 to 8 +move 5 from 8 to 5 +move 7 from 3 to 4 +move 2 from 9 to 6 +move 15 from 3 to 1 +move 3 from 1 to 8 +move 3 from 9 to 5 +move 9 from 4 to 1 +move 3 from 3 to 5 +move 2 from 6 to 5 +move 9 from 1 to 3 +move 1 from 9 to 4 +move 1 from 5 to 2 +move 3 from 8 to 5 +move 10 from 1 to 6 +move 12 from 4 to 8 +move 1 from 2 to 7 +move 2 from 5 to 6 +move 1 from 1 to 4 +move 7 from 3 to 6 +move 1 from 7 to 2 +move 2 from 4 to 9 +move 3 from 1 to 7 +move 1 from 9 to 8 +move 1 from 2 to 3 +move 3 from 1 to 7 +move 5 from 8 to 2 +move 5 from 7 to 1 +move 9 from 6 to 8 +move 6 from 6 to 9 +move 8 from 8 to 6 +move 1 from 7 to 4 +move 5 from 2 to 4 +move 7 from 5 to 1 +move 5 from 8 to 9 +move 11 from 6 to 7 +move 9 from 9 to 1 +move 2 from 7 to 5 +move 1 from 9 to 5 +move 1 from 3 to 6 +move 3 from 4 to 6 +move 1 from 8 to 2 +move 2 from 3 to 6 +move 6 from 5 to 2 +move 3 from 5 to 9 +move 3 from 2 to 1 +move 1 from 4 to 3 +move 3 from 2 to 7 +move 1 from 8 to 9 +move 1 from 2 to 8 +move 8 from 7 to 5 +move 1 from 7 to 8 +move 3 from 5 to 6 +move 5 from 5 to 2 +move 1 from 4 to 1 +move 1 from 3 to 2 +move 4 from 1 to 5 +move 4 from 2 to 6 +move 6 from 1 to 2 +move 5 from 9 to 3 +move 2 from 5 to 3 +move 3 from 3 to 6 +move 10 from 6 to 4 +move 4 from 8 to 5 +move 5 from 5 to 1 +move 21 from 1 to 7 +move 3 from 2 to 9 +move 1 from 5 to 2 +move 4 from 2 to 9 +move 8 from 4 to 8 +move 1 from 2 to 1 +move 7 from 8 to 2 +move 2 from 6 to 1 +move 2 from 1 to 5 +move 1 from 1 to 5 +move 4 from 3 to 7 +move 1 from 9 to 3 +move 4 from 6 to 3 +move 1 from 3 to 8 +move 1 from 3 to 4 +move 2 from 2 to 6 +move 2 from 9 to 7 +move 14 from 7 to 8 +move 10 from 8 to 7 +move 3 from 4 to 6 +move 5 from 2 to 3 +move 3 from 9 to 8 +move 3 from 3 to 4 +move 1 from 2 to 4 +move 1 from 9 to 4 +move 1 from 9 to 5 +move 1 from 5 to 2 +move 3 from 5 to 7 +move 1 from 4 to 6 +move 5 from 3 to 8 +move 1 from 6 to 8 +move 5 from 7 to 6 +move 14 from 8 to 5 +move 2 from 6 to 7 +move 18 from 7 to 2 +move 3 from 6 to 1 +move 5 from 5 to 4 +move 5 from 6 to 2 +move 7 from 2 to 1 +move 1 from 8 to 4 +move 1 from 5 to 1 +move 8 from 1 to 9 +move 10 from 4 to 3 +move 8 from 5 to 3 +move 1 from 4 to 3 +move 2 from 1 to 5 +move 1 from 5 to 3 +move 5 from 3 to 1 +move 1 from 1 to 3 +move 5 from 1 to 6 +move 13 from 3 to 1 +move 3 from 9 to 4 +move 2 from 9 to 6 +move 5 from 6 to 5 +move 6 from 5 to 1 +move 7 from 7 to 9 +move 7 from 9 to 6 +move 1 from 9 to 3 +move 1 from 7 to 9 +move 3 from 9 to 1 +move 12 from 2 to 7 +move 7 from 6 to 2 +move 22 from 1 to 7 +move 1 from 6 to 5 +move 4 from 7 to 6 +move 1 from 5 to 6 +move 2 from 4 to 1 +move 1 from 4 to 1 +move 23 from 7 to 9 +move 4 from 6 to 2 +move 4 from 7 to 3 +move 1 from 1 to 9 +move 6 from 2 to 1 +move 1 from 7 to 2 +move 7 from 2 to 8 +move 2 from 3 to 8 +move 3 from 1 to 9 +move 1 from 2 to 8 +move 5 from 8 to 3 +move 3 from 2 to 1 +move 2 from 7 to 8 +move 10 from 9 to 8 +move 4 from 1 to 3 +move 14 from 3 to 4 +move 7 from 4 to 5 +move 1 from 6 to 9 +move 5 from 5 to 8 +move 1 from 6 to 4 +move 6 from 9 to 4 +move 3 from 8 to 4 +move 1 from 5 to 1 +move 3 from 4 to 3 +move 9 from 4 to 3 +move 5 from 3 to 6 +move 5 from 1 to 5 +move 4 from 6 to 2 +move 8 from 9 to 2 +move 2 from 6 to 5 +move 3 from 4 to 7 +move 2 from 2 to 7 +move 2 from 5 to 4 +move 3 from 5 to 9 +move 3 from 4 to 2 +move 10 from 2 to 5 +move 1 from 9 to 8 +move 2 from 2 to 9 +move 3 from 7 to 2 +move 1 from 2 to 9 +move 13 from 5 to 1 +move 2 from 2 to 7 +move 8 from 9 to 2 +move 1 from 4 to 6 +move 1 from 9 to 5 +move 14 from 8 to 4 +move 7 from 4 to 5 +move 4 from 7 to 5 +move 2 from 3 to 8 +move 4 from 1 to 5 +move 2 from 5 to 4 +move 6 from 5 to 6 +move 7 from 2 to 5 +move 1 from 2 to 6 +move 1 from 5 to 2 +move 2 from 2 to 8 +move 2 from 1 to 3 +move 8 from 4 to 7 +move 1 from 4 to 3 +move 6 from 1 to 6 +move 7 from 3 to 9 +move 3 from 7 to 1 +move 2 from 8 to 7 +move 7 from 6 to 9 +move 2 from 3 to 6 +move 6 from 8 to 3 +move 9 from 5 to 3 +move 2 from 7 to 8 +move 2 from 6 to 4 +move 7 from 6 to 9 +move 5 from 3 to 8 +move 10 from 9 to 1 +move 11 from 1 to 8 +move 1 from 3 to 2 +move 4 from 5 to 6 +move 2 from 6 to 2 +move 2 from 7 to 9 +move 3 from 1 to 7 +move 6 from 3 to 9 +move 2 from 7 to 2 +move 2 from 6 to 9 +move 1 from 5 to 9 +move 11 from 9 to 8 +move 1 from 4 to 5 +move 6 from 9 to 8 +move 31 from 8 to 9 +move 1 from 3 to 6 +move 1 from 7 to 1 +move 1 from 4 to 3 +move 1 from 5 to 2 +move 1 from 1 to 8 +move 1 from 8 to 9 +move 1 from 7 to 3 +move 11 from 9 to 6 +move 2 from 3 to 1 +move 2 from 3 to 5 +move 1 from 5 to 4 +move 1 from 4 to 1 +move 6 from 8 to 3 +move 1 from 1 to 4 +move 1 from 4 to 6 +move 2 from 3 to 6 +move 17 from 9 to 2 +move 23 from 2 to 9 +move 14 from 9 to 4 +move 1 from 1 to 7 +move 1 from 5 to 6 +move 8 from 6 to 2 +move 1 from 3 to 2 +move 4 from 9 to 8 +move 5 from 4 to 7 +move 3 from 7 to 2 +move 1 from 1 to 2 +move 2 from 9 to 4 +move 3 from 6 to 9 +move 8 from 4 to 9 +move 2 from 4 to 2 +move 4 from 7 to 2 +move 1 from 7 to 9 +move 4 from 6 to 2 +move 16 from 2 to 1 +move 2 from 3 to 2 +move 18 from 9 to 8 +move 1 from 4 to 2 +move 1 from 6 to 8 +move 1 from 3 to 9 +move 3 from 9 to 5 +move 4 from 9 to 8 +move 6 from 2 to 8 +move 1 from 5 to 1 +move 4 from 2 to 8 +move 1 from 5 to 1 +move 17 from 1 to 4 +move 1 from 5 to 8 +move 10 from 4 to 3 +move 10 from 3 to 1 +move 4 from 4 to 9 +move 1 from 4 to 6 +move 1 from 4 to 8 +move 38 from 8 to 1 +move 27 from 1 to 5 +move 1 from 8 to 2 +move 1 from 6 to 3 +move 1 from 4 to 8 +move 1 from 8 to 4 +move 14 from 1 to 9 +move 1 from 3 to 1 +move 1 from 5 to 1 +move 1 from 2 to 5 +move 2 from 5 to 4 +move 17 from 5 to 8 +move 3 from 4 to 9 +move 2 from 9 to 1 +move 3 from 5 to 7 +move 3 from 7 to 4 +move 2 from 4 to 7 +move 12 from 1 to 4 +move 1 from 7 to 4 +move 1 from 7 to 6 +move 1 from 6 to 9 +move 11 from 4 to 3 +move 1 from 5 to 3 +move 11 from 3 to 9 +move 1 from 3 to 2 +move 3 from 5 to 4 +move 1 from 2 to 4 +move 1 from 5 to 8 +move 13 from 9 to 3 +move 16 from 9 to 1 +move 4 from 8 to 9 +move 2 from 1 to 4 +move 1 from 9 to 1 +move 1 from 9 to 7 +move 1 from 7 to 2 +move 6 from 8 to 3 +move 8 from 4 to 2 +move 4 from 9 to 6 +move 3 from 2 to 3 +move 3 from 6 to 1 +move 3 from 8 to 6 +move 1 from 6 to 8 +move 3 from 6 to 4 +move 11 from 3 to 5 +move 4 from 8 to 2 +move 6 from 3 to 5 +move 3 from 5 to 1 +move 2 from 8 to 3 +move 14 from 5 to 3 +move 4 from 3 to 4 +move 6 from 3 to 5 +move 3 from 2 to 9 +move 4 from 1 to 8 +move 3 from 9 to 6 +move 2 from 6 to 9 +move 6 from 4 to 3 +move 15 from 1 to 4 +move 1 from 6 to 7 +move 5 from 5 to 1 +move 11 from 3 to 1 +move 2 from 9 to 7 +move 1 from 5 to 6 +move 2 from 1 to 3 +move 7 from 2 to 6 +move 4 from 8 to 1 +move 8 from 4 to 2 +move 3 from 6 to 4 +move 5 from 1 to 4 +move 17 from 4 to 8 +move 3 from 3 to 7 +move 4 from 3 to 4 +move 4 from 4 to 2 +move 9 from 8 to 7 +move 1 from 3 to 8 +move 10 from 2 to 4 +move 1 from 6 to 2 +move 2 from 8 to 4 +move 2 from 6 to 9 +move 2 from 6 to 2 +move 1 from 2 to 3 +move 3 from 1 to 4 +move 1 from 3 to 2 +move 1 from 9 to 3 +move 1 from 9 to 7 +move 4 from 8 to 4 +move 10 from 4 to 8 +move 5 from 4 to 3 +move 1 from 2 to 8 +move 5 from 3 to 7 +move 3 from 7 to 8 +move 3 from 4 to 3 +move 8 from 7 to 2 +move 8 from 7 to 8 +move 1 from 3 to 2 +move 3 from 2 to 8 +move 9 from 2 to 5 +move 12 from 1 to 7 +move 21 from 8 to 3 +move 5 from 8 to 6 +move 8 from 7 to 5 +move 6 from 7 to 4 +move 12 from 5 to 7 +move 1 from 8 to 5 +move 2 from 4 to 2 +move 1 from 7 to 6 +move 14 from 3 to 8 +move 5 from 6 to 2 +move 7 from 2 to 6 +move 6 from 8 to 4 +move 11 from 7 to 4 +move 8 from 3 to 7 +move 4 from 5 to 7 +move 9 from 8 to 2 +move 6 from 4 to 1 +move 2 from 5 to 2 +move 1 from 7 to 2 +move 11 from 2 to 3 +move 1 from 2 to 1 +move 7 from 4 to 1 +move 5 from 6 to 8 +move 1 from 2 to 3 +move 2 from 8 to 7 +move 14 from 3 to 7 +move 15 from 7 to 6 +move 4 from 4 to 6 +move 2 from 8 to 3 +move 12 from 1 to 3 +move 1 from 8 to 2 +move 1 from 2 to 3 +move 1 from 3 to 9 +move 1 from 9 to 7 +move 1 from 1 to 4 +move 18 from 6 to 8 +move 3 from 3 to 2 +move 17 from 8 to 3 +move 3 from 7 to 6 +move 3 from 2 to 6 +move 25 from 3 to 7 +move 2 from 4 to 1 +move 9 from 6 to 5 +move 2 from 3 to 1 +move 1 from 3 to 9 +move 5 from 5 to 2 +move 1 from 8 to 3 +move 2 from 4 to 7 +move 1 from 9 to 4 +move 1 from 6 to 7 +move 2 from 5 to 2 +move 2 from 4 to 8 +move 2 from 5 to 8 +move 5 from 7 to 9 +move 27 from 7 to 5 +move 2 from 9 to 6 diff --git a/src/d05.rs b/src/d05.rs new file mode 100644 index 0000000..29eff4c --- /dev/null +++ b/src/d05.rs @@ -0,0 +1,108 @@ +use std::fs; + +pub fn d05() { + let path = "res/05/input.txt"; + + let contents = fs::read_to_string(path).expect("I/O error, wrong path?"); + + let (stacks_str, moves_str) = contents.split_at(contents.find("\n\n").unwrap()); + + // Parse stacks + let stacks_lines: Vec<&str> = stacks_str.split("\n").collect(); + let stacks_max_height = stacks_lines.len() - 1; + let stacks_num = (stacks_lines[0].len() + 1) / 4; + let mut stacks: Vec = (0..stacks_num).map(|_| Stack::new()).collect(); + (0..stacks_max_height).rev().for_each(|i| { + for j in 0..stacks_num { + let chr = stacks_lines[i].chars().collect::>()[j * 4 + 1]; + if chr != ' ' { + stacks[j].push(chr); + } + } + }); + // Copy stacks for task 2 + let mut stacks2: Vec = stacks + .iter() + .map(|stack| Stack { + stack: stack.stack.clone(), + }) + .collect(); + + // Parse moves + let moves: Vec = moves_str + .split("\n") + .filter(|line| *line != "") + .map(|line| { + let words: Vec<&str> = line.split(" ").collect(); + let amount = words[1].parse::().unwrap(); + let from = words[3].parse::().unwrap(); + let to = words[5].parse::().unwrap(); + + Move::new(from, to, amount) + }) + .collect(); + + // Run moves for task 1 + moves.iter().for_each(|mv| { + for _ in 0..mv.amount { + let chr = stacks[(mv.from - 1) as usize].pop(); + stacks[(mv.to - 1) as usize].push(chr); + } + }); + + let res: String = stacks + .iter() + .map(|stack| stack.stack.last().unwrap()) + .collect(); + println!("Result 1: {}", res); + + // Run moves for task 2 + moves.iter().for_each(|mv| { + let mut chrs = Vec::::new(); + for _ in 0..mv.amount { + chrs.push(stacks2[(mv.from - 1) as usize].pop()); + } + chrs.iter().rev().for_each(|c| { + stacks2[(mv.to - 1) as usize].push(*c); + }); + }); + + let res: String = stacks2 + .iter() + .map(|stack| stack.stack.last().unwrap()) + .collect(); + println!("Result 2: {}", res); +} + +struct Stack { + stack: Vec, +} + +impl Stack { + // stack order: 1st element is at the bottom + pub fn new() -> Self { + Stack { + stack: Vec::::new(), + } + } + + pub fn push(&mut self, chr: char) { + self.stack.push(chr) + } + + pub fn pop(&mut self) -> char { + self.stack.pop().unwrap() + } +} + +struct Move { + pub from: i32, + pub to: i32, + pub amount: i32, +} + +impl Move { + pub fn new(from: i32, to: i32, amount: i32) -> Self { + Move { from, to, amount } + } +} diff --git a/src/main.rs b/src/main.rs index 7e0af2b..50db96a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ -mod d04; +mod d05; fn main() { - d04::d04(); + d05::d05(); }