From 1a4f3a0969f90662b07b0e89ae037f8fce154a76 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Mon, 5 Dec 2022 18:11:05 -0600 Subject: [PATCH] Day 5. Parsing stuff is... not easy yet. I should probably learn regex --- day5/Cargo.lock | 7 + day5/Cargo.toml | 8 + day5/data.txt | 511 +++++++++++++++++++++++++++++++++++++++++++++++ day5/src/main.rs | 74 +++++++ day5/test.txt | 9 + 5 files changed, 609 insertions(+) create mode 100644 day5/Cargo.lock create mode 100644 day5/Cargo.toml create mode 100644 day5/data.txt create mode 100644 day5/src/main.rs create mode 100644 day5/test.txt diff --git a/day5/Cargo.lock b/day5/Cargo.lock new file mode 100644 index 0000000..7a62bb0 --- /dev/null +++ b/day5/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day5" +version = "0.1.0" diff --git a/day5/Cargo.toml b/day5/Cargo.toml new file mode 100644 index 0000000..f9b62bf --- /dev/null +++ b/day5/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day5" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/day5/data.txt b/day5/data.txt new file mode 100644 index 0000000..b5eebfc --- /dev/null +++ b/day5/data.txt @@ -0,0 +1,511 @@ +[V] [B] [C] +[C] [N] [G] [W] [P] +[W] [C] [Q] [S] [C] [M] +[L] [W] [B] [Z] [F] [S] [V] +[R] [G] [H] [F] [P] [V] [M] [T] +[M] [L] [R] [D] [L] [N] [P] [D] [W] +[F] [Q] [S] [C] [G] [G] [Z] [P] [N] +[Q] [D] [P] [L] [V] [D] [D] [C] [Z] + 1 2 3 4 5 6 7 8 9 + +move 1 from 9 to 2 +move 4 from 6 to 1 +move 4 from 2 to 6 +move 5 from 8 to 7 +move 4 from 9 to 2 +move 1 from 5 to 8 +move 1 from 3 to 1 +move 2 from 3 to 1 +move 1 from 4 to 2 +move 11 from 7 to 2 +move 5 from 5 to 1 +move 1 from 6 to 8 +move 1 from 7 to 6 +move 3 from 6 to 7 +move 1 from 3 to 2 +move 1 from 6 to 8 +move 11 from 2 to 1 +move 1 from 9 to 8 +move 1 from 3 to 7 +move 4 from 7 to 9 +move 3 from 3 to 7 +move 4 from 8 to 2 +move 3 from 7 to 6 +move 2 from 6 to 3 +move 5 from 4 to 1 +move 1 from 6 to 5 +move 26 from 1 to 7 +move 1 from 4 to 6 +move 22 from 7 to 5 +move 4 from 9 to 1 +move 3 from 7 to 3 +move 1 from 6 to 3 +move 6 from 1 to 7 +move 2 from 7 to 5 +move 8 from 1 to 9 +move 4 from 3 to 4 +move 10 from 2 to 7 +move 6 from 7 to 4 +move 2 from 9 to 5 +move 1 from 5 to 1 +move 8 from 4 to 1 +move 2 from 5 to 9 +move 1 from 3 to 6 +move 1 from 9 to 1 +move 1 from 3 to 6 +move 2 from 5 to 2 +move 1 from 4 to 2 +move 1 from 2 to 3 +move 7 from 1 to 4 +move 9 from 7 to 4 +move 1 from 3 to 4 +move 2 from 2 to 4 +move 5 from 9 to 6 +move 1 from 4 to 5 +move 2 from 9 to 3 +move 1 from 1 to 6 +move 2 from 6 to 1 +move 2 from 6 to 5 +move 2 from 9 to 7 +move 1 from 3 to 9 +move 1 from 9 to 5 +move 2 from 7 to 3 +move 1 from 1 to 7 +move 7 from 4 to 5 +move 2 from 1 to 2 +move 3 from 3 to 8 +move 3 from 8 to 9 +move 31 from 5 to 8 +move 1 from 7 to 1 +move 1 from 2 to 1 +move 1 from 1 to 5 +move 1 from 5 to 6 +move 2 from 5 to 7 +move 10 from 4 to 9 +move 5 from 6 to 2 +move 3 from 2 to 6 +move 2 from 7 to 8 +move 1 from 6 to 3 +move 1 from 4 to 1 +move 1 from 3 to 6 +move 1 from 4 to 2 +move 2 from 1 to 2 +move 1 from 8 to 7 +move 10 from 8 to 2 +move 13 from 2 to 9 +move 1 from 1 to 5 +move 18 from 8 to 2 +move 21 from 9 to 6 +move 1 from 7 to 8 +move 2 from 9 to 7 +move 1 from 2 to 3 +move 1 from 7 to 8 +move 9 from 2 to 4 +move 1 from 7 to 8 +move 3 from 9 to 1 +move 1 from 8 to 1 +move 6 from 2 to 3 +move 5 from 4 to 7 +move 1 from 5 to 8 +move 2 from 4 to 3 +move 5 from 7 to 3 +move 2 from 2 to 7 +move 15 from 6 to 1 +move 12 from 1 to 2 +move 6 from 2 to 9 +move 4 from 9 to 5 +move 4 from 5 to 6 +move 14 from 3 to 9 +move 1 from 6 to 7 +move 1 from 7 to 2 +move 1 from 7 to 8 +move 9 from 2 to 6 +move 1 from 1 to 6 +move 2 from 9 to 8 +move 4 from 9 to 7 +move 1 from 1 to 5 +move 8 from 8 to 3 +move 1 from 5 to 4 +move 2 from 1 to 2 +move 3 from 1 to 4 +move 9 from 6 to 2 +move 1 from 7 to 4 +move 1 from 8 to 2 +move 1 from 6 to 4 +move 4 from 7 to 8 +move 12 from 6 to 8 +move 3 from 2 to 1 +move 6 from 8 to 7 +move 5 from 3 to 6 +move 3 from 3 to 6 +move 3 from 1 to 3 +move 8 from 2 to 9 +move 2 from 4 to 5 +move 2 from 7 to 2 +move 10 from 8 to 5 +move 3 from 3 to 2 +move 10 from 5 to 3 +move 1 from 4 to 3 +move 1 from 2 to 1 +move 1 from 1 to 7 +move 14 from 9 to 6 +move 5 from 2 to 4 +move 15 from 6 to 5 +move 3 from 9 to 3 +move 1 from 8 to 6 +move 1 from 3 to 8 +move 7 from 3 to 8 +move 16 from 5 to 1 +move 2 from 7 to 1 +move 1 from 5 to 9 +move 2 from 9 to 3 +move 15 from 1 to 5 +move 3 from 8 to 2 +move 3 from 3 to 1 +move 3 from 7 to 3 +move 8 from 4 to 6 +move 5 from 1 to 6 +move 9 from 5 to 7 +move 2 from 8 to 3 +move 2 from 2 to 7 +move 1 from 1 to 4 +move 2 from 5 to 8 +move 4 from 3 to 1 +move 4 from 8 to 1 +move 1 from 8 to 6 +move 9 from 7 to 6 +move 2 from 7 to 5 +move 3 from 1 to 8 +move 1 from 4 to 8 +move 1 from 2 to 4 +move 12 from 6 to 2 +move 3 from 8 to 6 +move 1 from 4 to 7 +move 2 from 6 to 8 +move 5 from 5 to 9 +move 13 from 2 to 9 +move 2 from 4 to 7 +move 13 from 9 to 5 +move 2 from 6 to 5 +move 1 from 3 to 9 +move 6 from 9 to 4 +move 5 from 1 to 3 +move 1 from 7 to 9 +move 15 from 5 to 8 +move 2 from 4 to 7 +move 2 from 4 to 6 +move 1 from 4 to 6 +move 1 from 5 to 7 +move 18 from 6 to 2 +move 2 from 7 to 3 +move 3 from 6 to 7 +move 3 from 2 to 8 +move 5 from 7 to 3 +move 1 from 9 to 6 +move 2 from 3 to 8 +move 11 from 3 to 2 +move 2 from 2 to 9 +move 1 from 6 to 2 +move 1 from 7 to 5 +move 1 from 5 to 9 +move 9 from 8 to 4 +move 1 from 4 to 6 +move 2 from 3 to 1 +move 2 from 1 to 5 +move 12 from 8 to 3 +move 1 from 8 to 2 +move 14 from 3 to 4 +move 1 from 6 to 4 +move 1 from 5 to 4 +move 20 from 2 to 7 +move 2 from 9 to 5 +move 1 from 5 to 3 +move 1 from 9 to 2 +move 1 from 2 to 8 +move 2 from 2 to 3 +move 5 from 4 to 5 +move 6 from 5 to 7 +move 2 from 8 to 2 +move 3 from 3 to 9 +move 5 from 4 to 5 +move 2 from 9 to 7 +move 2 from 2 to 3 +move 1 from 9 to 3 +move 22 from 7 to 3 +move 4 from 7 to 4 +move 24 from 3 to 6 +move 4 from 2 to 6 +move 18 from 6 to 9 +move 15 from 4 to 6 +move 8 from 6 to 3 +move 6 from 6 to 1 +move 7 from 9 to 6 +move 2 from 7 to 4 +move 8 from 3 to 9 +move 14 from 6 to 3 +move 2 from 3 to 9 +move 1 from 9 to 6 +move 13 from 9 to 1 +move 3 from 4 to 5 +move 1 from 9 to 6 +move 5 from 1 to 8 +move 3 from 3 to 9 +move 2 from 1 to 5 +move 8 from 5 to 8 +move 10 from 3 to 5 +move 3 from 4 to 6 +move 6 from 1 to 9 +move 4 from 5 to 3 +move 5 from 8 to 2 +move 6 from 6 to 3 +move 7 from 3 to 6 +move 1 from 3 to 4 +move 5 from 8 to 7 +move 5 from 2 to 6 +move 2 from 7 to 3 +move 3 from 7 to 3 +move 1 from 4 to 9 +move 9 from 6 to 9 +move 2 from 6 to 2 +move 1 from 8 to 2 +move 2 from 8 to 7 +move 5 from 1 to 5 +move 1 from 1 to 4 +move 13 from 5 to 7 +move 5 from 3 to 7 +move 1 from 5 to 6 +move 1 from 4 to 6 +move 3 from 2 to 8 +move 1 from 3 to 5 +move 1 from 3 to 8 +move 14 from 7 to 4 +move 1 from 5 to 6 +move 7 from 6 to 9 +move 6 from 7 to 9 +move 2 from 8 to 9 +move 2 from 8 to 1 +move 31 from 9 to 1 +move 13 from 4 to 2 +move 1 from 4 to 3 +move 10 from 2 to 7 +move 1 from 3 to 4 +move 1 from 2 to 7 +move 3 from 7 to 8 +move 1 from 4 to 1 +move 3 from 8 to 5 +move 32 from 1 to 5 +move 3 from 9 to 7 +move 4 from 9 to 6 +move 2 from 2 to 7 +move 2 from 1 to 7 +move 1 from 6 to 1 +move 1 from 9 to 4 +move 3 from 6 to 4 +move 1 from 1 to 8 +move 15 from 5 to 1 +move 1 from 8 to 4 +move 9 from 5 to 7 +move 1 from 9 to 8 +move 1 from 8 to 1 +move 10 from 1 to 9 +move 1 from 4 to 2 +move 2 from 9 to 5 +move 4 from 9 to 6 +move 1 from 2 to 7 +move 3 from 4 to 2 +move 1 from 1 to 5 +move 5 from 1 to 5 +move 1 from 4 to 9 +move 3 from 6 to 7 +move 23 from 7 to 6 +move 1 from 2 to 4 +move 1 from 2 to 5 +move 9 from 5 to 4 +move 1 from 2 to 5 +move 9 from 5 to 6 +move 1 from 9 to 7 +move 1 from 9 to 3 +move 3 from 9 to 4 +move 14 from 6 to 3 +move 5 from 7 to 4 +move 1 from 7 to 5 +move 1 from 5 to 9 +move 2 from 5 to 6 +move 16 from 6 to 2 +move 2 from 6 to 1 +move 7 from 4 to 8 +move 2 from 1 to 2 +move 4 from 3 to 5 +move 5 from 4 to 7 +move 2 from 6 to 7 +move 4 from 4 to 1 +move 4 from 8 to 9 +move 1 from 4 to 5 +move 1 from 6 to 8 +move 1 from 4 to 9 +move 4 from 1 to 7 +move 1 from 9 to 4 +move 2 from 2 to 7 +move 7 from 3 to 9 +move 15 from 2 to 3 +move 4 from 8 to 6 +move 1 from 4 to 7 +move 2 from 9 to 7 +move 1 from 6 to 8 +move 2 from 7 to 2 +move 5 from 7 to 2 +move 1 from 5 to 2 +move 6 from 2 to 9 +move 3 from 7 to 1 +move 3 from 1 to 2 +move 3 from 7 to 1 +move 2 from 2 to 9 +move 2 from 6 to 9 +move 1 from 8 to 3 +move 19 from 3 to 9 +move 1 from 6 to 3 +move 3 from 7 to 4 +move 1 from 2 to 5 +move 2 from 1 to 9 +move 2 from 2 to 3 +move 33 from 9 to 7 +move 1 from 1 to 7 +move 3 from 3 to 7 +move 1 from 3 to 2 +move 1 from 5 to 8 +move 4 from 9 to 7 +move 1 from 5 to 2 +move 2 from 4 to 9 +move 4 from 9 to 7 +move 3 from 2 to 1 +move 1 from 4 to 3 +move 1 from 9 to 7 +move 1 from 8 to 3 +move 7 from 7 to 3 +move 3 from 1 to 9 +move 4 from 9 to 7 +move 4 from 5 to 8 +move 3 from 3 to 4 +move 3 from 4 to 5 +move 3 from 3 to 6 +move 2 from 6 to 5 +move 38 from 7 to 5 +move 40 from 5 to 3 +move 4 from 8 to 9 +move 1 from 6 to 9 +move 1 from 5 to 1 +move 3 from 7 to 6 +move 1 from 7 to 5 +move 38 from 3 to 8 +move 1 from 1 to 9 +move 3 from 9 to 6 +move 5 from 3 to 9 +move 4 from 8 to 6 +move 1 from 7 to 1 +move 3 from 5 to 9 +move 1 from 1 to 2 +move 10 from 8 to 3 +move 5 from 8 to 1 +move 3 from 1 to 2 +move 9 from 6 to 7 +move 9 from 3 to 5 +move 1 from 7 to 6 +move 1 from 3 to 8 +move 1 from 7 to 9 +move 1 from 1 to 5 +move 1 from 1 to 3 +move 1 from 9 to 2 +move 4 from 2 to 3 +move 1 from 2 to 4 +move 9 from 8 to 1 +move 2 from 9 to 5 +move 2 from 1 to 2 +move 2 from 3 to 4 +move 6 from 8 to 6 +move 10 from 5 to 3 +move 7 from 3 to 2 +move 2 from 1 to 2 +move 5 from 1 to 7 +move 7 from 9 to 6 +move 7 from 6 to 5 +move 1 from 4 to 3 +move 7 from 7 to 4 +move 5 from 3 to 9 +move 7 from 2 to 6 +move 4 from 7 to 8 +move 5 from 8 to 9 +move 1 from 2 to 6 +move 1 from 3 to 5 +move 2 from 2 to 8 +move 8 from 4 to 6 +move 7 from 9 to 7 +move 4 from 7 to 9 +move 7 from 9 to 3 +move 8 from 3 to 1 +move 6 from 5 to 9 +move 8 from 1 to 8 +move 13 from 8 to 4 +move 3 from 9 to 6 +move 1 from 8 to 6 +move 1 from 7 to 3 +move 2 from 4 to 1 +move 5 from 9 to 1 +move 1 from 3 to 7 +move 15 from 6 to 1 +move 1 from 7 to 9 +move 10 from 4 to 7 +move 11 from 7 to 5 +move 17 from 1 to 6 +move 1 from 9 to 3 +move 6 from 6 to 1 +move 3 from 5 to 3 +move 2 from 4 to 5 +move 2 from 7 to 8 +move 12 from 5 to 3 +move 13 from 6 to 9 +move 2 from 8 to 2 +move 2 from 5 to 1 +move 16 from 3 to 8 +move 3 from 2 to 3 +move 2 from 3 to 7 +move 2 from 7 to 9 +move 1 from 3 to 7 +move 4 from 8 to 4 +move 2 from 4 to 8 +move 5 from 1 to 5 +move 2 from 4 to 7 +move 6 from 6 to 8 +move 2 from 8 to 5 +move 2 from 1 to 4 +move 5 from 8 to 7 +move 5 from 6 to 3 +move 6 from 9 to 8 +move 2 from 9 to 2 +move 1 from 1 to 7 +move 4 from 5 to 3 +move 2 from 2 to 3 +move 1 from 4 to 9 +move 10 from 3 to 6 +move 1 from 3 to 7 +move 10 from 7 to 2 +move 2 from 5 to 3 +move 1 from 4 to 2 +move 2 from 6 to 8 +move 3 from 6 to 5 +move 1 from 6 to 1 +move 7 from 2 to 3 +move 6 from 8 to 7 +move 4 from 6 to 3 +move 14 from 8 to 6 +move 11 from 6 to 8 +move 1 from 1 to 4 +move 6 from 7 to 2 +move 3 from 5 to 8 +move 4 from 1 to 7 +move 1 from 2 to 8 +move 1 from 2 to 6 +move 1 from 3 to 4 +move 1 from 5 to 6 +move 7 from 8 to 6 +move 9 from 3 to 2 +move 1 from 8 to 5 diff --git a/day5/src/main.rs b/day5/src/main.rs new file mode 100644 index 0000000..aeb6af0 --- /dev/null +++ b/day5/src/main.rs @@ -0,0 +1,74 @@ +#[derive(Debug)] +struct Move { + num: usize, + from: usize, + to: usize, +} + +fn main() { + let contents = std::fs::read_to_string("data.txt").expect("Failed to read file"); + let (crates, moves) = contents.split_once("\n\n").unwrap(); // break into 2 parts + let moves: Vec = moves.trim().split('\n').map(line_to_move).collect(); + let crate_lines: Vec<&str> = crates.split('\n').collect(); + let crate_lines = &crate_lines[0..crate_lines.len() - 1]; // remove the stack numbers line + let crate_lines: Vec> = crate_lines.iter().map(|x| clean_crates(&x)).collect(); + + // Part 1 + let mut stacks_part1 = lines_to_crates(&crate_lines); + rearrange(&mut stacks_part1, &moves, false); + let tops: String = stacks_part1.iter().map(|x| x.last().unwrap()).collect(); + println!("Tops part 1: {:?}", tops); + + // Part 2 + let mut stacks_part2 = lines_to_crates(&crate_lines); + rearrange(&mut stacks_part2, &moves, true); + let tops: String = stacks_part2.iter().map(|x| x.last().unwrap()).collect(); + println!("Tops part 2: {:?}", tops); +} + +fn line_to_move(line: &str) -> Move { + let parts: Vec<&str> = line.split(' ').collect(); + + Move { + num: parts[1].parse().unwrap(), + from: parts[3].parse().unwrap(), + to: parts[5].parse().unwrap(), + } +} + +// strip spaces and brackets from the crates lines +fn clean_crates(line: &str) -> Vec { + let chars = line.chars().collect::>(); + let chunks = chars.chunks(4).collect::>(); + chunks.iter().map(|x| x[1]).collect() +} + +fn lines_to_crates(lines: &Vec>) -> Vec> { + let mut crates: Vec> = Vec::new(); + + for col in 0..lines[0].len() { + let mut stack = Vec::new(); + for row in (0..lines.len()).rev() { + let val = lines[row][col]; + if val != ' ' { + stack.push(val); + } + } + crates.push(stack); + } + crates +} + +fn rearrange(crates: &mut Vec>, moves: &Vec, reverse: bool) -> () { + for m in moves { + let mut temp: Vec = Vec::new(); + for _ in 0..m.num { + let val = crates[m.from - 1].pop().unwrap(); + temp.push(val); + } + if reverse { + temp.reverse(); + } + crates[m.to - 1].append(&mut temp); + } +} diff --git a/day5/test.txt b/day5/test.txt new file mode 100644 index 0000000..84933bb --- /dev/null +++ b/day5/test.txt @@ -0,0 +1,9 @@ + [D] +[N] [C] +[Z] [M] [P] + 1 2 3 + +move 1 from 2 to 1 +move 3 from 1 to 3 +move 2 from 2 to 1 +move 1 from 1 to 2