From 44d74aefb7fc63a456a9e5000b66fba943f0fdcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Jons=C3=A9n?= Date: Thu, 1 Dec 2022 10:27:40 +0100 Subject: [PATCH] Day 2 complete --- day2/input.txt | 2500 ++++++++++++++++++++++++++++++++++++++++ day2/part1/Cargo.toml | 8 + day2/part1/src/main.rs | 121 ++ day2/part2/Cargo.toml | 8 + day2/part2/src/main.rs | 139 +++ 5 files changed, 2776 insertions(+) create mode 100644 day2/input.txt create mode 100644 day2/part1/Cargo.toml create mode 100644 day2/part1/src/main.rs create mode 100644 day2/part2/Cargo.toml create mode 100644 day2/part2/src/main.rs diff --git a/day2/input.txt b/day2/input.txt new file mode 100644 index 0000000..cc70403 --- /dev/null +++ b/day2/input.txt @@ -0,0 +1,2500 @@ +C Y +B Y +C Y +B X +B X +B X +C Y +B Z +A Z +A Z +A Z +A Y +A X +A Z +A X +A Z +C Y +A X +A Z +A Z +A Z +A Y +C Y +B Z +B Z +C Y +C Y +C Y +C Y +A X +B Z +C X +B X +A Y +C X +C Y +C Y +B X +C X +B Z +C Y +B X +C Y +B X +B X +C Y +A X +B X +B Z +B X +A Z +B Z +B X +B Y +C Y +A X +C Y +A Z +C Y +C Z +B Z +C Y +C Y +C Y +B Y +B X +B X +A X +B Z +B X +B X +B X +B X +B Y +B X +B X +B X +B X +B Z +B X +B X +B Y +B X +C Y +C Y +B Z +A Z +A X +B X +B X +A X +B X +A X +B X +A Z +B Y +A X +A Y +C Y +A X +A X +C Y +A Z +B X +B Y +C Z +C Y +B X +B X +A Z +B X +B X +C Y +A Z +A Z +B X +C X +B Z +C Y +B X +A Y +C Y +B Z +C Y +B Z +A X +C Y +C Z +B X +B X +C X +A X +B X +B Z +B Z +B Z +A Y +B Z +B X +C Y +B Z +A Z +C Y +C Y +A Z +C Y +B X +B X +C Y +B Z +B Z +C Y +A X +C Y +C Y +B X +B Y +C Y +C Y +A Z +B Z +B X +B X +C Z +C Y +A X +B Z +B Y +C Y +C Y +B X +B Z +C X +B X +C Y +B Z +A X +B X +B Z +A X +C Y +B X +B X +C Y +A X +B X +B Y +A X +A Y +C Y +C Y +B X +A Z +A X +B Y +A X +A X +C X +C Y +B Y +A Z +C X +A X +B Z +B X +B X +C Y +A X +C X +C Y +A X +C Y +B X +B X +C Y +C Y +B X +A X +B X +A X +C Y +B Y +B Z +B X +B X +C X +C Y +B Z +C Y +C Y +B X +A Z +B Z +A Z +A Z +C Y +B X +C Y +C Y +C X +B X +C X +C Z +C Y +B Z +C Z +C Y +A Z +B X +C X +B Y +B Z +C Y +B Z +B Z +B Z +A Z +C X +A Y +B Z +A Z +B Z +B Y +A Z +C Y +C Y +B X +A X +B X +C X +B Y +C Y +B Z +B X +C Y +A X +B Z +B Y +C X +C Y +B X +A Z +A Z +C Y +B Z +B Z +B X +B X +C X +B X +B X +B X +A Z +A X +C Z +B X +A Z +B X +C X +B X +C X +B Z +B X +B X +A X +B Z +B Y +A Z +A Z +C Y +C Y +A Z +A Z +B X +A X +B Z +C X +C Y +C Y +B Z +A X +B Y +B Z +A X +C Y +B Z +A X +B X +B X +C Y +C Z +A Y +A X +C Y +A Z +C X +A Z +A Z +C X +A X +A Z +B Z +A Y +A Z +C Y +B X +B X +B Z +B X +B X +B Y +B X +B X +C Y +B X +A Z +B X +C Y +A Z +B Z +C Y +C X +C Y +B X +C Y +B Y +B X +B Z +C Y +A X +A X +C X +B X +A X +C X +B Y +B Y +A Z +C Z +C Z +A X +C Y +A Y +A Z +B Z +A Z +A X +A Y +B X +B Y +C Y +A X +B Y +C X +C Y +B Z +C Y +A X +B Z +B Z +A X +C X +B X +A X +B Z +C Y +C Y +B Y +A Y +B X +B Z +B X +C Y +B X +C Y +C X +A Z +B Z +C Y +B X +B Z +B Z +B Z +C Y +C X +C X +B X +A X +C Y +C Y +B X +B Z +C Y +A X +B X +B Z +B Z +B Y +A Y +B X +B Z +B X +A X +A Z +A Z +C X +B Y +B Z +C Z +B X +C Y +B X +C Y +B Y +B Z +B Y +B X +A Z +C X +A X +A Z +C Y +B X +C Y +C Y +B X +C Z +B Z +B Z +C X +C Y +A Y +C Y +A Y +B X +B Y +A Z +B Z +B X +B X +A X +C Y +B Z +C Y +B X +A Z +B Z +C Y +B Z +A Z +C Y +B X +B X +C Y +C Y +C Y +B X +C Z +B Z +B X +C Y +C X +B X +C Y +B Y +B Z +B Z +B Y +B Z +B Y +A Z +B X +B X +A Z +C Z +A Z +B X +C Z +A X +B X +C Y +B Z +A Z +C Y +C Y +B Z +A X +C Y +A Z +B X +B Z +B Y +B X +B Z +B X +C Y +A X +B Z +C Y +B Z +B Z +C Y +B X +B X +A Y +C Y +B Z +B Z +B X +B Z +A X +A X +C Y +B X +C Y +A Z +A X +B X +C Y +B Z +A Z +B X +A X +B X +B Y +A X +C Z +A X +B Y +B X +A Y +C Y +A Z +B X +C Y +A X +B X +C Y +A Z +B Y +A Z +B Z +B X +A X +B Y +A X +A Z +B Z +B X +B Z +C Y +C Y +C Y +B X +B Y +A Z +A Z +B X +B X +B Y +A X +A Z +C Y +A Y +B Z +A X +C X +A Z +C X +C Y +C Y +B X +B X +B Z +A X +A Z +B Y +B Z +B X +B Z +B X +C Y +B X +C Y +C Y +B X +B X +C Z +C Y +A X +A Z +C Y +C Y +A X +A Z +A X +C Y +C Y +B X +A X +C Y +B X +B X +A Z +B X +A Z +A Z +C Y +C Y +B X +C Y +B X +A X +C Y +B Z +A X +C Y +B Z +A X +A Z +C Y +C Y +B X +A X +B X +B Z +A Z +C X +B Z +A X +B Z +C Y +B X +A Z +C X +B Z +A Z +A X +C Y +B X +C Y +B X +A Z +B Z +B X +C X +B Z +B Y +C Y +B Z +B Z +B Z +B Z +C Y +C Y +A Z +C Y +C Z +C Z +C Y +C Y +B Z +A Y +B X +A Y +B Z +A Z +C Z +B X +B X +C X +A Z +C Y +A Z +B X +B X +A X +B Z +B X +C X +A Z +B Y +A X +B X +A Z +A X +B Z +C Y +B X +B X +C Y +C Y +B X +A Y +C X +B X +C X +B Y +B X +C Y +C Y +B X +A Z +A Z +A Y +B Z +B Z +B Z +C Y +A X +B X +C Y +C Y +A X +C Y +A Z +B X +A X +A Y +B Z +B Y +B Y +C X +A Z +A Z +B Z +A Z +B Z +B X +A Z +B Z +B Y +B X +B X +B X +A Y +A X +B X +B X +A X +C Y +B Z +C Y +B Y +A X +B Z +A Z +C Y +A X +C Y +B X +B Z +B Z +C Y +B Z +C Y +B X +C Y +A Z +A X +B X +C Y +A X +A X +C Y +C X +C Y +A Z +B Z +A X +C X +C X +C Y +B X +C X +A X +C Y +B Y +A X +C Y +B X +A Z +C Y +C Y +A X +A X +B X +B Y +B Y +A Y +A X +C Y +A X +C X +B X +C Y +C Y +A X +A Z +B Z +B Z +C Y +B Z +B Y +A X +C X +C X +A X +C Y +B Z +A Z +B X +C Y +C Y +C X +C Y +C X +A X +C Y +B X +C X +B X +A Z +B Z +B Z +B Z +B X +B Z +B X +B Y +C Y +C X +A Y +B Z +B Y +C Y +B Z +A X +A X +A Z +C Y +A X +C X +C Y +B Y +B X +B X +A X +B Y +C Y +B X +C X +C X +A Z +A Z +C Y +B X +B Z +C Y +B Z +B Z +C Y +C X +A X +B Z +C Y +C Y +C Y +B Z +B X +C Y +B Z +A X +B X +C Y +A Z +C Y +A Z +A Z +B Z +C Y +A Z +C Y +B X +A X +A X +B Z +C Y +B Y +B X +A Z +B X +C Y +A Z +C Y +A X +A Z +B X +B X +B Y +B X +A Z +C Y +A X +C Y +C Y +C Y +C Z +C Y +A Z +A Y +B Z +C Y +B X +C Y +C Y +A Z +C Z +C Y +B X +C Y +A Z +B Z +B Y +B Z +A Z +B X +B X +C X +B X +B Z +A X +C Y +C Y +C Y +A Z +B X +B Y +A X +A Z +C Y +A Z +A Z +B X +C Y +B Z +B Z +B X +C X +A Z +C X +B Z +C Y +A Z +B X +C Y +B X +A X +C Z +C X +C Y +A Z +C Y +B X +B X +B X +B X +B X +A Y +C Y +B X +A X +A Z +A Z +A X +C Z +B Z +C Y +B X +B Z +A X +B X +B X +C Y +B X +C Y +A Z +A Z +C X +B Z +A X +C Y +B X +C Y +C Y +C Y +B X +B Y +A Z +C Y +C Y +A X +A X +C Y +B X +B Z +C Y +A X +C Z +B Z +B X +C Y +C Y +B Z +A X +A Z +B X +C Y +A Z +A X +A Y +C Y +B X +B Z +A X +B Z +B Z +C Y +C Y +C X +B Z +A X +C Y +B Y +A Z +B X +B Y +B X +C Y +A Z +B X +A Z +C Y +B X +B X +C Y +B Y +C Y +C Y +C Y +B X +A X +C Y +C Y +C Y +A Z +C Y +B X +B X +B X +B X +A X +B Y +C X +B X +C X +A X +C X +C Y +A X +A Z +C Y +B Z +B Y +A X +B Y +C Y +C Y +B X +A X +A X +C X +B Z +C Y +C Y +A Z +B Z +B Z +C X +C Y +B X +B X +B Z +A Z +C Y +C Y +A Z +A Z +B X +B X +B Y +B Z +B Z +A Y +B Z +A Z +B Z +B X +B Z +C Z +B Z +A Z +B Z +B X +B X +B X +A X +C Y +A Z +C Y +C Y +B X +A Z +C X +B Z +B Y +C Z +B X +C Y +A X +C Y +A Y +B Z +C Y +C Y +B X +B X +A Z +C X +A X +A Z +B Y +C Y +C Y +C Y +B X +C Y +C Y +A Z +B X +A Z +C X +C Y +B Z +B Z +B Z +A Z +C Y +C Z +B Z +C Y +C Y +C Y +B X +B X +C Y +C Y +B X +A X +A Z +B X +C Y +B X +A Z +C Y +C Y +B Y +A X +A X +A X +A X +B X +B Y +C Y +A Z +B Y +B Z +A X +B X +C Y +A Y +C Y +A Z +B X +B Z +B Z +A Y +B X +B X +C Y +A Z +A Z +A X +A X +B Z +C Y +B Z +C X +A Z +C Y +B Z +C Y +C Y +B Z +A Z +C Y +C X +A Z +C Y +B X +A Y +A X +B Z +A Y +A Z +B X +C X +B Z +C Y +C Y +B Y +B Z +A X +B X +A Z +C Y +C Y +A Z +A Z +B X +C Y +B Z +A X +A X +B X +B Y +C Y +B X +C X +C Y +B Z +A Z +A Y +B X +C Y +C Y +C X +A Z +C Z +B Z +B X +A Z +A X +A X +B Z +B X +A Z +B Z +C Y +A X +B Z +B Z +C Y +C Y +A X +B X +C Y +A X +B X +C Y +B X +A Z +A X +B Z +A Z +B Z +B Y +A X +B Z +A Z +A Z +A Z +A X +A X +B X +B X +A Z +B Y +A Y +C Y +B X +C Y +B Y +C Y +A Z +A Z +B X +B X +C Y +B Z +C Y +B Z +B X +B X +B X +B X +A X +B Y +B X +C X +A Z +A Z +B X +C Y +C Y +C Y +A X +C Y +C Y +C Y +A X +C Y +C X +B X +A Y +C Z +C Y +A Z +B X +A Z +A X +B X +A X +A X +C Y +A Y +A X +B X +A Z +B Z +B Y +C Z +B X +A Z +C Y +B Z +B X +C Y +C Y +C Y +B X +A X +A Z +B X +A X +C Y +B Z +A X +C Y +C Y +A X +A X +A X +A Y +C Y +C Y +C Y +C Z +C Y +A X +B X +C Y +C Y +C Y +C Y +A X +B Z +A X +B X +C Y +B Z +A Z +C Y +A Z +C Y +B X +B X +C Y +C Y +B Y +A X +C Y +C X +C Y +C X +A Z +A Z +B Y +A X +A X +B Z +A Z +A X +A Z +C Y +A X +B Z +C X +A X +A X +B X +A X +B Y +A X +B X +B X +C Y +C X +B X +B Y +C X +A Z +B Z +B X +C Y +B Y +B Z +C Y +A X +C Y +B X +B X +C Y +C Z +B X +B X +C X +B Y +B Y +B Z +C X +B X +C Y +B X +C Y +B X +A X +A Y +B X +B X +B X +B Y +C Y +B X +B X +B X +C Y +A Z +B Z +B X +A Z +B X +B Y +C X +A Z +C Y +C Y +B Z +B X +C Y +C Y +C Y +C Y +B Z +A X +C Y +C Y +A Z +B X +B Z +A Y +C Y +B X +C Z +A Z +B Y +A Y +A Z +A Z +B X +B X +C X +A Z +B Z +A X +B Z +A Z +B X +B X +C Y +B Z +C Y +A Z +B Z +B X +A Z +C Y +B X +B Y +B Z +C Y +B X +C Y +B X +A X +A X +C Y +B X +B X +A Y +A Z +A Z +B Z +A Z +C Y +C Y +A Z +A X +A Z +B X +C Y +C X +A Z +A X +B Z +B Z +A X +B X +C X +C Y +C Y +B Z +B X +C Y +C Z +B Y +C Y +A Z +B Z +B Z +B X +B X +C Y +B X +B X +C X +A X +B Z +C Y +B Y +B X +A Z +B Z +B X +A Z +B Z +B X +A Z +B X +C Y +C X +B Y +B Y +B Z +C Y +A X +B Z +B Y +C Y +A X +B Z +B Z +C X +B X +C Y +C Y +C Y +C Y +A Z +A Z +B X +B X +C Z +B X +B Z +B X +B Z +A Z +B X +C Y +B X +C Y +C Y +A X +B X +A X +C X +B X +B Y +A X +B Z +A Z +B Y +B Z +C Y +B Z +C Y +B X +B Z +B Y +B X +B X +A Z +B Z +B X +A Z +C Y +C Y +A Z +A X +C Z +A X +B Z +B Z +C Y +B X +B X +A Y +B Z +C X +C Y +C Y +C Y +A Y +A X +B X +B Z +A Z +B X +C X +C X +C Y +C Y +C Y +B X +B X +A Z +B Z +B X +A X +A Z +C Z +B Z +B Z +B X +A X +B X +C Y +B Z +A X +B Y +B Z +B Y +B X +A X +B Z +C Y +C X +C Y +A Z +B Z +B X +B Z +B X +A Y +B X +A Z +B X +C X +A X +C Y +B X +C Y +C Y +A Y +C Z +A Z +C X +B X +C Y +A Z +B X +B Z +B Z +C Y +A X +A Z +B X +B X +B Z +B X +C Y +B X +A X +A X +C Y +A Z +C Y +B Y +B Z +B Z +C Y +B Z +C Y +B X +B X +B Y +C Y +A X +A Z +A Z +A X +C Y +B X +B Y +B Y +B X +A X +A Y +B Y +B Y +C Y +A X +B Z +C Y +A Z +C Y +B Y +A X +B X +A X +B X +A Z +C Y +C Y +A X +B Y +B Y +B X +A Z +A Z +A Z +A Y +B Z +C X +B X +C Y +C Z +B Y +C Y +C X +B X +B Z +B Z +B Z +B Z +B Y +B Z +A Z +C X +B X +C Y +C Y +B Z +C Y +C Y +A X +C X +A X +B Z +C Y +B X +C Y +A X +A Z +C Z +A X +B Z +C Y +C Y +C Y +A X +C Y +C Y +B X +B X +B Y +C Y +B Z +B X +C Y +A Z +C X +A Z +C Y +A Z +A X +B Z +B X +C Z +B X +C Y +A Z +C Y +B X +B X +B X +B Z +C Y +B X +A Z +A Z +C Y +B Y +C Y +B Z +A Z +A X +B Z +B X +B X +A Y +B X +B X +C Y +B X +B X +B Z +C Y +B X +A X +A Z +A Z +C X +A X +A X +B X +B X +B Z +A X +C Y +B X +C Y +C Y +A X +B X +A X +A Z +A Z +C Y +B X +C Y +B Y +B X +B X +C X +B X +A X +C X +B Z +C Y +B Z +B X +C Y +C Y +A Z +C Y +B Z +B X +A Z +C Y +C Y +B X +B Z +A X +B X +C Y +C Y +C Y +A X +A X +A X +B Z +B Z +A X +A X +B X +B Z +C Y +C Y +B Z +A Z +C Y +C Y +A Z +B Z +C Y +B X +B X +B X +C Y +C Y +B Z +C Y +B Z +A X +A X +B X +C Y +A X +A X +C X +A Y +C X +B X +B X +B Z +B Z +B Z +B X +B Z +C Y +C Y +C X +A Z +B X +A X +B Z +B X +A Z +C Y +B X +B Y +B Z +A Z +B X +A Y +C X +B X +C Z +C Y +B Z +A X +B Z +B Z +A X +B Z +B X +C Y +B Z +C X +C Y +A Z +C Y +A Y +B Z +B X +B Y +A Z +A Y +A X +B Y +A Z +B Z +C Y +C Y +C X +C Y +C Y +B X +B Z +A Z +B Z +B Z +A Z +C Y +A Z +C X +C Y +C Y +C Y +A X +C Y +B Z +A X +C Y +C Y +C Y +B X +B Z +B Y +C Y +C Y +C Y +C Y +B Y +A Y +B Z +B X +A X +A Y +C Y +C X +B X +B Z +A Z +B Z +B X +A X +C Z +C X +B Z +C Y +A X +C X +B Z +B X +B X +A Z +B X +B Z +B Y +C Y +B X +A X +B X +B Z +A X +B Z +A Y +C Y +A X +C X +B X +B Y +B Z +B X +B X +C Y +B X +B X +C Y +B Y +B Z +B Y +B Z +C Y +A Z +C Y +A Z +B X +B X +A Z +B X +C Y +C X +C Y +B Y +C Y +C Y +C Z +C Y +A Y +C Y +B X +B Z +A Y +B Z +A Z +B Z +B Z +B X +B Y +C Y +B X +C Y +C Z +C Y +A X +B X +B X +C Z +A Z +B X +A Z +C Y +B Z +B Z +B Y +A Z +B Z +C Y +C Y +A Z +C Y +B Y +C Y +B Z +C X +B Z +B X +A Z +B Y +B Y +B Z +A Z +B Z +C X +C X +B Z +B X +C Y +B X +A X +B X +B X +B Z +C Y +A Z +A Y +B Z +C Y +A X +A X +A Y +B X +B Z +A X +B X +C X +B X +B Y +B X +A Z +C Y +A X +C Y +A X +C Y +C Y +B Y +C Y +B X +C Y +C Y +B X +B Z +A X +C Y +C X +C X +C Y +B Y +A Z +C Y +A X +A X +B X +B X +A X +B X +C X +B Z +B X +A X +A Z +B X +C Y +C Y +A X +C X +B Z +B Z +B X +C Y +C Y +A Z +C X +B Z +C Y +B Y +A Z +B Z +A Z +B X +C X +C Z +C Y +A Z +B Z +B X +C Y +C Y +C X +C Y +C Y +C Y +A X +A Z +C Y +B X +B X +B Z +A Z +C Y +B X +A Z +C Y +C Y +B Z +A X +B Z +B Z +B X +B Z +B X +B X +B Z +B Z +C Y +A X +A X +A Z +C Y +C Y +B X +B Z +C Z +B X +C Z +C Y +C X +C Y +B Y +A X +B Z +A Z +C X +B X +C X +A Z +A Y +B Z +A X +A X +A Z +A Z +B Y +B Z +C Y +B X +C Y +B Z +B X +C Y +C Y +A X +A Z +B X +C Y +B X +B X +A X +A Z +B X +B X +B Z +A X +A X +B Z +B X +B X +B X +A Z +C X +B X +B X +B X +B Z +B X +C X +C Y +A Z +C X +A Z +C Y +A X +C Y +A X +B X +A Z +B X +C Y +C Y +A Z +A Z +B Z +B Z +B X +C X +A X +B Y +B Z +C Y +B Z +A X +A X +B X +A X +A X +A X +A X +B Z +B Y +C Y +A Z +C Z +C Y +A X +B Y +C X +A Z +B X +B Z +A X +A X +C Y +B X +B X +A X +A Z +C Y +C Y +A Z +C Y +B X +B X +A Z +A Y +C Y +A Z +A X +C Y +B Z +B Z +C Y +B X +C Y +C Y +C Y +C Z +B X +C Y +C X +B Z +A Z +C Y +A Z +B Z +A Z +B X +A X +A Z +B Z +B Z +A X +B Z +A X +B X +A Z +B X +B X +A Z +C Y +B X +B Z +C Y +B Z +B Z +B X +B Z +B X +B X +C Y +B X +B Y +B X +B X +A Z +B X +C Y +B X +B X +B X +B Z +A Z +B Y +B X +B Z +C X +C Y +B X +B Y +C Y +B X +C X +B X +C X +B Z +A Y +A Z +B Z +B Z +A X +A Z +B Z +B X +A Z +B Z +C Y +C Z +C Y +A Z +C Z +A Z +C Z +C Y +A Z +A Y +C Y diff --git a/day2/part1/Cargo.toml b/day2/part1/Cargo.toml new file mode 100644 index 0000000..d53465e --- /dev/null +++ b/day2/part1/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "part1" +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/day2/part1/src/main.rs b/day2/part1/src/main.rs new file mode 100644 index 0000000..84a860a --- /dev/null +++ b/day2/part1/src/main.rs @@ -0,0 +1,121 @@ +#[derive(PartialEq, Eq, Debug)] +enum Shape { + Rock, + Paper, + Scissor, +} + +struct Round { + me: Shape, + opponent: Shape, +} + +impl TryInto for &str { + type Error = String; + + fn try_into(self) -> Result { + match self { + "A" | "X" => Ok(Shape::Rock), + "B" | "Y" => Ok(Shape::Paper), + "C" | "Z" => Ok(Shape::Scissor), + rest => Err(format!("{rest} is not a known shape")), + } + } +} + +fn parse_input(input: &str) -> Vec { + input + .lines() + .map(str::trim) + .map(|r| { + let choices: Vec<&str> = r.split_whitespace().collect(); + let opponent: Shape = choices[0].try_into().expect("Failed to convert to shape"); + let me: Shape = choices[1].try_into().expect("Failed to convert to shape"); + + Round { me, opponent } + }) + .collect() +} + +fn run_round(round: &Round) -> u64 { + match round.me { + Shape::Paper => { + let base = 2; + match round.opponent { + Shape::Rock => 6 + base, + Shape::Paper => 3 + base, + Shape::Scissor => base, + } + } + Shape::Rock => { + let base = 1; + match round.opponent { + Shape::Rock => 3 + base, + Shape::Paper => base, + Shape::Scissor => 6 + base, + } + } + Shape::Scissor => { + let base = 3; + match round.opponent { + Shape::Rock => base, + Shape::Paper => 6 + base, + Shape::Scissor => 3 + base, + } + } + } +} + +fn main() { + let input = include_str!("../../input.txt"); + let points: u64 = parse_input(input).into_iter().map(|r| run_round(&r)).sum(); + println!("{points}") +} + +#[cfg(test)] +mod test { + use crate::{parse_input, run_round, Round, Shape}; + + #[test] + fn test_parse_input() { + let input = "A Y + B X + C Z"; + + let parsed = parse_input(input); + assert_eq!(parsed[0].me, Shape::Paper); + } + + #[test] + fn test_run_round_rock_paper() { + let round = Round { + opponent: Shape::Rock, + me: Shape::Paper, + }; + + let res = run_round(&round); + assert_eq!(8, res) + } + + #[test] + fn test_run_round_paper_rock() { + let round = Round { + opponent: Shape::Paper, + me: Shape::Rock, + }; + + let res = run_round(&round); + assert_eq!(1, res); + } + + #[test] + fn test_run_round_scissor_scissor() { + let round = Round { + opponent: Shape::Scissor, + me: Shape::Scissor, + }; + + let res = run_round(&round); + assert_eq!(6, res) + } +} diff --git a/day2/part2/Cargo.toml b/day2/part2/Cargo.toml new file mode 100644 index 0000000..e73cff3 --- /dev/null +++ b/day2/part2/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "part2" +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/day2/part2/src/main.rs b/day2/part2/src/main.rs new file mode 100644 index 0000000..e1e4694 --- /dev/null +++ b/day2/part2/src/main.rs @@ -0,0 +1,139 @@ +#[derive(PartialEq, Eq, Debug)] +enum Shape { + Rock, + Paper, + Scissor, +} + +struct Round { + me: Shape, + opponent: Shape, +} + +impl TryInto for &str { + type Error = String; + + fn try_into(self) -> Result { + match self { + "A" => Ok(Shape::Rock), + "B" => Ok(Shape::Paper), + "C" => Ok(Shape::Scissor), + rest => Err(format!("{rest} is not a known shape")), + } + } +} + +fn parse_input(input: &str) -> Vec { + input + .lines() + .map(str::trim) + .map(|r| { + let choices: Vec<&str> = r.split_whitespace().collect(); + let opponent: Shape = choices[0].try_into().expect("Failed to convert to shape"); + let me: Shape = match (&opponent, choices[1]) { + (Shape::Rock, "X") => Shape::Scissor, + (Shape::Rock, "Y") => Shape::Rock, + (Shape::Rock, "Z") => Shape::Paper, + (Shape::Paper, "X") => Shape::Rock, + (Shape::Paper, "Y") => Shape::Paper, + (Shape::Paper, "Z") => Shape::Scissor, + (Shape::Scissor, "X") => Shape::Paper, + (Shape::Scissor, "Y") => Shape::Scissor, + (Shape::Scissor, "Z") => Shape::Rock, + _ => panic!("Unexpected combination"), + }; + + Round { me, opponent } + }) + .collect() +} + +fn run_round(round: &Round) -> u64 { + match round.me { + Shape::Paper => { + let base = 2; + match round.opponent { + Shape::Rock => 6 + base, + Shape::Paper => 3 + base, + Shape::Scissor => base, + } + } + Shape::Rock => { + let base = 1; + match round.opponent { + Shape::Rock => 3 + base, + Shape::Paper => base, + Shape::Scissor => 6 + base, + } + } + Shape::Scissor => { + let base = 3; + match round.opponent { + Shape::Rock => base, + Shape::Paper => 6 + base, + Shape::Scissor => 3 + base, + } + } + } +} + +fn main() { + let input = include_str!("../../input.txt"); + let points: u64 = parse_input(input).into_iter().map(|r| run_round(&r)).sum(); + println!("{points}") +} + +#[cfg(test)] +mod test { + use crate::{parse_input, run_round, Round, Shape}; + + #[test] + fn test_parse_input() { + let input = "A Y + B X + C Z"; + + let parsed = parse_input(input); + assert_eq!(parsed[0].me, Shape::Rock); + assert_eq!(parsed[0].opponent, Shape::Rock); + + assert_eq!(parsed[1].me, Shape::Rock); + assert_eq!(parsed[1].opponent, Shape::Paper); + + assert_eq!(parsed[2].me, Shape::Rock); + assert_eq!(parsed[2].opponent, Shape::Scissor); + } + + #[test] + fn test_run_round_rock_paper() { + let round = Round { + opponent: Shape::Rock, + me: Shape::Paper, + }; + + let res = run_round(&round); + assert_eq!(8, res) + } + + #[test] + fn test_run_round_paper_rock() { + let round = Round { + opponent: Shape::Paper, + me: Shape::Rock, + }; + + let res = run_round(&round); + assert_eq!(1, res); + } + + #[test] + fn test_run_round_scissor_scissor() { + let round = Round { + opponent: Shape::Scissor, + me: Shape::Scissor, + }; + + let res = run_round(&round); + assert_eq!(6, res) + } +}