From 277254232b852283cbc6bc6a0f31a588c458bf6a Mon Sep 17 00:00:00 2001 From: Shivesh Mandalia Date: Tue, 20 Dec 2022 18:08:16 +0000 Subject: complete day 2 --- Cargo.lock | 12 + Cargo.toml | 2 +- day02a/Cargo.toml | 2 + day02a/examples/input.txt | 2500 +++++++++++++++++++++++++++++++++++++++++++++ day02a/examples/test.txt | 3 + day02a/src/main.rs | 167 ++- day02b/Cargo.toml | 10 + day02b/examples/input.txt | 2500 +++++++++++++++++++++++++++++++++++++++++++++ day02b/src/main.rs | 140 +++ 9 files changed, 5334 insertions(+), 2 deletions(-) create mode 100644 day02a/examples/input.txt create mode 100644 day02a/examples/test.txt create mode 100644 day02b/Cargo.toml create mode 100644 day02b/examples/input.txt create mode 100644 day02b/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index cb5c260..3629791 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -83,6 +83,18 @@ dependencies = [ [[package]] name = "day02a" version = "0.1.0" +dependencies = [ + "clap", + "itertools", +] + +[[package]] +name = "day02b" +version = "0.1.0" +dependencies = [ + "clap", + "itertools", +] [[package]] name = "either" diff --git a/Cargo.toml b/Cargo.toml index bd54956..8e27fa8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ members = [ "day01a", "day01b", "day02a", - # "day02b", + "day02b", # "day03a", # "day03b", # "day04a", diff --git a/day02a/Cargo.toml b/day02a/Cargo.toml index 9def138..b3e87ca 100644 --- a/day02a/Cargo.toml +++ b/day02a/Cargo.toml @@ -6,3 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +clap = { version = "3.2.20", features = ["derive"] } +itertools = "0.10.5" diff --git a/day02a/examples/input.txt b/day02a/examples/input.txt new file mode 100644 index 0000000..627a35e --- /dev/null +++ b/day02a/examples/input.txt @@ -0,0 +1,2500 @@ +B Z +B X +C Y +B Y +B Y +A X +A X +B Z +A Z +B Z +B Y +B X +C X +B Y +A Z +B Y +A X +B X +C Y +B Y +B Y +C Y +B X +B X +C X +B Y +B Y +B Y +C Y +C X +B Y +C X +C X +B Y +B Z +C Y +B Y +B Z +B X +B Y +B Y +C Y +B Y +C Y +C Y +A Z +B X +C X +B Y +B X +C X +A X +B Y +C Y +B X +C X +C Y +B X +B Z +B Y +B X +C Y +B X +B Y +B Y +B Y +B Y +A X +A Z +B Z +B Y +C X +B Y +B Y +C Y +C Z +C Z +C X +B X +C Z +B Y +B Y +C X +C Z +C X +A Z +C Y +B Y +B Y +B Y +C Y +C Y +C X +C X +C Z +A X +B Y +C X +B Z +B Y +C X +B X +B Z +A Z +C Y +B Z +C X +C X +B Y +B Y +B Y +C Y +C X +B X +B Y +A Z +A Z +C Y +B Y +C Y +C Y +C Y +B X +A Z +C Y +C Y +A Z +A Z +B X +B Y +B Z +A Z +B X +B Y +C Z +C Z +B Z +B Y +B X +A Y +C Z +C X +A Z +A Z +B Y +B Y +C Y +C Y +B Y +B Y +B Y +A Z +C Y +C Z +C X +A Z +B X +B Y +A Y +A Y +B Y +B Y +C X +B Y +B Y +C Z +B Y +B Y +A Z +C Y +B X +C X +A X +C X +B Y +B X +A Z +C X +C Y +A Z +B Y +A Z +B X +B X +A Z +B Y +C X +C X +A Z +A X +C X +C X +C X +B Y +C Z +C Y +C X +B Y +B Y +B Y +A X +A Z +C Y +B Y +B Y +A X +C Y +C Z +C Y +C X +B Y +B Y +B Y +B Y +A Z +B Y +A Z +B X +B Y +B Y +B X +C Y +A X +A Z +B Y +C Y +C Y +B Y +B Y +C X +B Y +B X +A Z +B Y +B Y +C Y +B Y +B Y +B Y +A X +B X +B Z +C Y +B Z +C X +C X +B Z +B Y +A Z +A Z +B Y +C X +A X +C Y +B Y +B Y +A X +B Y +A Y +C Y +B Y +C X +B Y +A Z +B Z +C Y +B Y +B Y +C X +B Y +B Y +B Y +C Z +A X +B Y +B X +C X +C Z +C Z +C Y +C Y +A X +C Y +B Y +A X +C X +A Z +C X +B Y +C Z +C Z +A Z +A X +C Y +C X +B Y +C Z +B Y +C Y +C X +C Y +B Y +B Y +B Y +A X +A Z +B Y +B X +B X +B Y +B Y +B Y +A Z +B Y +B Y +A X +A X +A Z +A Z +B X +C Y +A Z +B Y +B Y +C Z +C X +C Y +A Z +C Y +C Y +C Y +C Y +C X +A Z +C Z +A Z +C Y +C X +B Y +B Y +C Z +B X +B Z +C X +A Y +C Y +B X +B X +B Y +C Y +A Z +A Z +B X +B Z +B X +C Y +A X +A X +C Z +B Y +C Y +C X +B Y +A Z +B Y +C Y +B Z +C Z +C X +B Z +C Z +B Z +A X +C Y +A Z +B Y +B Y +B Y +B Y +B Y +B Y +A Z +C Z +B X +C X +C Y +C Y +B Y +C X +C X +A Y +C Y +C Y +A Z +C Z +B Y +B X +C X +B Y +C X +B Y +B Y +C X +B Y +B Y +B Y +A Z +C Y +B Z +B Y +C X +B Y +C X +A Y +A Z +B Y +B Y +B Y +A Z +B Y +B Y +B Y +B Y +B Z +C Y +B Z +B Z +A Z +B Y +B Y +C X +A X +B Y +A Z +C X +C X +B Y +B Y +A X +B Y +B Y +C X +B Y +C X +B Y +B Y +B Y +B Y +A X +B Y +B Z +B Y +A Z +C X +C X +C Y +A Z +C Y +B Y +B X +A X +B Y +A Z +B Y +C Y +B Y +B Y +C Y +C X +A Z +A X +A Z +C Z +B Y +B Y +C Y +B X +C X +B Y +A Z +B Y +C X +A X +C X +C Y +C Y +B X +B Y +B Y +C Z +B Y +C X +A Z +C Z +C Y +A Z +C X +C Y +C Y +C X +B Y +B Y +C Z +A Z +B Y +A X +B Y +A X +A X +C Y +C X +A Z +B Y +C Y +C X +B Y +B Y +B Y +B X +B X +A X +C X +B Y +C Y +A Z +A Z +A Z +B Y +A Z +B Y +C X +B Y +C X +C Y +A Z +B Y +B Z +A Z +B Y +A Z +B Y +B Y +C Z +B Y +B Y +A Z +A X +C Z +C Z +B Z +B Y +A Z +B Y +B Y +B Y +B Y +C Z +A Z +C X +B X +B Y +A X +A X +B Y +A Z +A X +C Y +B Y +C X +A Z +B Y +C Z +C Y +B Y +A X +C Y +B Y +B Z +A Y +B Y +B Y +A Z +B Y +C Z +C X +B Y +A Y +C Z +B X +A X +B Y +B Y +B Z +B Z +C Y +B Y +B Y +A Z +A Z +B Y +B X +C Y +C Y +B Y +B Y +B Z +B Z +B Y +C Y +A Z +B Y +A Z +B Y +B Y +A Z +A Z +C X +C Z +B Y +C X +B X +A Z +B Y +B Y +C X +B Y +B Y +B Y +B Y +B X +B Y +A X +B Z +A Z +C Z +B X +A Z +C Y +C Y +A Z +B Y +C Z +C Z +C Y +B Y +B Y +B Y +A Z +B Y +B X +C X +B Y +B Y +B Y +B Y +C Y +B Y +C Y +B Y +C Y +C X +A Z +C Y +C Z +C Z +B X +C Y +B Y +B X +C Y +B Y +B Y +C Y +C X +C X +A Z +B Y +C X +A Z +C Z +B Y +B Y +C X +C X +B Y +B X +C Y +B Y +B Y +A Z +A Z +C Z +A Z +B Y +C X +C X +B X +B Y +B Y +B Z +B Y +B Y +B Y +B Y +B Z +B Y +C Y +C Z +B Y +C Y +C Y +C Y +C Y +A Z +A Z +C Y +C Y +A X +B Y +C Y +A X +C X +C Y +A Z +B Y +B Z +A X +B Y +B Z +B Y +B Y +B Z +C X +C Y +B Y +B Z +B X +A Z +B Y +C Y +B Y +B Y +A X +C X +B Y +C X +B Y +C Y +A X +A X +A Z +C Y +B Y +C Y +C X +B X +C X +C X +A X +A Z +B Y +B Y +B Y +A Z +B Y +B Y +B Y +B Y +B Y +B Y +B X +B Y +C Y +B Y +A Z +B Y +C X +C Y +B Z +C Z +B Y +A Y +C X +B Y +B Y +B Y +C X +A Y +C Z +B Y +C X +C Y +C Y +C Y +C X +C Y +B Z +B Y +C Y +C X +B Y +B Y +B X +C Y +B X +C Z +B Y +C X +B Z +C X +B Y +C X +B Y +C Y +C Y +A Z +C Y +C X +B Y +C X +B X +A Z +B Y +A Z +A Z +A Z +C Y +B X +A Y +C Y +B Y +B Y +C Y +C Y +C X +B X +A X +A Z +C X +A Y +B X +C Z +B Y +B Y +B X +C X +B Y +B Y +B Y +B X +B Y +C X +B Y +B Y +C Z +C Y +B Y +C Y +B Y +A Z +C Z +A Y +B Y +B Y +B Y +C Y +C Y +C Y +B Y +C Z +B Y +C Z +A Z +A Z +C Z +C Y +C Z +C Y +A Z +C X +B X +B Y +C Y +B Z +C Z +C X +B Y +A Z +B Y +C X +B Z +A X +B Y +A Z +C Z +C X +C X +C Y +B Y +B Y +A Z +A Z +B Y +B X +A Z +B Y +C Y +A X +C Z +B Y +B X +B Y +C Y +C Z +B Z +A Z +B Y +A X +C X +B Y +A Z +C X +B Z +C Y +C Y +C X +C X +C Y +B Y +B Y +B Z +B X +C X +B Z +C X +B X +C Z +C Z +C X +B Y +C Y +C X +B Y +A Z +C Y +C Z +C Z +C Y +B Y +A X +C Z +C X +B Y +C X +C Z +B Y +C Y +B Y +C Y +A Z +B Z +C Z +C X +B Z +B Z +B Y +A Y +C Y +C Y +B X +B X +B Y +B Y +B Y +C X +B Z +B Y +B Y +B Y +C X +A X +C Y +A X +B Y +B Y +B Y +B Y +B Y +C Y +C Y +B Y +B Y +B Y +B Y +C Y +B Y +C X +B Y +B Y +C X +A Z +A X +C Y +C Z +B Y +C X +B Y +B X +A Z +B X +B Y +B Y +A Z +B Y +B Y +B Y +B Z +A Z +A X +B Y +A Z +C Y +B Y +C X +B Y +C Y +B Y +B Y +C X +C Y +A Y +C X +C Y +B Y +A Y +A Z +C Z +A Y +A Z +B Y +C Y +C Y +B Y +B Y +B Y +B Y +A Z +B Y +B Y +B Y +C X +C X +B Y +C X +B Y +A Z +B Y +B X +C Z +C Y +A Y +B Y +C Y +B Y +C Y +C Y +C Y +C X +C Y +B Y +B Y +C Y +B Y +C Y +A Z +A X +B Y +A Z +B Y +C X +C X +B Y +C Z +B Y +B Y +C Y +B Y +C Z +A Y +B Y +C Y +B Y +A Z +C Y +B Z +C Y +C Y +C Z +B Y +C X +B Z +B Y +B Y +B Y +C Z +B Y +B Y +B Y +A Z +C X +B Z +B Y +B Y +C Y +B Y +C X +B Y +B Y +C Y +C X +C Y +B Y +B Y +C Y +B Y +A Y +B Y +A Z +B Y +B Y +B X +A Z +B Y +B Y +C Y +C X +C Z +A Z +A Z +C X +B Y +C Y +B Y +C X +B Y +B Y +C Y +C X +B Y +B Y +B Y +B Y +B Y +C X +B Z +B Z +A Z +B Z +B Y +B Z +B Y +C Y +A Z +A X +B Y +C Z +B X +A X +C Y +B Y +B Y +C Y +B Y +C Y +B Y +A Z +B Y +B Y +A Z +B Y +B Y +A Z +B Y +B Y +B Y +B Y +C Y +B Y +A X +A X +B Y +B Y +A Y +C Z +A Z +A Z +B Y +A Z +C Y +B Y +B Y +B Y +B Y +C Y +B Y +A X +B X +B Y +B Y +B Y +B Y +B X +C Y +B Y +B Y +B X +C Y +A Y +B Y +B Y +B Y +A X +B Z +C X +A X +C Z +B Y +B Y +B Y +C X +B Y +B Y +B Y +B Y +C Y +B Z +B Z +B Y +B Z +B Y +B Y +C Z +C Y +B Y +C Z +C Z +B Y +C X +A Y +B Y +B Z +A Z +B Y +C X +B Y +B Y +C Z +A Z +B Y +B X +B Y +C Y +B Y +B Z +B Y +B Y +C X +C X +C Z +B Y +B Y +B Y +A Z +A X +B Y +A Z +B Y +B Y +B Y +B Z +C X +C Z +B Y +B Y +B Y +C Z +B X +C Z +A X +B Y +C Y +B Y +A Z +A X +C X +B X +A Z +C X +B Y +C Y +B X +A Z +C Y +C Y +B Z +C X +B Y +C X +C Z +C Y +B Y +C Z +B Y +B Y +C X +B Y +B Y +B Y +B Y +B Y +B Y +C X +B Y +B Y +B Y +A Z +B Y +B Y +C Z +B Y +B Y +B Y +C X +A Z +B Z +C Y +C Y +B Y +A X +C Y +B Y +C Z +B Z +B Y +B Y +C Y +B Y +B Y +B Y +C Z +A X +B Y +C Y +A X +B Y +B Y +A X +B Y +A Y +C X +A Z +A Z +C Y +B Y +C Z +C Y +C Y +C Z +A Z +A X +C Z +B Y +C X +A Z +C X +B Y +B Y +B Y +C Z +C Y +C X +C Y +A Y +C X +A Z +A Z +B Z +C X +B Y +B Y +C X +A Z +C Z +C Z +B Y +B Y +A Y +C X +B Z +B Y +B Y +C X +C X +C Z +C Z +B Y +B Y +B X +B Y +B Y +C Z +C Y +C Z +B Y +B Y +B Y +C Y +B X +C X +A Z +C X +C X +C Y +B Y +B Y +C Y +B Z +B Z +C X +C Y +B Y +B Z +B Y +B X +A Z +C X +B Z +A Z +C X +B Y +C Y +C Y +B Y +B Y +B Y +B X +A X +B Y +A X +A Z +C Y +B Y +B Y +B Y +B Y +B Y +C Z +B X +B Y +C X +A Z +B Y +B Y +A Z +B Y +C Y +C Z +C X +C Y +B Y +B Y +B Z +B Y +A X +C Y +B Y +A X +B Y +C X +A Z +B Y +C X +A Z +B Y +C X +C Y +C X +B Z +C Z +B Y +C Y +C X +C Y +B Z +B X +A X +C Z +B Y +B Y +C Y +B Z +C X +C X +B Y +B Y +C Y +B X +B Y +C Y +B Y +B Y +A Z +B Y +B Y +B Y +A X +A Z +B Z +B Z +B Y +A Z +B Y +C Y +B Y +C X +B X +B Y +B Y +B X +C Z +B Y +C Z +C X +B Y +C Z +B Y +C Y +B Z +C Y +C Y +C Z +C Z +A X +B Y +A Z +B Y +B X +A X +B Y +B Y +B Y +C Y +B Y +B X +B Z +C Z +B X +B Z +B Y +C Y +B Y +B Z +C X +A Z +B X +B Z +C X +C Z +B Y +A Z +C X +C Y +B Z +B Y +C Y +B Y +C Y +B Y +B Y +B Y +C Y +B Y +C Y +C X +C Z +B Y +B Y +B X +C Z +B X +A Z +C Y +A Z +C X +C Y +B Y +C Z +B Z +C Z +C Y +C X +B Y +C Z +C X +B Y +B Y +B Y +B X +B Y +B Y +C X +A X +B Z +C X +C Z +B Y +C Y +B Z +C Z +B Y +C X +B Y +B Y +A Z +C Z +B Y +C Z +C X +B Y +B Y +C X +C X +C Y +B Y +A X +A Z +B Y +C X +B Y +B Y +C Y +B Y +A Z +A Z +C X +C Z +C X +C X +A X +B Y +B Y +C Y +C Z +C Y +B Z +C Y +B Y +B Y +B Y +C Y +B Z +B Y +B Y +B X +C Y +C Y +B Y +A X +C X +A X +C Z +C Y +A Y +B Y +B Y +B Z +C X +C X +B Y +A X +B Y +A Z +B Y +A Z +C X +C X +B Y +B Y +B Y +B Y +A X +B Y +B Z +C Y +C X +C Z +C Z +B Y +C Z +B Y +B Y +C X +B Y +A X +A Z +B Y +A Z +C X +B Y +C Y +B Z +C Z +B Y +B Y +B Y +B Y +C Y +C Z +B X +B Y +A Y +C Y +B Z +B Y +C Y +A Z +B Y +B Y +C Y +C Y +A Y +C Y +A Z +C Y +B X +B Y +B Y +C Y +A Z +C Y +A Z +B Y +B Y +B Y +B Y +A X +C Y +A Z +B Y +B Y +B Y +B Y +B Z +C Z +C Y +C X +B Y +C X +B Y +B Y +B Y +B Y +A Z +B Y +C Y +C Y +A Z +A X +B Y +C Y +C Y +B Y +C Y +C Y +C Y +C Z +A Z +C X +C Y +C X +B Y +B Y +C X +C Z +C X +C Z +B X +B Y +C Z +B Z +A Z +C Y +B Z +C Y +B Y +A X +B Y +A Z +B Y +A X +B Y +B X +B Z +B X +B Y +B Y +B Y +C X +B Y +B X +C X +B Y +B Z +B Y +C Y +B Y +B Y +C X +A Z +C X +B Y +C Y +C Z +B Y +C Z +B Y +B Y +B Y +B Y +C Z +C X +C Y +C Z +B X +A Z +A Z +B Y +B Z +C Y +A X +B Y +B Y +A Z +B Y +B Y +B Y +B Y +A Z +C Z +B Z +C Y +A Z +C Y +B Y +B Y +B Y +B Z +B Y +C X +C Z +B X +C X +B Y +C Z +C X +B Y +A Z +A Z +B Y +B Y +B Y +C X +A Y +B Y +B Y +A Z +A Z +C Z +C Y +B Y +B Y +A X +B Z +A X +B Y +A Z +B Y +C X +B Y +A Y +B Y +B Z +B Y +B Z +B Y +B Y +C Y +C Y +B Y +C X +C Z +B Y +B Y +B Y +C Z +A Z +C X +B Y +B Z +B Y +C Y +B Y +C X +B Y +B Y +C Y +B Y +B Y +B Y +B Y +B Y +B Y +B X +B Y +B Y +C X +B Y +B Z +A Z +A Z +C X +B X +B X +C Y +C Z +B Y +C X +A X +B Y +C X +C Z +C X +B Y +B Y +C Y +B Y +B Y +B Y +A Z +C Z +C X +B Y +B Y +A X +B Y +C Y +B Y +B Y +C Y +B X +B X +A X +C Y +C Z +C Y +B Y +B Y +C X +A X +A X +C X +B Y +C X +B Y +B Y +B Y +C Y +A Z +B Z +A Z +B Y +B X +C Y +B Z +B Y +A Z +B Y +C Y +B Y +C Y +A X +B Y +B Y +B Y +C X +A Z +C Y +B Y +B Y +B Y +C X +B Y +C Y +B Y +B X +C X +B Y +B Y +C Y +C X +C Z +C Z +B Y +B Y +B Y +B X +C X +B X +A Y +A Z +C Y +A X +B Y +B Y +B Y +A Z +C Y +C X +C Y +C Z +A Z +B Y +B Y +B Y +B Y +A Z +B Y +A Z +B Y +B Y +C Y +C Z +C Y +A Z +C Y +B Y +C Y +B X +B Y +A X +C Z +C Z +A X +C X +C Z +C X +C X +B Y +A X +A Z +C Y +B Y +C X +B Y +B Y +B X +C Y +C Z +B Y +B Z +A Z +C Y +B Y +A Z +B Y +C X +C X +B Z +C Y +B X +B Y +C Y +B Z +A Z +C X +C Y +C X +C Z +B Z +C Z +B Y +B X +B Y +B X +B Y +B Y +B Y +B Y +C X +C X +C Y +B Z +C X +B Y +B Y +B Z +C Z +C Y +B Y +B Y +B Y +C X +B Z +B Y +B X +B Y +C Y +C X +C Z +C X +C Y +B Y +B Y +B X +B Y +C X +B X +A X +B Y +C Y +B Y +A X +C Y +B Z +B Z +C X +C Z +C X +B Y +C Y +C Y +B Y +C Z +B Y +C Y +B Y +C Y +A Z +B Z +C X +C X +B Y +B Y +B Z +B Y +B Z +A X +C X +C X +B Y +C X +A Z +C Y +B Y +A Z +C Z +B X +C Y +C X +C X +A Z +B Y +B Y +C Z +B Y +A Y +C Y +B Y +B X +B Z +C X +B Y +B X +C Z +B Y +B X +B Y +B Y +B Y +A Z +A Z +B Z +A Z +C Y +C Z +B X +C X +A Z +C X +B Y +B Y +A X +B X +B Y +B X +B X +A Y +A Z +C X +B Z +B Z +C Y +C Y +B Y +B Y +B Y +A Z +A Z +B Y +B Y +C Y +C Y +C Y +C Z +C X +C Y +B Y +B X +B Y +A Y +A X +C Y +B Y +A Z +B Y +B Y +C X +C X +B Y +B Y +C Y +A Z +B Y +C Y +C Z +C Z +C Y +A Y +B Y +B Y +C Y +B X +C Z +C Z +C Z +B Y +B Y +B Y +C Y +A Z +B Y +A Z +B Y +A Z +C X +C Z +C Y +B Y +A Z +B Y +B Y +C Z +B Y +C X +B Y +C Y +C Y +B Y +B Y +A X +C Z +B Y +C Y +C X +B Y +B Y +B Y +B Z +A Z +B Y +B Y +B Y +A Z +B Y +A X +B Y +B Y +B Y +C Y +C X +C Y +A Z +B Y +C Y +B Y +C Y +C Y +C Y +A X +C Z +B Y +B Y +C Z +B Y +B Y +C Z +B Z +B Y +C Y +B Y +B Y +B Y +B Y +B X +C X +C Y +B Y +A Z +B Y +A X +B Y +B Y +B Y +B Y +C Z +C Z +B Y +A Z +B Y +C X +C X +C Y +B X +A X +B X +B Y +C X +C Z +C Y +C Y +B Y +C Z +B Y +B Y +C Z +A X +B Y +C Z +B Z +B Y +C X +C X +B Y +B Y +B X +C Z +A Z +A X +B Y +C X +B Y +B Y +C Z +B Z +C Y +B Y +B X +C X +C Z +B Z +B Z +C Y +B Y +A X +B Y +B Y +C X +B X +A Z +B Y +A Z +B Y +B Y +A Z +C X +C X +B Y +B X +B Y +A Z +C Y +C Z +B Y +B Y +A X +B Y +C Y +C Y +B Y +A X +B Y +B Y +A Z +C X +C X +C Y +B Y +A X +B Y +B Y +C Y +B Y +B Y +B Y +B Z +B Y +C Y +C Y +B Y +C X +C X +B Y +C Y +B Y +C X +B Y +B Z +B Y +A Z +A Z +C X +A Z +A Z +B Y +B X +C Z +B Y +B Y +B Y +B Y +B Y +C X +C Y +B Y +A X +C X +C X +C Y +B Y +C X +C X +C Z +B Z +C Y +C X +B Y +B Y +C X +B X +C Z +B Y +B Y +C Y +A Z +C Y +C X +C Y +B Y +B Y +C X +C Y +C Y +C X +B Z +B Z +B Y +B Y +C Y +B Y +C X +A Z +A X +C Z +B Y +C Y +C Y +B Y +B Y +C Y +B Y diff --git a/day02a/examples/test.txt b/day02a/examples/test.txt new file mode 100644 index 0000000..db60e36 --- /dev/null +++ b/day02a/examples/test.txt @@ -0,0 +1,3 @@ +A Y +B X +C Z diff --git a/day02a/src/main.rs b/day02a/src/main.rs index e7a11a9..56c7378 100644 --- a/day02a/src/main.rs +++ b/day02a/src/main.rs @@ -1,3 +1,168 @@ +/// --- Day 2: Rock Paper Scissors --- +/// +/// The Elves begin to set up camp on the beach. To decide whose tent gets to be closest to the +/// snack storage, a giant Rock Paper Scissors tournament is already in progress. +/// +/// Rock Paper Scissors is a game between two players. Each game contains many rounds; in each +/// round, the players each simultaneously choose one of Rock, Paper, or Scissors using a hand +/// shape. Then, a winner for that round is selected: Rock defeats Scissors, Scissors defeats +/// Paper, and Paper defeats Rock. If both players choose the same shape, the round instead ends +/// in a draw. +/// +/// Appreciative of your help yesterday, one Elf gives you an encrypted strategy guide (your puzzle +/// input) that they say will be sure to help you win. "The first column is what your opponent is +/// going to play: A for Rock, B for Paper, and C for Scissors. The second column--" Suddenly, the +/// Elf is called away to help with someone's tent. +/// +/// The second column, you reason, must be what you should play in response: X for Rock, Y for +/// Paper, and Z for Scissors. Winning every time would be suspicious, so the responses must have +/// been carefully chosen. +/// +/// The winner of the whole tournament is the player with the highest score. Your total score is +/// the sum of your scores for each round. The score for a single round is the score for the shape +/// you selected (1 for Rock, 2 for Paper, and 3 for Scissors) plus the score for the outcome of +/// the round (0 if you lost, 3 if the round was a draw, and 6 if you won). +/// +/// Since you can't be sure if the Elf is trying to help you or trick you, you should calculate the +/// score you would get if you were to follow the strategy guide. +/// +/// For example, suppose you were given the following strategy guide: +/// +/// ``` +/// A Y +/// B X +/// C Z +/// ``` +/// +/// This strategy guide predicts and recommends the following: +/// +/// In the first round, your opponent will choose Rock (A), and you should choose Paper (Y). +/// This ends in a win for you with a score of 8 (2 because you chose Paper + 6 because you +/// won). +/// In the second round, your opponent will choose Paper (B), and you should choose Rock (X). +/// This ends in a loss for you with a score of 1 (1 + 0). +/// The third round is a draw with both players choosing Scissors, giving you a score of 3 + 3 +/// = 6. +/// +/// In this example, if you were to follow the strategy guide, you would get a total score of 15 (8 +/// + 1 + 6). +/// +/// What would your total score be if everything goes exactly according to your strategy guide? +use clap::Parser; +use itertools::Itertools; + +use std::fs::File; +use std::io::prelude::*; +use std::io::BufReader; +use std::path::PathBuf; + +const FILEPATH: &'static str = "examples/input.txt"; + +#[derive(Parser, Debug)] +#[clap(author, version, about, long_about = None)] +struct Cli { + #[clap(short, long, default_value = FILEPATH)] + file: PathBuf, +} + +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +enum RockPaperScissorsKind { + Rock, + Paper, + Scissors, +} + +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +enum GameOutcome { + Win, + Loss, + Draw, +} + +#[derive(Copy, Clone, Debug)] +struct GamePrediction { + player: RockPaperScissorsKind, + opponent: RockPaperScissorsKind, +} + +fn kind_to_value(kind: RockPaperScissorsKind) -> i32 { + use RockPaperScissorsKind::*; + match kind { + Rock => 1, + Paper => 2, + Scissors => 3, + } +} + +fn opp_to_kind(val: char) -> Option { + use RockPaperScissorsKind::*; + match val { + 'A' => Some(Rock), + 'B' => Some(Paper), + 'C' => Some(Scissors), + _ => None, + } +} + +fn player_to_kind(val: char) -> Option { + use RockPaperScissorsKind::*; + match val { + 'X' => Some(Rock), + 'Y' => Some(Paper), + 'Z' => Some(Scissors), + _ => None, + } +} + +fn outcome_to_value(outcome: GameOutcome) -> i32 { + use GameOutcome::*; + match outcome { + Win => 6, + Draw => 3, + Loss => 0, + } +} + +fn game_pred_to_outcome(prediction: GamePrediction) -> GameOutcome { + use GameOutcome::*; + use RockPaperScissorsKind::*; + match (prediction.player, prediction.opponent) { + (Rock, Scissors) => Win, + (Scissors, Paper) => Win, + (Paper, Rock) => Win, + (x, y) if x == y => Draw, + _ => Loss, + } +} + +fn game_pred_to_value(prediction: GamePrediction) -> i32 { + outcome_to_value(game_pred_to_outcome(prediction)) + kind_to_value(prediction.player) +} + fn main() { - println!("Hello, world!"); + let args = Cli::parse(); + + let file = File::open(&args.file).unwrap(); + let reader = BufReader::new(file); + let res: i32 = reader + .lines() + .map(|l| { + l.unwrap() + .split(' ') + .map(|w| w.parse::().unwrap()) + .collect_tuple::<(char, char)>() + }) + .map(|v| v.unwrap()) + .map(|(o_char, p_char)| GamePrediction { + player: player_to_kind(p_char).unwrap(), + opponent: opp_to_kind(o_char).unwrap(), + }) + .map(|pred| game_pred_to_value(pred)) + // .inspect(|x| println!("{x:?}")) + .sum(); + + println!( + "The total score if everything goes exactly according to your strategy guide is {}", + res + ); } diff --git a/day02b/Cargo.toml b/day02b/Cargo.toml new file mode 100644 index 0000000..400f4a8 --- /dev/null +++ b/day02b/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "day02b" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = { version = "3.2.20", features = ["derive"] } +itertools = "0.10.5" diff --git a/day02b/examples/input.txt b/day02b/examples/input.txt new file mode 100644 index 0000000..627a35e --- /dev/null +++ b/day02b/examples/input.txt @@ -0,0 +1,2500 @@ +B Z +B X +C Y +B Y +B Y +A X +A X +B Z +A Z +B Z +B Y +B X +C X +B Y +A Z +B Y +A X +B X +C Y +B Y +B Y +C Y +B X +B X +C X +B Y +B Y +B Y +C Y +C X +B Y +C X +C X +B Y +B Z +C Y +B Y +B Z +B X +B Y +B Y +C Y +B Y +C Y +C Y +A Z +B X +C X +B Y +B X +C X +A X +B Y +C Y +B X +C X +C Y +B X +B Z +B Y +B X +C Y +B X +B Y +B Y +B Y +B Y +A X +A Z +B Z +B Y +C X +B Y +B Y +C Y +C Z +C Z +C X +B X +C Z +B Y +B Y +C X +C Z +C X +A Z +C Y +B Y +B Y +B Y +C Y +C Y +C X +C X +C Z +A X +B Y +C X +B Z +B Y +C X +B X +B Z +A Z +C Y +B Z +C X +C X +B Y +B Y +B Y +C Y +C X +B X +B Y +A Z +A Z +C Y +B Y +C Y +C Y +C Y +B X +A Z +C Y +C Y +A Z +A Z +B X +B Y +B Z +A Z +B X +B Y +C Z +C Z +B Z +B Y +B X +A Y +C Z +C X +A Z +A Z +B Y +B Y +C Y +C Y +B Y +B Y +B Y +A Z +C Y +C Z +C X +A Z +B X +B Y +A Y +A Y +B Y +B Y +C X +B Y +B Y +C Z +B Y +B Y +A Z +C Y +B X +C X +A X +C X +B Y +B X +A Z +C X +C Y +A Z +B Y +A Z +B X +B X +A Z +B Y +C X +C X +A Z +A X +C X +C X +C X +B Y +C Z +C Y +C X +B Y +B Y +B Y +A X +A Z +C Y +B Y +B Y +A X +C Y +C Z +C Y +C X +B Y +B Y +B Y +B Y +A Z +B Y +A Z +B X +B Y +B Y +B X +C Y +A X +A Z +B Y +C Y +C Y +B Y +B Y +C X +B Y +B X +A Z +B Y +B Y +C Y +B Y +B Y +B Y +A X +B X +B Z +C Y +B Z +C X +C X +B Z +B Y +A Z +A Z +B Y +C X +A X +C Y +B Y +B Y +A X +B Y +A Y +C Y +B Y +C X +B Y +A Z +B Z +C Y +B Y +B Y +C X +B Y +B Y +B Y +C Z +A X +B Y +B X +C X +C Z +C Z +C Y +C Y +A X +C Y +B Y +A X +C X +A Z +C X +B Y +C Z +C Z +A Z +A X +C Y +C X +B Y +C Z +B Y +C Y +C X +C Y +B Y +B Y +B Y +A X +A Z +B Y +B X +B X +B Y +B Y +B Y +A Z +B Y +B Y +A X +A X +A Z +A Z +B X +C Y +A Z +B Y +B Y +C Z +C X +C Y +A Z +C Y +C Y +C Y +C Y +C X +A Z +C Z +A Z +C Y +C X +B Y +B Y +C Z +B X +B Z +C X +A Y +C Y +B X +B X +B Y +C Y +A Z +A Z +B X +B Z +B X +C Y +A X +A X +C Z +B Y +C Y +C X +B Y +A Z +B Y +C Y +B Z +C Z +C X +B Z +C Z +B Z +A X +C Y +A Z +B Y +B Y +B Y +B Y +B Y +B Y +A Z +C Z +B X +C X +C Y +C Y +B Y +C X +C X +A Y +C Y +C Y +A Z +C Z +B Y +B X +C X +B Y +C X +B Y +B Y +C X +B Y +B Y +B Y +A Z +C Y +B Z +B Y +C X +B Y +C X +A Y +A Z +B Y +B Y +B Y +A Z +B Y +B Y +B Y +B Y +B Z +C Y +B Z +B Z +A Z +B Y +B Y +C X +A X +B Y +A Z +C X +C X +B Y +B Y +A X +B Y +B Y +C X +B Y +C X +B Y +B Y +B Y +B Y +A X +B Y +B Z +B Y +A Z +C X +C X +C Y +A Z +C Y +B Y +B X +A X +B Y +A Z +B Y +C Y +B Y +B Y +C Y +C X +A Z +A X +A Z +C Z +B Y +B Y +C Y +B X +C X +B Y +A Z +B Y +C X +A X +C X +C Y +C Y +B X +B Y +B Y +C Z +B Y +C X +A Z +C Z +C Y +A Z +C X +C Y +C Y +C X +B Y +B Y +C Z +A Z +B Y +A X +B Y +A X +A X +C Y +C X +A Z +B Y +C Y +C X +B Y +B Y +B Y +B X +B X +A X +C X +B Y +C Y +A Z +A Z +A Z +B Y +A Z +B Y +C X +B Y +C X +C Y +A Z +B Y +B Z +A Z +B Y +A Z +B Y +B Y +C Z +B Y +B Y +A Z +A X +C Z +C Z +B Z +B Y +A Z +B Y +B Y +B Y +B Y +C Z +A Z +C X +B X +B Y +A X +A X +B Y +A Z +A X +C Y +B Y +C X +A Z +B Y +C Z +C Y +B Y +A X +C Y +B Y +B Z +A Y +B Y +B Y +A Z +B Y +C Z +C X +B Y +A Y +C Z +B X +A X +B Y +B Y +B Z +B Z +C Y +B Y +B Y +A Z +A Z +B Y +B X +C Y +C Y +B Y +B Y +B Z +B Z +B Y +C Y +A Z +B Y +A Z +B Y +B Y +A Z +A Z +C X +C Z +B Y +C X +B X +A Z +B Y +B Y +C X +B Y +B Y +B Y +B Y +B X +B Y +A X +B Z +A Z +C Z +B X +A Z +C Y +C Y +A Z +B Y +C Z +C Z +C Y +B Y +B Y +B Y +A Z +B Y +B X +C X +B Y +B Y +B Y +B Y +C Y +B Y +C Y +B Y +C Y +C X +A Z +C Y +C Z +C Z +B X +C Y +B Y +B X +C Y +B Y +B Y +C Y +C X +C X +A Z +B Y +C X +A Z +C Z +B Y +B Y +C X +C X +B Y +B X +C Y +B Y +B Y +A Z +A Z +C Z +A Z +B Y +C X +C X +B X +B Y +B Y +B Z +B Y +B Y +B Y +B Y +B Z +B Y +C Y +C Z +B Y +C Y +C Y +C Y +C Y +A Z +A Z +C Y +C Y +A X +B Y +C Y +A X +C X +C Y +A Z +B Y +B Z +A X +B Y +B Z +B Y +B Y +B Z +C X +C Y +B Y +B Z +B X +A Z +B Y +C Y +B Y +B Y +A X +C X +B Y +C X +B Y +C Y +A X +A X +A Z +C Y +B Y +C Y +C X +B X +C X +C X +A X +A Z +B Y +B Y +B Y +A Z +B Y +B Y +B Y +B Y +B Y +B Y +B X +B Y +C Y +B Y +A Z +B Y +C X +C Y +B Z +C Z +B Y +A Y +C X +B Y +B Y +B Y +C X +A Y +C Z +B Y +C X +C Y +C Y +C Y +C X +C Y +B Z +B Y +C Y +C X +B Y +B Y +B X +C Y +B X +C Z +B Y +C X +B Z +C X +B Y +C X +B Y +C Y +C Y +A Z +C Y +C X +B Y +C X +B X +A Z +B Y +A Z +A Z +A Z +C Y +B X +A Y +C Y +B Y +B Y +C Y +C Y +C X +B X +A X +A Z +C X +A Y +B X +C Z +B Y +B Y +B X +C X +B Y +B Y +B Y +B X +B Y +C X +B Y +B Y +C Z +C Y +B Y +C Y +B Y +A Z +C Z +A Y +B Y +B Y +B Y +C Y +C Y +C Y +B Y +C Z +B Y +C Z +A Z +A Z +C Z +C Y +C Z +C Y +A Z +C X +B X +B Y +C Y +B Z +C Z +C X +B Y +A Z +B Y +C X +B Z +A X +B Y +A Z +C Z +C X +C X +C Y +B Y +B Y +A Z +A Z +B Y +B X +A Z +B Y +C Y +A X +C Z +B Y +B X +B Y +C Y +C Z +B Z +A Z +B Y +A X +C X +B Y +A Z +C X +B Z +C Y +C Y +C X +C X +C Y +B Y +B Y +B Z +B X +C X +B Z +C X +B X +C Z +C Z +C X +B Y +C Y +C X +B Y +A Z +C Y +C Z +C Z +C Y +B Y +A X +C Z +C X +B Y +C X +C Z +B Y +C Y +B Y +C Y +A Z +B Z +C Z +C X +B Z +B Z +B Y +A Y +C Y +C Y +B X +B X +B Y +B Y +B Y +C X +B Z +B Y +B Y +B Y +C X +A X +C Y +A X +B Y +B Y +B Y +B Y +B Y +C Y +C Y +B Y +B Y +B Y +B Y +C Y +B Y +C X +B Y +B Y +C X +A Z +A X +C Y +C Z +B Y +C X +B Y +B X +A Z +B X +B Y +B Y +A Z +B Y +B Y +B Y +B Z +A Z +A X +B Y +A Z +C Y +B Y +C X +B Y +C Y +B Y +B Y +C X +C Y +A Y +C X +C Y +B Y +A Y +A Z +C Z +A Y +A Z +B Y +C Y +C Y +B Y +B Y +B Y +B Y +A Z +B Y +B Y +B Y +C X +C X +B Y +C X +B Y +A Z +B Y +B X +C Z +C Y +A Y +B Y +C Y +B Y +C Y +C Y +C Y +C X +C Y +B Y +B Y +C Y +B Y +C Y +A Z +A X +B Y +A Z +B Y +C X +C X +B Y +C Z +B Y +B Y +C Y +B Y +C Z +A Y +B Y +C Y +B Y +A Z +C Y +B Z +C Y +C Y +C Z +B Y +C X +B Z +B Y +B Y +B Y +C Z +B Y +B Y +B Y +A Z +C X +B Z +B Y +B Y +C Y +B Y +C X +B Y +B Y +C Y +C X +C Y +B Y +B Y +C Y +B Y +A Y +B Y +A Z +B Y +B Y +B X +A Z +B Y +B Y +C Y +C X +C Z +A Z +A Z +C X +B Y +C Y +B Y +C X +B Y +B Y +C Y +C X +B Y +B Y +B Y +B Y +B Y +C X +B Z +B Z +A Z +B Z +B Y +B Z +B Y +C Y +A Z +A X +B Y +C Z +B X +A X +C Y +B Y +B Y +C Y +B Y +C Y +B Y +A Z +B Y +B Y +A Z +B Y +B Y +A Z +B Y +B Y +B Y +B Y +C Y +B Y +A X +A X +B Y +B Y +A Y +C Z +A Z +A Z +B Y +A Z +C Y +B Y +B Y +B Y +B Y +C Y +B Y +A X +B X +B Y +B Y +B Y +B Y +B X +C Y +B Y +B Y +B X +C Y +A Y +B Y +B Y +B Y +A X +B Z +C X +A X +C Z +B Y +B Y +B Y +C X +B Y +B Y +B Y +B Y +C Y +B Z +B Z +B Y +B Z +B Y +B Y +C Z +C Y +B Y +C Z +C Z +B Y +C X +A Y +B Y +B Z +A Z +B Y +C X +B Y +B Y +C Z +A Z +B Y +B X +B Y +C Y +B Y +B Z +B Y +B Y +C X +C X +C Z +B Y +B Y +B Y +A Z +A X +B Y +A Z +B Y +B Y +B Y +B Z +C X +C Z +B Y +B Y +B Y +C Z +B X +C Z +A X +B Y +C Y +B Y +A Z +A X +C X +B X +A Z +C X +B Y +C Y +B X +A Z +C Y +C Y +B Z +C X +B Y +C X +C Z +C Y +B Y +C Z +B Y +B Y +C X +B Y +B Y +B Y +B Y +B Y +B Y +C X +B Y +B Y +B Y +A Z +B Y +B Y +C Z +B Y +B Y +B Y +C X +A Z +B Z +C Y +C Y +B Y +A X +C Y +B Y +C Z +B Z +B Y +B Y +C Y +B Y +B Y +B Y +C Z +A X +B Y +C Y +A X +B Y +B Y +A X +B Y +A Y +C X +A Z +A Z +C Y +B Y +C Z +C Y +C Y +C Z +A Z +A X +C Z +B Y +C X +A Z +C X +B Y +B Y +B Y +C Z +C Y +C X +C Y +A Y +C X +A Z +A Z +B Z +C X +B Y +B Y +C X +A Z +C Z +C Z +B Y +B Y +A Y +C X +B Z +B Y +B Y +C X +C X +C Z +C Z +B Y +B Y +B X +B Y +B Y +C Z +C Y +C Z +B Y +B Y +B Y +C Y +B X +C X +A Z +C X +C X +C Y +B Y +B Y +C Y +B Z +B Z +C X +C Y +B Y +B Z +B Y +B X +A Z +C X +B Z +A Z +C X +B Y +C Y +C Y +B Y +B Y +B Y +B X +A X +B Y +A X +A Z +C Y +B Y +B Y +B Y +B Y +B Y +C Z +B X +B Y +C X +A Z +B Y +B Y +A Z +B Y +C Y +C Z +C X +C Y +B Y +B Y +B Z +B Y +A X +C Y +B Y +A X +B Y +C X +A Z +B Y +C X +A Z +B Y +C X +C Y +C X +B Z +C Z +B Y +C Y +C X +C Y +B Z +B X +A X +C Z +B Y +B Y +C Y +B Z +C X +C X +B Y +B Y +C Y +B X +B Y +C Y +B Y +B Y +A Z +B Y +B Y +B Y +A X +A Z +B Z +B Z +B Y +A Z +B Y +C Y +B Y +C X +B X +B Y +B Y +B X +C Z +B Y +C Z +C X +B Y +C Z +B Y +C Y +B Z +C Y +C Y +C Z +C Z +A X +B Y +A Z +B Y +B X +A X +B Y +B Y +B Y +C Y +B Y +B X +B Z +C Z +B X +B Z +B Y +C Y +B Y +B Z +C X +A Z +B X +B Z +C X +C Z +B Y +A Z +C X +C Y +B Z +B Y +C Y +B Y +C Y +B Y +B Y +B Y +C Y +B Y +C Y +C X +C Z +B Y +B Y +B X +C Z +B X +A Z +C Y +A Z +C X +C Y +B Y +C Z +B Z +C Z +C Y +C X +B Y +C Z +C X +B Y +B Y +B Y +B X +B Y +B Y +C X +A X +B Z +C X +C Z +B Y +C Y +B Z +C Z +B Y +C X +B Y +B Y +A Z +C Z +B Y +C Z +C X +B Y +B Y +C X +C X +C Y +B Y +A X +A Z +B Y +C X +B Y +B Y +C Y +B Y +A Z +A Z +C X +C Z +C X +C X +A X +B Y +B Y +C Y +C Z +C Y +B Z +C Y +B Y +B Y +B Y +C Y +B Z +B Y +B Y +B X +C Y +C Y +B Y +A X +C X +A X +C Z +C Y +A Y +B Y +B Y +B Z +C X +C X +B Y +A X +B Y +A Z +B Y +A Z +C X +C X +B Y +B Y +B Y +B Y +A X +B Y +B Z +C Y +C X +C Z +C Z +B Y +C Z +B Y +B Y +C X +B Y +A X +A Z +B Y +A Z +C X +B Y +C Y +B Z +C Z +B Y +B Y +B Y +B Y +C Y +C Z +B X +B Y +A Y +C Y +B Z +B Y +C Y +A Z +B Y +B Y +C Y +C Y +A Y +C Y +A Z +C Y +B X +B Y +B Y +C Y +A Z +C Y +A Z +B Y +B Y +B Y +B Y +A X +C Y +A Z +B Y +B Y +B Y +B Y +B Z +C Z +C Y +C X +B Y +C X +B Y +B Y +B Y +B Y +A Z +B Y +C Y +C Y +A Z +A X +B Y +C Y +C Y +B Y +C Y +C Y +C Y +C Z +A Z +C X +C Y +C X +B Y +B Y +C X +C Z +C X +C Z +B X +B Y +C Z +B Z +A Z +C Y +B Z +C Y +B Y +A X +B Y +A Z +B Y +A X +B Y +B X +B Z +B X +B Y +B Y +B Y +C X +B Y +B X +C X +B Y +B Z +B Y +C Y +B Y +B Y +C X +A Z +C X +B Y +C Y +C Z +B Y +C Z +B Y +B Y +B Y +B Y +C Z +C X +C Y +C Z +B X +A Z +A Z +B Y +B Z +C Y +A X +B Y +B Y +A Z +B Y +B Y +B Y +B Y +A Z +C Z +B Z +C Y +A Z +C Y +B Y +B Y +B Y +B Z +B Y +C X +C Z +B X +C X +B Y +C Z +C X +B Y +A Z +A Z +B Y +B Y +B Y +C X +A Y +B Y +B Y +A Z +A Z +C Z +C Y +B Y +B Y +A X +B Z +A X +B Y +A Z +B Y +C X +B Y +A Y +B Y +B Z +B Y +B Z +B Y +B Y +C Y +C Y +B Y +C X +C Z +B Y +B Y +B Y +C Z +A Z +C X +B Y +B Z +B Y +C Y +B Y +C X +B Y +B Y +C Y +B Y +B Y +B Y +B Y +B Y +B Y +B X +B Y +B Y +C X +B Y +B Z +A Z +A Z +C X +B X +B X +C Y +C Z +B Y +C X +A X +B Y +C X +C Z +C X +B Y +B Y +C Y +B Y +B Y +B Y +A Z +C Z +C X +B Y +B Y +A X +B Y +C Y +B Y +B Y +C Y +B X +B X +A X +C Y +C Z +C Y +B Y +B Y +C X +A X +A X +C X +B Y +C X +B Y +B Y +B Y +C Y +A Z +B Z +A Z +B Y +B X +C Y +B Z +B Y +A Z +B Y +C Y +B Y +C Y +A X +B Y +B Y +B Y +C X +A Z +C Y +B Y +B Y +B Y +C X +B Y +C Y +B Y +B X +C X +B Y +B Y +C Y +C X +C Z +C Z +B Y +B Y +B Y +B X +C X +B X +A Y +A Z +C Y +A X +B Y +B Y +B Y +A Z +C Y +C X +C Y +C Z +A Z +B Y +B Y +B Y +B Y +A Z +B Y +A Z +B Y +B Y +C Y +C Z +C Y +A Z +C Y +B Y +C Y +B X +B Y +A X +C Z +C Z +A X +C X +C Z +C X +C X +B Y +A X +A Z +C Y +B Y +C X +B Y +B Y +B X +C Y +C Z +B Y +B Z +A Z +C Y +B Y +A Z +B Y +C X +C X +B Z +C Y +B X +B Y +C Y +B Z +A Z +C X +C Y +C X +C Z +B Z +C Z +B Y +B X +B Y +B X +B Y +B Y +B Y +B Y +C X +C X +C Y +B Z +C X +B Y +B Y +B Z +C Z +C Y +B Y +B Y +B Y +C X +B Z +B Y +B X +B Y +C Y +C X +C Z +C X +C Y +B Y +B Y +B X +B Y +C X +B X +A X +B Y +C Y +B Y +A X +C Y +B Z +B Z +C X +C Z +C X +B Y +C Y +C Y +B Y +C Z +B Y +C Y +B Y +C Y +A Z +B Z +C X +C X +B Y +B Y +B Z +B Y +B Z +A X +C X +C X +B Y +C X +A Z +C Y +B Y +A Z +C Z +B X +C Y +C X +C X +A Z +B Y +B Y +C Z +B Y +A Y +C Y +B Y +B X +B Z +C X +B Y +B X +C Z +B Y +B X +B Y +B Y +B Y +A Z +A Z +B Z +A Z +C Y +C Z +B X +C X +A Z +C X +B Y +B Y +A X +B X +B Y +B X +B X +A Y +A Z +C X +B Z +B Z +C Y +C Y +B Y +B Y +B Y +A Z +A Z +B Y +B Y +C Y +C Y +C Y +C Z +C X +C Y +B Y +B X +B Y +A Y +A X +C Y +B Y +A Z +B Y +B Y +C X +C X +B Y +B Y +C Y +A Z +B Y +C Y +C Z +C Z +C Y +A Y +B Y +B Y +C Y +B X +C Z +C Z +C Z +B Y +B Y +B Y +C Y +A Z +B Y +A Z +B Y +A Z +C X +C Z +C Y +B Y +A Z +B Y +B Y +C Z +B Y +C X +B Y +C Y +C Y +B Y +B Y +A X +C Z +B Y +C Y +C X +B Y +B Y +B Y +B Z +A Z +B Y +B Y +B Y +A Z +B Y +A X +B Y +B Y +B Y +C Y +C X +C Y +A Z +B Y +C Y +B Y +C Y +C Y +C Y +A X +C Z +B Y +B Y +C Z +B Y +B Y +C Z +B Z +B Y +C Y +B Y +B Y +B Y +B Y +B X +C X +C Y +B Y +A Z +B Y +A X +B Y +B Y +B Y +B Y +C Z +C Z +B Y +A Z +B Y +C X +C X +C Y +B X +A X +B X +B Y +C X +C Z +C Y +C Y +B Y +C Z +B Y +B Y +C Z +A X +B Y +C Z +B Z +B Y +C X +C X +B Y +B Y +B X +C Z +A Z +A X +B Y +C X +B Y +B Y +C Z +B Z +C Y +B Y +B X +C X +C Z +B Z +B Z +C Y +B Y +A X +B Y +B Y +C X +B X +A Z +B Y +A Z +B Y +B Y +A Z +C X +C X +B Y +B X +B Y +A Z +C Y +C Z +B Y +B Y +A X +B Y +C Y +C Y +B Y +A X +B Y +B Y +A Z +C X +C X +C Y +B Y +A X +B Y +B Y +C Y +B Y +B Y +B Y +B Z +B Y +C Y +C Y +B Y +C X +C X +B Y +C Y +B Y +C X +B Y +B Z +B Y +A Z +A Z +C X +A Z +A Z +B Y +B X +C Z +B Y +B Y +B Y +B Y +B Y +C X +C Y +B Y +A X +C X +C X +C Y +B Y +C X +C X +C Z +B Z +C Y +C X +B Y +B Y +C X +B X +C Z +B Y +B Y +C Y +A Z +C Y +C X +C Y +B Y +B Y +C X +C Y +C Y +C X +B Z +B Z +B Y +B Y +C Y +B Y +C X +A Z +A X +C Z +B Y +C Y +C Y +B Y +B Y +C Y +B Y diff --git a/day02b/src/main.rs b/day02b/src/main.rs new file mode 100644 index 0000000..55c00c5 --- /dev/null +++ b/day02b/src/main.rs @@ -0,0 +1,140 @@ +/// --- Part Two --- +/// +/// The Elf finishes helping with the tent and sneaks back over to you. "Anyway, the second column +/// says how the round needs to end: X means you need to lose, Y means you need to end the round in +/// a draw, and Z means you need to win. Good luck!" +/// +/// The total score is still calculated in the same way, but now you need to figure out what shape +/// to choose so the round ends as indicated. The example above now goes like this: +/// +/// In the first round, your opponent will choose Rock (A), and you need the round to end in a +/// draw (Y), so you also choose Rock. This gives you a score of 1 + 3 = 4. +/// In the second round, your opponent will choose Paper (B), and you choose Rock so you lose +/// (X) with a score of 1 + 0 = 1. +/// In the third round, you will defeat your opponent's Scissors with Rock for a score of 1 + 6 +/// = 7. +/// +/// Now that you're correctly decrypting the ultra top secret strategy guide, you would get a total +/// score of 12. +/// +/// Following the Elf's instructions for the second column, what would your total score be if +/// everything goes exactly according to your strategy guide? +use clap::Parser; +use itertools::Itertools; + +use std::fs::File; +use std::io::prelude::*; +use std::io::BufReader; +use std::path::PathBuf; + +const FILEPATH: &'static str = "examples/input.txt"; + +#[derive(Parser, Debug)] +#[clap(author, version, about, long_about = None)] +struct Cli { + #[clap(short, long, default_value = FILEPATH)] + file: PathBuf, +} + +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +enum RockPaperScissorsKind { + Rock, + Paper, + Scissors, +} + +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +enum GameOutcome { + Win, + Loss, + Draw, +} + +#[derive(Copy, Clone, Debug)] +struct GamePrediction { + outcome: GameOutcome, + opponent: RockPaperScissorsKind, +} + +fn kind_to_value(kind: RockPaperScissorsKind) -> i32 { + use RockPaperScissorsKind::*; + match kind { + Rock => 1, + Paper => 2, + Scissors => 3, + } +} + +fn opp_to_kind(val: char) -> Option { + use RockPaperScissorsKind::*; + match val { + 'A' => Some(Rock), + 'B' => Some(Paper), + 'C' => Some(Scissors), + _ => None, + } +} + +fn exp_out_to_outcome(val: char) -> Option { + use GameOutcome::*; + match val { + 'X' => Some(Loss), + 'Y' => Some(Draw), + 'Z' => Some(Win), + _ => None, + } +} + +fn outcome_to_value(outcome: GameOutcome) -> i32 { + use GameOutcome::*; + match outcome { + Win => 6, + Draw => 3, + Loss => 0, + } +} + +fn pred_to_player_kind(pred: GamePrediction) -> RockPaperScissorsKind { + use GameOutcome::*; + use RockPaperScissorsKind::*; + match (pred.outcome, pred.opponent) { + (Win, Rock) => Paper, + (Win, Paper) => Scissors, + (Win, Scissors) => Rock, + (Loss, Rock) => Scissors, + (Loss, Paper) => Rock, + (Loss, Scissors) => Paper, + (Draw, x) => x, + } +} + +fn game_pred_to_value(prediction: GamePrediction) -> i32 { + outcome_to_value(prediction.outcome) + kind_to_value(pred_to_player_kind(prediction)) +} + +fn main() { + let args = Cli::parse(); + + let file = File::open(&args.file).unwrap(); + let reader = BufReader::new(file); + let res: i32 = reader + .lines() + .map(|l| { + l.unwrap() + .split(' ') + .map(|w| w.parse::().unwrap()) + .collect_tuple::<(char, char)>() + }) + .map(|v| v.unwrap()) + .map(|(o_char, out_char)| GamePrediction { + outcome: exp_out_to_outcome(out_char).unwrap(), + opponent: opp_to_kind(o_char).unwrap(), + }) + .map(|pred| game_pred_to_value(pred)) + .sum(); + + println!( + "The total score if everything goes exactly according to your strategy guide is {}", + res + ); +} -- cgit v1.2.3