From b5d3ae10d7617d1be6032b30a047383ca61ab7d9 Mon Sep 17 00:00:00 2001 From: talksik Date: Wed, 21 Jun 2023 00:10:45 -0700 Subject: [PATCH] part one working although scrappy --- .gitignore | 1 + Cargo.lock | 7 + Cargo.toml | 8 + input.txt | 513 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 266 +++++++++++++++++++++++++++ 5 files changed, 795 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 input.txt create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..a6a0b84 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day-5" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f08271a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day-5" +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/input.txt b/input.txt new file mode 100644 index 0000000..bc5d8ea --- /dev/null +++ b/input.txt @@ -0,0 +1,513 @@ +[N] [Q] [N] +[R] [F] [Q] [G] [M] +[J] [Z] [T] [R] [H] [J] +[T] [H] [G] [R] [B] [N] [T] +[Z] [J] [J] [G] [F] [Z] [S] [M] +[B] [N] [N] [N] [Q] [W] [L] [Q] [S] +[D] [S] [R] [V] [T] [C] [C] [N] [G] +[F] [R] [C] [F] [L] [Q] [F] [D] [P] + 1 2 3 4 5 6 7 8 9 + +move 3 from 9 to 4 +move 2 from 5 to 2 +move 8 from 1 to 9 +move 4 from 7 to 1 +move 5 from 3 to 8 +move 3 from 3 to 7 +move 11 from 8 to 3 +move 7 from 3 to 6 +move 2 from 5 to 9 +move 3 from 1 to 6 +move 6 from 2 to 4 +move 6 from 7 to 5 +move 1 from 6 to 1 +move 1 from 9 to 4 +move 16 from 4 to 9 +move 2 from 1 to 2 +move 1 from 4 to 6 +move 1 from 3 to 7 +move 2 from 2 to 4 +move 1 from 7 to 9 +move 22 from 9 to 8 +move 1 from 6 to 3 +move 18 from 8 to 5 +move 3 from 8 to 2 +move 3 from 2 to 9 +move 13 from 6 to 7 +move 1 from 6 to 7 +move 4 from 3 to 6 +move 2 from 6 to 3 +move 2 from 3 to 8 +move 3 from 7 to 8 +move 14 from 5 to 2 +move 3 from 2 to 5 +move 2 from 8 to 4 +move 4 from 8 to 6 +move 4 from 6 to 4 +move 11 from 5 to 2 +move 3 from 9 to 2 +move 7 from 2 to 3 +move 11 from 7 to 2 +move 1 from 5 to 7 +move 5 from 6 to 8 +move 30 from 2 to 7 +move 23 from 7 to 2 +move 4 from 3 to 4 +move 3 from 9 to 6 +move 4 from 8 to 2 +move 1 from 8 to 2 +move 2 from 7 to 9 +move 4 from 2 to 3 +move 1 from 5 to 9 +move 6 from 4 to 7 +move 5 from 3 to 6 +move 1 from 3 to 6 +move 1 from 9 to 2 +move 16 from 2 to 5 +move 7 from 7 to 6 +move 9 from 2 to 1 +move 2 from 1 to 4 +move 8 from 5 to 3 +move 5 from 7 to 4 +move 1 from 9 to 8 +move 9 from 3 to 6 +move 25 from 6 to 8 +move 2 from 9 to 5 +move 3 from 4 to 2 +move 7 from 4 to 1 +move 1 from 8 to 7 +move 6 from 5 to 2 +move 11 from 8 to 5 +move 1 from 7 to 9 +move 10 from 1 to 2 +move 6 from 5 to 1 +move 1 from 4 to 2 +move 13 from 8 to 1 +move 17 from 1 to 2 +move 5 from 1 to 9 +move 1 from 8 to 4 +move 1 from 1 to 3 +move 1 from 3 to 6 +move 1 from 9 to 3 +move 2 from 4 to 5 +move 1 from 4 to 8 +move 1 from 9 to 1 +move 8 from 5 to 7 +move 1 from 8 to 1 +move 7 from 7 to 6 +move 2 from 1 to 2 +move 1 from 3 to 6 +move 2 from 5 to 4 +move 8 from 2 to 1 +move 1 from 9 to 7 +move 1 from 5 to 1 +move 2 from 7 to 3 +move 2 from 3 to 7 +move 2 from 7 to 8 +move 2 from 1 to 5 +move 3 from 9 to 2 +move 2 from 8 to 9 +move 1 from 9 to 2 +move 1 from 9 to 8 +move 1 from 8 to 7 +move 6 from 6 to 5 +move 1 from 6 to 2 +move 2 from 4 to 5 +move 2 from 6 to 8 +move 1 from 7 to 1 +move 2 from 8 to 4 +move 11 from 2 to 5 +move 18 from 5 to 6 +move 6 from 2 to 6 +move 10 from 2 to 7 +move 1 from 4 to 3 +move 7 from 2 to 8 +move 7 from 1 to 4 +move 6 from 7 to 8 +move 2 from 7 to 3 +move 8 from 4 to 7 +move 1 from 1 to 3 +move 1 from 2 to 1 +move 4 from 7 to 1 +move 4 from 1 to 3 +move 2 from 3 to 9 +move 2 from 5 to 4 +move 1 from 2 to 1 +move 2 from 1 to 5 +move 1 from 3 to 1 +move 2 from 5 to 2 +move 1 from 2 to 6 +move 5 from 7 to 4 +move 1 from 1 to 2 +move 10 from 8 to 1 +move 2 from 2 to 7 +move 2 from 7 to 1 +move 1 from 7 to 9 +move 1 from 5 to 7 +move 3 from 8 to 7 +move 3 from 3 to 6 +move 3 from 7 to 1 +move 5 from 1 to 4 +move 1 from 7 to 6 +move 22 from 6 to 3 +move 2 from 6 to 2 +move 19 from 3 to 4 +move 15 from 4 to 8 +move 9 from 8 to 4 +move 5 from 6 to 8 +move 2 from 2 to 8 +move 2 from 9 to 4 +move 7 from 1 to 5 +move 1 from 1 to 3 +move 1 from 9 to 7 +move 5 from 8 to 3 +move 4 from 8 to 1 +move 5 from 1 to 5 +move 10 from 4 to 3 +move 3 from 4 to 2 +move 2 from 8 to 3 +move 12 from 4 to 8 +move 1 from 7 to 6 +move 3 from 2 to 9 +move 2 from 4 to 5 +move 5 from 3 to 7 +move 1 from 7 to 2 +move 1 from 1 to 6 +move 1 from 7 to 2 +move 15 from 3 to 8 +move 10 from 5 to 6 +move 3 from 7 to 8 +move 1 from 5 to 8 +move 1 from 2 to 3 +move 7 from 6 to 1 +move 3 from 5 to 3 +move 5 from 3 to 5 +move 3 from 5 to 4 +move 2 from 4 to 9 +move 2 from 3 to 5 +move 14 from 8 to 5 +move 1 from 9 to 1 +move 16 from 5 to 3 +move 16 from 3 to 6 +move 2 from 9 to 8 +move 21 from 6 to 7 +move 2 from 1 to 7 +move 1 from 2 to 7 +move 4 from 1 to 7 +move 1 from 4 to 7 +move 16 from 8 to 5 +move 20 from 7 to 4 +move 1 from 9 to 8 +move 1 from 7 to 4 +move 3 from 8 to 6 +move 1 from 9 to 1 +move 2 from 1 to 4 +move 2 from 5 to 2 +move 5 from 4 to 7 +move 1 from 6 to 9 +move 11 from 7 to 6 +move 2 from 7 to 5 +move 12 from 6 to 2 +move 13 from 2 to 1 +move 1 from 2 to 3 +move 1 from 8 to 4 +move 6 from 4 to 1 +move 1 from 6 to 7 +move 7 from 4 to 9 +move 8 from 9 to 3 +move 2 from 8 to 3 +move 10 from 5 to 4 +move 11 from 1 to 8 +move 1 from 1 to 3 +move 5 from 1 to 8 +move 8 from 5 to 6 +move 13 from 8 to 9 +move 12 from 3 to 5 +move 12 from 5 to 9 +move 1 from 7 to 9 +move 1 from 1 to 2 +move 1 from 1 to 4 +move 3 from 8 to 5 +move 1 from 2 to 5 +move 1 from 4 to 8 +move 5 from 6 to 3 +move 1 from 8 to 4 +move 13 from 4 to 7 +move 3 from 7 to 6 +move 1 from 1 to 4 +move 4 from 4 to 2 +move 1 from 6 to 3 +move 2 from 5 to 9 +move 2 from 5 to 9 +move 1 from 4 to 8 +move 6 from 9 to 4 +move 22 from 9 to 2 +move 8 from 7 to 4 +move 7 from 2 to 1 +move 3 from 3 to 8 +move 2 from 6 to 7 +move 14 from 4 to 2 +move 2 from 6 to 1 +move 1 from 8 to 7 +move 3 from 3 to 9 +move 1 from 8 to 4 +move 3 from 1 to 9 +move 3 from 9 to 3 +move 31 from 2 to 8 +move 8 from 8 to 4 +move 1 from 9 to 1 +move 9 from 4 to 5 +move 7 from 5 to 6 +move 2 from 5 to 1 +move 1 from 2 to 1 +move 1 from 7 to 9 +move 1 from 2 to 9 +move 2 from 6 to 4 +move 4 from 7 to 4 +move 4 from 9 to 8 +move 6 from 4 to 1 +move 1 from 3 to 2 +move 1 from 3 to 6 +move 1 from 9 to 2 +move 2 from 2 to 4 +move 1 from 9 to 1 +move 1 from 3 to 1 +move 17 from 1 to 9 +move 4 from 6 to 2 +move 1 from 9 to 7 +move 4 from 9 to 7 +move 1 from 8 to 4 +move 3 from 7 to 6 +move 1 from 4 to 9 +move 10 from 8 to 5 +move 6 from 6 to 5 +move 1 from 7 to 2 +move 1 from 1 to 4 +move 1 from 4 to 5 +move 9 from 8 to 3 +move 4 from 3 to 9 +move 1 from 4 to 6 +move 1 from 6 to 5 +move 1 from 4 to 8 +move 2 from 3 to 8 +move 1 from 3 to 8 +move 3 from 8 to 9 +move 5 from 2 to 9 +move 1 from 7 to 9 +move 5 from 8 to 7 +move 3 from 8 to 4 +move 2 from 8 to 5 +move 24 from 9 to 7 +move 1 from 3 to 5 +move 2 from 9 to 4 +move 22 from 7 to 9 +move 1 from 3 to 4 +move 6 from 4 to 6 +move 4 from 6 to 7 +move 10 from 5 to 3 +move 8 from 3 to 5 +move 2 from 3 to 4 +move 2 from 4 to 6 +move 10 from 7 to 3 +move 21 from 9 to 1 +move 2 from 3 to 4 +move 4 from 3 to 8 +move 2 from 4 to 8 +move 1 from 7 to 8 +move 4 from 6 to 8 +move 3 from 5 to 4 +move 8 from 8 to 2 +move 18 from 1 to 6 +move 3 from 4 to 1 +move 1 from 2 to 8 +move 5 from 1 to 8 +move 3 from 3 to 6 +move 3 from 2 to 9 +move 3 from 8 to 1 +move 11 from 5 to 2 +move 3 from 8 to 7 +move 10 from 2 to 9 +move 1 from 7 to 9 +move 3 from 8 to 1 +move 2 from 7 to 8 +move 6 from 9 to 5 +move 4 from 2 to 8 +move 8 from 5 to 8 +move 1 from 3 to 7 +move 2 from 5 to 6 +move 3 from 1 to 6 +move 2 from 1 to 6 +move 4 from 9 to 8 +move 4 from 9 to 8 +move 1 from 9 to 4 +move 9 from 6 to 9 +move 16 from 6 to 9 +move 1 from 4 to 7 +move 1 from 2 to 9 +move 5 from 8 to 5 +move 4 from 5 to 1 +move 6 from 1 to 7 +move 12 from 8 to 4 +move 5 from 8 to 1 +move 6 from 9 to 3 +move 1 from 1 to 6 +move 2 from 5 to 8 +move 12 from 4 to 7 +move 2 from 8 to 4 +move 1 from 4 to 8 +move 1 from 7 to 6 +move 1 from 4 to 6 +move 14 from 7 to 1 +move 3 from 3 to 2 +move 7 from 9 to 7 +move 3 from 3 to 5 +move 15 from 1 to 2 +move 2 from 5 to 9 +move 1 from 8 to 9 +move 16 from 9 to 1 +move 1 from 5 to 9 +move 5 from 6 to 2 +move 12 from 7 to 2 +move 20 from 2 to 6 +move 10 from 2 to 6 +move 11 from 1 to 7 +move 2 from 7 to 4 +move 2 from 2 to 5 +move 1 from 2 to 3 +move 2 from 5 to 6 +move 1 from 9 to 5 +move 1 from 5 to 9 +move 25 from 6 to 7 +move 25 from 7 to 6 +move 1 from 3 to 1 +move 1 from 2 to 5 +move 1 from 4 to 3 +move 33 from 6 to 3 +move 1 from 9 to 5 +move 2 from 3 to 5 +move 28 from 3 to 9 +move 5 from 1 to 9 +move 4 from 1 to 8 +move 2 from 3 to 2 +move 2 from 8 to 1 +move 1 from 4 to 6 +move 3 from 5 to 3 +move 1 from 2 to 4 +move 2 from 2 to 8 +move 1 from 6 to 5 +move 30 from 9 to 2 +move 7 from 2 to 6 +move 1 from 1 to 3 +move 1 from 1 to 7 +move 1 from 5 to 6 +move 1 from 5 to 4 +move 5 from 7 to 4 +move 4 from 7 to 3 +move 1 from 3 to 7 +move 3 from 8 to 7 +move 8 from 3 to 1 +move 3 from 1 to 7 +move 4 from 1 to 4 +move 3 from 9 to 8 +move 8 from 6 to 2 +move 18 from 2 to 6 +move 6 from 7 to 2 +move 1 from 1 to 7 +move 3 from 4 to 7 +move 5 from 4 to 8 +move 2 from 8 to 7 +move 7 from 2 to 5 +move 5 from 2 to 7 +move 10 from 7 to 9 +move 5 from 5 to 9 +move 1 from 3 to 9 +move 5 from 2 to 6 +move 3 from 7 to 9 +move 2 from 5 to 6 +move 2 from 2 to 9 +move 2 from 8 to 7 +move 1 from 4 to 5 +move 8 from 9 to 2 +move 5 from 6 to 7 +move 4 from 9 to 1 +move 4 from 8 to 9 +move 12 from 9 to 1 +move 16 from 1 to 4 +move 12 from 6 to 2 +move 3 from 7 to 6 +move 3 from 7 to 3 +move 1 from 9 to 4 +move 12 from 4 to 5 +move 2 from 4 to 3 +move 1 from 7 to 1 +move 4 from 4 to 3 +move 1 from 8 to 2 +move 6 from 3 to 1 +move 1 from 1 to 8 +move 7 from 2 to 5 +move 1 from 8 to 1 +move 4 from 5 to 4 +move 5 from 5 to 9 +move 1 from 3 to 8 +move 1 from 9 to 7 +move 1 from 8 to 1 +move 4 from 5 to 6 +move 5 from 5 to 9 +move 7 from 9 to 5 +move 11 from 6 to 4 +move 1 from 9 to 4 +move 1 from 9 to 1 +move 1 from 7 to 2 +move 9 from 4 to 3 +move 5 from 1 to 9 +move 3 from 5 to 1 +move 5 from 9 to 8 +move 8 from 3 to 1 +move 2 from 5 to 3 +move 7 from 2 to 5 +move 1 from 6 to 4 +move 3 from 5 to 9 +move 3 from 6 to 9 +move 3 from 2 to 9 +move 5 from 3 to 6 +move 1 from 9 to 5 +move 4 from 8 to 3 +move 1 from 8 to 4 +move 8 from 1 to 3 +move 12 from 3 to 7 +move 1 from 2 to 4 +move 3 from 2 to 8 +move 6 from 7 to 6 +move 4 from 5 to 7 +move 5 from 9 to 7 +move 2 from 9 to 2 +move 1 from 9 to 5 +move 4 from 5 to 1 +move 1 from 5 to 4 +move 14 from 7 to 6 +move 1 from 1 to 7 +move 10 from 4 to 5 +move 4 from 1 to 2 +move 1 from 4 to 6 +move 1 from 7 to 4 +move 17 from 6 to 8 +move 1 from 5 to 7 +move 10 from 5 to 4 +move 1 from 2 to 6 +move 4 from 2 to 6 +move 13 from 6 to 1 +move 9 from 4 to 3 +move 2 from 2 to 4 +move 1 from 6 to 7 +move 1 from 4 to 3 +move 8 from 3 to 5 +move 1 from 3 to 4 +move 17 from 1 to 3 +move 15 from 3 to 7 +move 3 from 4 to 1 +move 6 from 8 to 9 +move 6 from 9 to 1 +move 2 from 3 to 1 +move 2 from 5 to 2 +move 6 from 7 to 6 +move 3 from 6 to 9 diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..7474180 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,266 @@ +use std::collections::HashMap; + +// enum that converts string letter to enum rep +// all capital letters in alphabet +#[derive(Debug, Copy, Clone)] +enum Crate { + A, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, + N, + O, + P, + Q, + R, + S, + T, + U, + V, + W, + X, + Y, + Z, +} + +impl From for Crate { + fn from(value: char) -> Self { + match value { + 'A' => Crate::A, + 'B' => Crate::B, + 'C' => Crate::C, + 'D' => Crate::D, + 'E' => Crate::E, + 'F' => Crate::F, + 'G' => Crate::G, + 'H' => Crate::H, + 'I' => Crate::I, + 'J' => Crate::J, + 'K' => Crate::K, + 'L' => Crate::L, + 'M' => Crate::M, + 'N' => Crate::N, + 'O' => Crate::O, + 'P' => Crate::P, + 'Q' => Crate::Q, + 'R' => Crate::R, + 'S' => Crate::S, + 'T' => Crate::T, + 'U' => Crate::U, + 'V' => Crate::V, + 'W' => Crate::W, + 'X' => Crate::X, + 'Y' => Crate::Y, + 'Z' => Crate::Z, + _ => panic!("Invalid crate letter"), + } + } +} + +// the stack number to the crates in that stack +// crates are in order from bottom to top +type Stacks = HashMap>; + +fn get_stacks() -> Stacks { + let mut stacks: Stacks = HashMap::new(); + + stacks.insert( + 1, + vec![ + Crate::F, + Crate::D, + Crate::B, + Crate::Z, + Crate::T, + Crate::J, + Crate::R, + Crate::N, + ], + ); + stacks.insert(2, vec![Crate::R, Crate::S, Crate::N, Crate::J, Crate::H]); + stacks.insert( + 3, + vec![ + Crate::C, + Crate::R, + Crate::N, + Crate::J, + Crate::G, + Crate::Z, + Crate::F, + Crate::Q, + ], + ); + stacks.insert( + 4, + vec![ + Crate::F, + Crate::V, + Crate::N, + Crate::G, + Crate::R, + Crate::T, + Crate::Q, + ], + ); + stacks.insert(5, vec![Crate::L, Crate::T, Crate::Q, Crate::F]); + stacks.insert( + 6, + vec![ + Crate::Q, + Crate::C, + Crate::W, + Crate::Z, + Crate::B, + Crate::R, + Crate::G, + Crate::N, + ], + ); + stacks.insert( + 7, + vec![ + Crate::F, + Crate::C, + Crate::L, + Crate::S, + Crate::N, + Crate::H, + Crate::M, + ], + ); + stacks.insert( + 8, + vec![Crate::D, Crate::N, Crate::Q, Crate::M, Crate::T, Crate::J], + ); + stacks.insert(9, vec![Crate::P, Crate::G, Crate::S]); + + stacks +} + +#[derive(Debug)] +struct Move { + number_crates: u32, + from_stack: u32, + to_stack: u32, +} + +fn read_moves() -> Vec { + let input = std::fs::read_to_string("input.txt").unwrap(); + let mut moves: Vec = Vec::new(); + + for line in input.lines().skip(10) { + let mut split = line.split_whitespace(); + split.next().unwrap(); // "move" + let number_crates = split.next().unwrap().parse::().unwrap(); + split.next().unwrap(); // "from" + let from_stack = split.next().unwrap().parse::().unwrap(); + split.next().unwrap(); // "to" + let to_stack = split.next().unwrap().parse::().unwrap(); + + moves.push(Move { + number_crates, + from_stack, + to_stack, + }); + } + + moves +} + +// part 1: get the last crate in each stack +fn perform_moves(stacks: &mut Stacks, moves: Vec) { + for m in moves { + let from_stack_crates = stacks.get_mut(&m.from_stack).unwrap(); + // remove the last m.number_crates from the stack + let mut crates_to_move = + from_stack_crates.split_off(from_stack_crates.len() - m.number_crates as usize); + + // reverse the crates so that the first one taken is on the bottom + crates_to_move.reverse(); + + // add the crates to the to_stack + let to_stack_crates = stacks.get_mut(&m.to_stack).unwrap(); + to_stack_crates.append(&mut crates_to_move); + } +} + +// do not use, arbitrary order +fn get_the_last_one_in_each_stack(stacks: &Stacks) -> Vec<&Crate> { + let mut last_crates: Vec<&Crate> = Vec::new(); + + for (stack, crates) in stacks { + println!( + "stack: {:?}, last_crate: {:?}", + stack, + crates.last().unwrap() + ); + last_crates.push(crates.last().unwrap()); + } + + last_crates +} + +fn main() { + println!("Hello, world!"); + + let moves = read_moves(); + let mut stacks = get_stacks(); + println!("before moves: {:?}", stacks); + + perform_moves(&mut stacks, moves); + get_the_last_one_in_each_stack(&stacks); + // QNNTGTPVN +} + +#[cfg(test)] +mod tests { + use super::*; + + // todo: finish writing helper to test equality + #[test] + fn test() { + let mut stacks = HashMap::new(); + stacks.insert(1, vec![Crate::Z, Crate::N]); + stacks.insert(2, vec![Crate::M, Crate::C, Crate::D]); + stacks.insert(3, vec![Crate::P]); + + let moves = vec![ + Move { + number_crates: 1, + from_stack: 2, + to_stack: 1, + }, + Move { + number_crates: 3, + from_stack: 1, + to_stack: 3, + }, + Move { + number_crates: 2, + from_stack: 2, + to_stack: 1, + }, + Move { + number_crates: 1, + from_stack: 1, + to_stack: 2, + }, + ]; + + println!("before moves {:?}", &stacks); + perform_moves(&mut stacks, moves); + eprintln!("after moves {:?}", &stacks); + + assert_eq!(1, 1); + } +}