From 747e69fbfbb0fedbc75dd4c4a610a57628b11c10 Mon Sep 17 00:00:00 2001 From: Tobias Berger Date: Fri, 2 Dec 2022 10:18:02 +0100 Subject: [PATCH] Rust Day 2 --- rust/Cargo.lock | 2 +- rust/Cargo.toml | 8 +- rust/src/day02/input.txt | 2500 ++++++++++++++++++++++++++++++++++++++ rust/src/day02/main.rs | 161 +++ rust/src/day02/part_1.rs | 8 + rust/src/day02/part_2.rs | 11 + 6 files changed, 2687 insertions(+), 3 deletions(-) create mode 100644 rust/src/day02/input.txt create mode 100644 rust/src/day02/main.rs create mode 100644 rust/src/day02/part_1.rs create mode 100644 rust/src/day02/part_2.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index cdfe883..dfa1114 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4,4 +4,4 @@ version = 3 [[package]] name = "advent-of-code" -version = "22.1.2" +version = "22.2.2" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 213c418..d277742 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "advent-of-code" -version = "22.1.2" +version = "22.2.2" edition = "2021" resolver = "2" @@ -29,4 +29,8 @@ path = "src/day00/main.rs" [[bin]] name = "day01" -path = "src/day01/main.rs" \ No newline at end of file +path = "src/day01/main.rs" + +[[bin]] +name = "day02" +path = "src/day02/main.rs" \ No newline at end of file diff --git a/rust/src/day02/input.txt b/rust/src/day02/input.txt new file mode 100644 index 0000000..55f5009 --- /dev/null +++ b/rust/src/day02/input.txt @@ -0,0 +1,2500 @@ +C X +B Y +C Z +C Z +B X +C Z +C Z +C Z +B X +B Y +B Z +B Z +B Z +C X +C Y +B Y +C Z +C Y +C X +B Y +C Y +C Z +A Y +B Y +C X +C X +C Y +B Y +B X +C Z +B Y +B Z +C Y +A X +B Y +B X +B Y +B X +C Z +B Y +C Y +A Z +B Y +C Z +A Z +B Y +B Y +B Y +C Y +B Y +A X +C Z +C X +C Z +A Y +C X +C Z +C Y +C Y +A Y +C Z +B Y +B Z +A X +C Z +B Y +C X +B X +C Z +C Z +B Y +C Z +A Z +C X +C Y +B X +C X +C Z +B Z +B Z +B Z +B Y +A X +B Y +C Y +B Z +B Y +C Y +C X +B Z +C X +B Y +A Y +B X +C Z +A Z +C Y +C Y +A Z +B Z +B Z +C Z +B X +B X +C Y +C Z +B X +B X +A Z +C X +C Z +A Y +B Z +B Y +B Y +C Z +C X +B Z +A X +B Y +B Z +B Z +A Z +A Y +B X +B Y +A X +C Y +B Y +B Y +B Y +B Y +B X +C Z +C Z +C Z +C Z +B Z +C Z +A X +C Z +C X +B Z +C X +A Z +A Y +B Z +A Y +A X +B Y +A Z +C Z +C Z +B X +C Z +A Y +C Z +B Y +C Z +C X +A Z +B Y +B Y +C X +A Z +C Z +B X +B Y +C X +B X +B X +B Z +B Y +A Z +C Z +B X +B Y +B Z +B Z +C Z +C Z +C Y +A Z +A Z +C Y +B Y +B Y +B Y +B Y +B Z +C X +B Y +A Y +C X +A Z +A Z +A Z +C X +B Y +B Z +B Z +C Z +B Z +C X +A X +A Z +B Z +C X +C Z +C Y +C Z +B Y +B X +C Z +A Y +B X +A X +B Z +C Y +B Y +B Y +B Y +B X +B Y +C X +C Z +B Y +C X +C Z +C X +C Z +B Z +B Z +B Z +A X +B Y +C Z +C Z +B Y +C X +A X +A Z +B Z +B X +C X +A X +B Y +B Y +C Y +B Z +B X +A Z +C Y +B Y +C X +B Y +C X +B Z +A X +A Y +C X +A X +C Y +B Y +B Y +A Y +C Z +B Y +C X +B Y +C X +C Z +C X +C Z +C Y +B Z +B Z +A Z +C X +B X +C Z +C Y +B Y +B Z +B Z +B Y +C Z +B Z +B X +C Z +C Z +C Z +B Y +C X +C Y +B Z +B Y +A Y +C X +B Z +A Z +B Y +B Y +C X +C Y +C Z +C X +C X +C X +C Z +A Z +A Z +C X +C Z +C Y +C Y +C Z +C Z +C Z +C X +B X +B Y +B X +C Y +C Y +B Y +C Z +C X +B Y +C X +B Z +B Y +B Z +B X +B X +C X +C Z +C X +C X +C Z +C Z +B Y +C X +B Y +C Y +C Z +B Z +B Y +C X +C X +A X +C Z +C Y +B Z +B Z +B Y +C Z +C Z +B Y +B Z +A Y +C X +A Z +C Y +C X +B Y +A X +A Z +C X +C Z +B Y +B Y +A Y +A Z +A Y +C Z +A Z +A Z +C Z +B Y +C X +C X +B Y +C X +B Z +B Y +C Y +B Y +B Y +B Y +A Y +C Z +B Y +C X +C Z +C X +B Y +B Y +C Z +B Y +C Z +C Z +B Y +B Y +C X +C Z +C X +A Y +A Y +B Z +C Z +B Y +C X +B Y +C X +C Y +C X +A Y +C Y +B Y +B Z +C Z +A Z +B X +C Z +B Z +B X +A Y +C Z +A Y +B Y +A Z +B Y +C X +B X +C Z +B Z +C Z +B Y +C X +B Z +B Y +A Z +B Y +C Z +C X +C Z +A Y +A Z +B X +A Z +B Y +B Y +B Y +C Z +C X +B Z +C Z +A X +C Z +C X +B X +A Z +C Y +A Z +B Y +C Y +A Y +C X +A Z +C Z +A Z +B Z +C Z +A Y +C Z +C Y +B Y +B Y +B Y +C X +B Z +B Y +C X +C Y +C Z +C Z +B X +C X +B Y +A Y +B Y +C Z +B X +A Z +B Z +C Z +C X +C Z +B X +B Y +C Y +B Z +B Y +C Z +C Z +B X +C Z +A Y +B Z +B Y +B Y +B Z +B Z +B Y +B Y +B X +B Y +A Z +B Y +C X +B Z +A Y +B Z +C Z +C Z +B Y +B Z +B Y +C X +C Y +C Y +C Y +C Z +C X +C X +C Z +A Z +C Z +B Y +B Y +A Z +C Z +B Y +B Y +C X +C Y +B Y +A Y +C Z +C X +C Z +B Y +C Z +C X +B X +B X +C X +C X +C X +B Z +A Z +B Y +C Z +B Y +B Z +B Y +C Y +A Z +B Z +B Y +C Y +C X +B Y +C Y +C Z +C Y +B Y +C Z +C Z +B Z +C X +C Y +C X +C X +C Z +C X +C Z +C Y +A Y +A Z +C Z +C X +B Y +B Y +C X +C Z +A Y +B Z +B Y +C Z +C X +B X +B Y +B Z +B Z +B Y +A Y +C X +C Z +C X +A Z +A Y +C X +A X +C Y +A X +B Y +C Z +A Y +C X +C Z +B Y +B Y +B Z +B Y +B X +B X +C X +A Z +B Z +A Z +A Z +A X +B Y +C X +C Z +C Z +B Y +C X +C X +A X +A Z +B X +C Z +C Z +B Y +C X +B Z +B Z +A Y +B Y +C X +B Y +B Y +B X +C Z +A Y +C X +B Y +C Z +B X +A Z +A Z +B X +B Y +C X +B Z +A Y +C Z +C Z +B Y +B X +A Z +B Z +B Y +A Y +A Z +B Y +B X +B Z +B Z +A Z +A X +A Y +A Y +B X +C X +C Y +B X +A X +B Z +B Y +C Z +B Y +C Z +C Y +C X +A Y +B Z +A Z +B X +B X +B Y +C X +B X +A Y +C X +C Y +B Y +B Z +C Z +A Y +A X +C Z +C Z +C X +A Z +C X +A Y +B Z +B Y +C X +B X +A Y +B Z +C X +B Y +C X +B X +A Z +B Y +C Y +C X +C X +C Z +A Z +C Y +B Y +C Z +C Z +B Y +C Z +C Y +B Y +C X +C X +B Y +B X +A Y +C Z +B Y +A Z +C X +C Y +B Y +B Y +B Y +A Z +A Y +B X +B Y +B Y +B Z +B X +C Z +B Y +C X +C Z +C X +C Y +B Y +C Y +A Z +B Y +C Y +B Y +B Y +A Y +C Z +C Y +C Y +A X +C Z +C Z +C Z +A Y +B Y +C Z +B Z +A Z +B Z +C X +C Z +C Z +A X +C Y +C Z +C Y +C Y +C X +C Y +C X +A Z +C X +C X +B X +C Z +B Y +C Z +B Y +B X +C Z +B Y +C Y +C Z +C X +A X +C Z +A Y +C Y +B Y +B Z +B Z +B Z +B Y +B X +B Y +C Z +B X +B X +B Y +C Y +C Z +A Z +C Y +B Y +B Z +C X +C X +B Z +B Y +C X +C Z +C Z +C X +C Y +B Y +C Y +C Z +C Z +B Z +C Z +B X +B Z +A Z +A Z +C Z +C Y +C Z +C X +B Y +B Y +C Z +B Y +B Y +A Z +A Y +B Z +C Z +C X +B Y +C X +C Z +B Z +C X +C Y +B X +C Z +C Y +A Z +C Z +C Z +C Z +C Z +C Z +A Z +B Y +A Z +A Z +A Z +C X +B Z +B Z +B Y +A Y +C Z +C X +B Z +A Y +B Y +C X +C Z +B Z +C Y +A Y +C Z +B Z +B Z +B Z +C Z +C Z +C Z +C Y +A Y +A Z +A Y +C X +C Y +C Z +C X +B Y +B Z +C Z +B Y +C X +A X +C X +B Y +B Y +B Y +C Z +C Z +A X +B Y +B Y +B Z +B X +C Z +B Y +C X +B X +C Z +C Z +B Y +C Z +C Y +C Z +C Y +C Y +A Z +C Z +B Y +A Y +A Y +B Y +C Y +B X +A Y +C X +C Y +B X +C X +C X +C Z +C X +C Z +B Y +C X +B X +C Y +C Z +C Z +B Z +C X +B Y +A Z +C Y +B X +B Y +B Y +B Y +C Z +C Y +A Z +C X +B Z +C Y +C Y +C X +C Z +A Z +B X +A Z +C Z +B Z +B Y +A Z +C Z +B Z +A X +B Y +B Y +C Z +C Y +C Z +C X +B Y +C X +B Y +A X +B X +C Y +B Y +A Y +B Y +C Z +C X +B Y +C Z +C Y +C X +C X +B X +B Y +C X +A X +B X +B Z +A Z +B Z +C Y +B Z +B Y +C Z +C Y +B Y +B Y +C X +B Y +C Z +B Y +C X +B X +C Z +C Z +B Y +C Z +B Y +B Y +A Y +B Y +B Y +C Z +B Z +C X +B X +C X +B Y +B Y +C Z +C Z +C Z +C X +C Z +A Z +C X +B Y +B X +B Y +B Z +C X +A Y +A Y +C Z +C X +C Y +C X +C X +C Z +A Y +C X +B Y +C Z +C X +B Y +A Z +B X +C Z +A Z +C X +B X +A Y +A Y +B Y +B X +B X +B X +C Y +A X +A Z +B Y +B Z +B Z +C Y +C X +A Z +C Z +B Z +C X +C Y +A Z +C Z +C X +C X +B Y +B Y +C Z +A Y +C Z +B Y +B Y +C Z +C Z +C Z +C Z +C Z +B Y +A Z +C X +B Y +C Z +B X +B Z +C Y +C Z +C Z +A X +C Z +A X +C X +C Z +A X +C Z +C Z +A Z +C X +C X +C Y +C Z +A X +C X +B Y +A Z +A Z +C X +B Y +A X +C Z +B Y +A Y +A Z +C X +B Y +B Z +C Y +B Y +B X +B X +B Y +B X +A X +B Y +C X +B Y +C Z +B X +C Y +B Z +B X +B Y +C X +B Z +B X +A X +C X +B Y +B Y +C Y +B Y +C X +C Z +C X +C X +B Z +C Z +C Y +A Z +C Z +C Y +C X +A Z +B Y +B Y +B Z +B X +A Y +B Y +C Z +B Y +B Z +A X +C X +C X +B X +A Z +B Z +B X +B Y +C Z +B Y +B Z +B Y +C Y +A Y +C Y +C Z +B Z +A Y +B Y +C Z +B Z +A Z +C X +C Z +B Y +C Z +A Z +C Z +C Y +C Z +A X +B Y +B Y +B Y +A Z +A Y +B Z +C Z +A Z +B Y +B Y +B Y +C X +A Z +A Z +A Z +C X +C Z +A Z +C Y +B Y +C Z +C X +B Y +A Y +C Z +C Z +C Z +A Z +A X +B Y +B X +C Y +B X +B Z +C X +A Z +B Z +B Y +A X +A Z +A Y +C X +C Z +C X +C Z +A Z +B Z +B Z +B Z +C Z +C Y +A Z +A Z +A Y +B Y +C Z +B Z +A Z +C Z +A X +B Y +B Y +C X +C Z +B Z +B Y +B X +C Z +B Z +A X +B Z +C Z +B Y +A X +C Y +C X +C X +B Y +C Z +B X +A Z +B Y +C Z +B Y +C Z +A Y +B Z +C X +C X +B Y +C Y +B X +C Z +C Z +B Y +B Y +A Z +A Y +C Y +A Z +C Z +A Y +A Z +C X +C Y +B Z +C X +B X +C X +C X +B X +B X +B Z +C X +C X +B Y +A Z +C X +B Y +B Y +C Y +B Y +C Z +C Y +A Z +A X +C Z +C X +B Z +B X +B Y +A X +C Y +B Y +B Z +B Y +C Z +C Z +A Y +C Y +C X +A X +C Y +C Z +B Z +B Y +C Z +C X +C Y +B Z +B Z +C X +C Z +C X +B Y +A Z +B Y +B Y +C Z +B X +C X +C Y +A Z +C Z +B Y +C Y +B Y +C Y +A X +C X +B X +C X +C Y +C Z +B Y +B X +B Y +C Z +C Y +B Z +C X +B Y +B Y +C Z +C Z +C Z +C X +B Y +C X +C Z +C X +C X +C Y +B Y +C Z +C Z +B Y +B Y +B Y +B Z +C Y +A Z +C X +C Z +A Y +C X +C Z +C Y +B Y +A X +C Z +B Y +B X +B Z +A Y +A Z +C X +C Z +C Y +B X +C Z +A Y +B X +A Z +B Y +A Z +C Z +B Y +C X +A Z +B Y +C Z +C Z +C Y +B Z +C X +C X +B Y +B Y +C Z +C Z +B X +C Z +A Y +B Y +C Z +B X +A Z +C Z +B X +C X +B X +C Y +C Y +A Z +B Y +C X +C Z +A Z +C Z +B X +B Z +C X +C Y +C Z +A Y +C Y +B Z +C X +B Z +C X +B Z +B Y +B Z +A Y +B Y +A Y +B Y +A Z +C Y +C Z +C Z +A X +C Z +B X +A Z +B Y +C Z +A Y +C Z +B Y +B X +C Z +C Z +B Y +C X +B X +A Z +C Y +C Z +B Y +B Y +C X +B Y +B Y +B Z +A Y +C X +B X +B Y +B Y +A Z +C X +C Y +A Y +B Y +C Z +B Y +C Z +B Y +C X +B Z +B Z +A X +A Z +B Y +B X +A X +B Y +B Y +C X +C Z +B Y +C X +C Y +C Z +B Y +A Z +B Y +A Z +B Z +C X +A Z +B Y +B Y +C Z +A Z +A Z +B Y +B Z +C Z +B X +C Z +C Z +B X +B Z +C X +B Z +C X +B Y +B Y +A Y +C Z +B Y +C Z +C Z +C Y +C X +A Z +B Y +C Z +C Z +B X +C X +C Z +B Z +A Z +C X +C Z +A Z +B Y +B Y +C Z +A X +A Z +C Z +C Z +B Y +C X +B Y +B Y +C Y +A Y +C Z +A Z +B Z +A Z +B Y +C X +C Z +B Y +C Z +B Y +C Z +C Z +B Z +B X +A Z +B Z +B Z +C X +C X +A Z +B X +B Z +B Y +C Z +C X +B Z +B Z +C Z +B Y +B Y +C X +B X +C X +C Z +B Y +A Z +B Z +B Y +B Z +B X +C Z +C Y +C Z +A X +C Z +A Y +C Y +A Z +C Z +B X +A X +B Y +A Z +A Y +B Z +B Y +B X +C Y +C Y +B Z +A X +C X +B Y +C Z +B Y +B Y +B X +A X +C Z +B Y +B Y +B Z +C X +C X +B Y +C Z +C X +C Z +C Y +B Y +A Z +C Y +A Y +C Z +C X +C Z +C Z +B Y +B Y +B Z +B X +A Z +B X +A Z +C Z +C Y +B X +B Y +C Z +A Y +B Y +B Z +A Y +B Z +B Z +A Y +A X +B Y +A Z +B Z +A Z +B Z +C X +C Y +B Y +B X +B Y +C Y +C Y +B X +B X +A Z +A Y +A X +A Z +B Y +B Y +C X +C Z +C X +C X +B Z +A Y +C Z +C X +A Y +A X +A Z +C Y +B X +A X +A Z +C Z +B Y +C X +C Z +B Z +B Y +C X +C X +C Z +A Y +C X +B Y +A X +A Y +C X +C X +A Z +C Y +B Y +A Y +C Y +A Z +B Y +B X +C Z +C X +B Y +A Y +C X +B Y +B X +C X +B Y +A Z +B Y +C X +C Z +A Y +C X +A X +C Y +C Z +C Z +C Z +B Z +B X +C Z +B Y +B Z +C Z +A X +C Z +B Y +B Y +C Y +A Z +A X +C X +B Z +C Z +A Y +C X +C Z +B X +A Z +C Y +A Y +C Z +A Z +B X +C X +C Z +C X +B Z +B Y +C X +B Y +C X +B Y +C X +B X +A Z +B Z +C Z +C X +C Y +A Z +C X +A Z +B Z +B Z +B X +B Y +B Z +C Z +C Y +C Z +B Z +B Y +C X +C Z +C Y +C Z +A Y +A Y +C Y +A Y +B Y +C Z +A Y +C X +B Z +A Y +B Y +C X +C X +B Y +C X +B Y +C Z +C X +A Y +C Z +A Z +B Y +B Z +C Z +C Z +C Y +B Y +C Y +C Z +B Y +C Z +B X +A Z +A X +B X +C Z +B Y +B Y +B Y +C Y +C Z +A Y +A Z +B Y +C Y +C Z +C Z +C X +C Z +C X +C Z +C Z +C Y +C X +B Z +C Z +C Z +C Z +C X +B Y +C Z +A Y +C Z +C X +C Y +C X +C Y +B Y +C Z +B X +A Z +C Y +C Z +B X +C Z +A X +B Y +A Y +C Z +B Y +C Z +C Z +B Z +C X +B Y +C Z +A Y +B Z +B X +C X +A Z +C Z +B Y +C Z +C Z +B X +B Y +C Y +C X +C Z +A X +B Z +C Y +C Y +B Y +B Y +B X +B Y +B Z +B Y +C Z +B Y +A Z +B X +B Z +B Y +B X +A X +C Z +B Z +A Z +A Z +A Z +A Z +B Y +C Y +C Y +A Y +C Z +B Y +B Y +B Y +C Z +C Z +C Y +C X +B Z +C Y +C X +C Z +B X +A Z +C X +A X +C X +C X +A X +C Z +B Y +C X +C Y +B X +B Y +C Z +C X +B Y +B Z +B Z +B Y +C X +C X +B Y +B X +C Z +A Z +C Z +B Z +B Y +B X +C Z +C Z +B X +B Y +C Z +B Y +B Y +A Y +C X +C Y +B Y +C Z +B X +B Y +C Z +C Y +C Y +B Y +B Y +A X +A Z +A Z +B Y +B Y +B Y +C X +B X +C Z +C Z +B Z +B Y +C Y +C Z +C X +C Z +C Y +A X +C Z +B Y +B Y +B Y +B X +C Z +B Y +B Y +A Y +C Z +A Z +B Y +B Y +A Z +A Z +A Y +C Z +A X +B X +B Z +C X +A Y +A Z +B Y +B Y +A Y +A Z +C Z +B Y +B Y +C Z +A X +A Z +A Z +C X +B Y +C X +B Z +B Y +C Y +B Y +C Z +B Y +C Z +B Y +C Y +C Z +A Y +A X +A X +C X +B Y +A X +C X +C Y +C Z +C Y +C Z +A Z +B Y +C X +C X +C Y +C Z +B Y +C Z +C Y +B Y +B Y +A X +C X +C X +B Z +A Z +C X +B Y +C X +A X +C Z +B Y +C Y +C Z +C X +A X +B Z +A Y +C Z +C Y +B X +B Y +C Z +B Z +C Z +C X +B Y +C X +B Z +B Y +A Z +A Y +C X +A Y +C Z +C Z +A Z +C Y +C X +A Z +B Y +C X +A Y +A Z +B Y +C Z +A Y +C X +C X +C Z +C Z +C Z +B Z +B Y +A Y +B Y +C Z +C X +B X +A Z +C Z +C Z +C Z +C X +A Y +A Z +A Z +B Z +B X +C X +B Y +C X +C Y +C Z +A Z +C X +C Y +B Y +B X +C X +B Y +C Y +B Y +B Y +C Z +C Y +C Y +B Y +A Y +B X +A Y +B X +C Z +B X +C Z +C Y +B Y +A Z +C X +B Z +C X +C X +C X +C Z +A Z +A Z +B Y +A Z +C Z +C Y +B Z +A X +A Z +C X +B Y +C X +C Z +C Z +A Z +C Z +C Y +B Z +B Z +C Y +B Y +C X +B Y +B Z +C Z +B X +C Z +B Z +B Y +B Y +C Y +C Z +C X +B Y +C X +C X +B Z +B X +C X +B X +C Z +C Z +B Y +A Y +C X +B Z +C X +C Y +C Z +C X +A Z +C X +B Y +B Y +A Y +C Z +B Z +B Y +C Y +C Y +A Y +B Y +B Y +B Y +C Z +C Z +A Z +B Y +C X +C Y +B Y +B Z +B Y +B Y +C X +C Z +C Z +A X +B Y +C Z +C Z +C Z +B Y +C Y +B Z +C Z +C X +C X +C Y +B X +C Z +B Y +C Y +B Z +A Y +B Y +B Z +A Z +C Z +C X +C Z +B Y +C Y +B Y +B Y +A Z +B Y +B Y +B Y +C X +C X +B Y +C Z +C Z +B Y +C X +C Z +C X +A Y +C Z +C Z +B Y +A X +C X +B X +A Y +C X +A X +B Y +A Z +C Y +C Y +C Z +C X +B Y +C X +C Z +B Y +C Z +C X +C Z +C Z +A Z +A Z +C Z +A X +C Z +C Z +B X +C Z +B Y +C X +A Z +C Z +C X +B Z +C Z +B Y +A Z +C Y +B X +B Z +A Y +B Y +C X +C Y +C Z +C Y +A X +C Z +C Z +C X +B Y +C Z +B Z +B Y +C X +C Z +C Y +B Y +C Y +B Y +A Y +B X +C Z +C Z +C Z +C X +B Z +C X +A Z +C Y +C Z +C X +C Z +A Z +A Y +B X +C X +C Z +B Z +B X +C Y +B Y +B Z +C X +C Z +C X +B Y +B Y +C X +B X +C X +C X +B Y +B Y +A Y +B Z +C Z +A Z +B Z +A Z +B Y +C Z +C Z +A Z +B Y +B Y +B X +C X +A Z +C Y +C Z +A Y +C Z +C Z +B Z +B Z +A X +A X +C Y +B X \ No newline at end of file diff --git a/rust/src/day02/main.rs b/rust/src/day02/main.rs new file mode 100644 index 0000000..93eb457 --- /dev/null +++ b/rust/src/day02/main.rs @@ -0,0 +1,161 @@ +const INPUT: &str = include_str!("input.txt"); + +mod part_1; +use std::str::FromStr; + +use part_1::part_1; +mod part_2; +use part_2::part_2; + +#[derive(Clone, Copy)] +pub(crate) enum Shape { + Rock, + Paper, + Scissors, +} + +#[derive(Clone, Copy)] +pub(crate) enum GameResult { + Win, + Tie, + Loss, +} + +impl Shape { + fn play_against(&self, other: &Shape) -> GameResult { + match self { + Shape::Rock => match other { + Shape::Rock => GameResult::Tie, + Shape::Paper => GameResult::Loss, + Shape::Scissors => GameResult::Win, + }, + Shape::Paper => match other { + Shape::Rock => GameResult::Win, + Shape::Paper => GameResult::Tie, + Shape::Scissors => GameResult::Loss, + }, + Shape::Scissors => match other { + Shape::Rock => GameResult::Loss, + Shape::Paper => GameResult::Win, + Shape::Scissors => GameResult::Tie, + }, + } + } + + fn get_response_for_result(&self, result: &GameResult) -> Self { + match self { + Shape::Rock => match result { + GameResult::Tie => Shape::Rock, + GameResult::Loss => Shape::Scissors, + GameResult::Win => Shape::Paper, + }, + Shape::Paper => match result { + GameResult::Win => Shape::Scissors, + GameResult::Tie => Shape::Paper, + GameResult::Loss => Shape::Rock, + }, + Shape::Scissors => match result { + GameResult::Loss => Shape::Paper, + GameResult::Win => Shape::Rock, + GameResult::Tie => Shape::Scissors, + }, + } + } +} + +impl From<&Shape> for u64 { + fn from(shape: &Shape) -> Self { + match shape { + Shape::Rock => 1, + Shape::Paper => 2, + Shape::Scissors => 3, + } + } +} + +impl From<&GameResult> for u64 { + fn from(game_result: &GameResult) -> Self { + match game_result { + GameResult::Win => 6, + GameResult::Tie => 3, + GameResult::Loss => 0, + } + } +} + +#[derive(Debug)] +pub(crate) struct ParseShapeError; + +impl FromStr for Shape { + type Err = ParseShapeError; + fn from_str(s: &str) -> Result { + assert_eq!(s.len(), 1); + let Some(character) = s.bytes().next() else { + return Err(ParseShapeError); + }; + + match character { + b'A' | b'X' => Ok(Shape::Rock), + b'B' | b'Y' => Ok(Shape::Paper), + b'C' | b'Z' => Ok(Shape::Scissors), + _ => Err(ParseShapeError), + } + } +} + +#[derive(Debug)] +pub(crate) struct ParseGameResultError; + +impl FromStr for GameResult { + type Err = ParseGameResultError; + fn from_str(s: &str) -> Result { + assert_eq!(s.len(), 1); + let Some(character) = s.bytes().next() else { + return Err(ParseGameResultError); + }; + + match character { + b'X' => Ok(GameResult::Loss), + b'Y' => Ok(GameResult::Tie), + b'Z' => Ok(GameResult::Win), + _ => Err(ParseGameResultError), + } + } +} + +fn parse_input_part_1() -> Vec<[Shape; 2]> { + INPUT + .split('\n') + .map(|round_string| { + let round = round_string + .split(' ') + .map(|play| { + Shape::from_str(play).unwrap_or_else(|_| panic!("Found invalid play {play}")) + }) + .take(2) + .collect::>(); + [round[0], round[1]] + }) + .collect::>() +} + +fn parse_input_part_2() -> Vec<(Shape, GameResult)> { + INPUT + .split('\n') + .map(|round_string| { + let round = round_string.split(' ').take(2).collect::>(); + assert_eq!(round.len(), 2); + let enemy_shape = Shape::from_str(round[0]) + .unwrap_or_else(|_| panic!("Found invalid play {}", round[0])); + let desired_result = GameResult::from_str(round[1]) + .unwrap_or_else(|_| panic!("Found invalid desired result {}", round[1])); + + (enemy_shape, desired_result) + }) + .collect::>() +} + +pub fn main() { + part_1(parse_input_part_1().as_slice()); + part_2(parse_input_part_2().as_slice()); +} diff --git a/rust/src/day02/part_1.rs b/rust/src/day02/part_1.rs new file mode 100644 index 0000000..8ab22f0 --- /dev/null +++ b/rust/src/day02/part_1.rs @@ -0,0 +1,8 @@ +use crate::Shape; + +pub(crate) fn part_1(input: &[[Shape; 2]]) { + let final_score = input.iter().fold(0u64, |acc, [enemy, mine]| { + acc + u64::from(&mine.play_against(enemy)) + u64::from(mine) + }); + println!("Part 1: {final_score}"); +} diff --git a/rust/src/day02/part_2.rs b/rust/src/day02/part_2.rs new file mode 100644 index 0000000..cac7646 --- /dev/null +++ b/rust/src/day02/part_2.rs @@ -0,0 +1,11 @@ +use crate::{GameResult, Shape}; + +pub(crate) fn part_2(input: &[(Shape, GameResult)]) { + let final_score = input + .iter() + .fold(0u64, |acc, (enemy_play, desired_result)| { + acc + u64::from(&enemy_play.get_response_for_result(desired_result)) + + u64::from(desired_result) + }); + println!("Part 2: {final_score}"); +}