From 8dfa008aae5cd747947f023ac312d605cd636cbd Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 3 Dec 2022 08:53:34 +0000 Subject: [PATCH] Finished day 2 --- input/day_2.txt | 2500 +++++++++++++++++++++++++++++++++++++++++++++++ src/day_1.rs | 6 +- src/day_2.rs | 133 +++ src/main.rs | 8 +- 4 files changed, 2641 insertions(+), 6 deletions(-) create mode 100644 input/day_2.txt create mode 100644 src/day_2.rs diff --git a/input/day_2.txt b/input/day_2.txt new file mode 100644 index 0000000..4e8e187 --- /dev/null +++ b/input/day_2.txt @@ -0,0 +1,2500 @@ +A Z +B X +A Y +B X +C Y +C X +B Z +C Z +A Y +C Z +B Z +B X +B X +C X +C X +B X +B Z +C X +B Y +B Z +B X +C Z +A Z +B X +A Y +B Y +C Y +B X +B Y +B Z +B Y +B Z +A Y +C Y +B X +A Z +B X +C Y +C Y +C Y +A Y +B X +B Y +C Y +B Z +C Y +A Z +B Y +A X +B X +C X +B Y +B Y +B Y +B Y +C X +A Y +A Y +C Z +C Y +B Y +B Y +B X +A Y +C Z +B Y +B Z +B Y +A Y +C X +B Y +B X +C Z +C Z +B X +A Y +C X +B Z +C Z +C Y +C X +B Z +B X +A Z +B X +C Z +C Y +C Y +B Y +B Z +B Y +A Y +A Y +C Y +C Y +C Z +C X +B X +B Z +B X +C Z +A Y +A X +B Y +A Z +B Y +B X +C Z +C Z +B Y +B Z +B Y +B Z +C X +C X +A Y +C Y +C Z +B Z +C Y +B Z +C X +B Y +B X +C X +A Z +B Y +C Y +C X +C Y +C Z +B Z +B X +C X +A Y +B X +B Z +C X +C Z +B Y +B Y +C X +B Z +A Y +B Y +C Y +C X +C Z +C Y +A Z +C Y +C X +C Y +B X +C X +B Y +C X +B X +B X +B Y +B X +A Z +B Y +B Y +C X +C Y +B X +B X +C Y +A Y +A Z +C X +B X +A Z +A Z +A Y +C X +C Z +C X +B X +C X +C X +B Y +B X +B X +B X +B Y +A Y +C X +C Y +B X +C X +A Y +B Z +C Z +B X +C Y +B Y +C Y +B Z +C X +C Y +C Y +B Y +C X +C X +B Z +B Y +B X +C Z +B Y +B X +B Z +B Z +C Y +B Z +A X +C X +B Z +B Z +B Z +B Y +C Z +C X +C X +C Y +B Z +B Y +B X +A Y +B Y +A Y +C X +C Z +C X +B Z +B Z +C X +C Y +A Y +B Y +C X +C Z +C X +C X +C Z +C Z +C X +B Y +C X +A Y +C Y +C Z +B X +B Y +B Z +A Y +B X +B Z +B Z +B Y +B X +C Y +A Y +B Z +C X +B Z +B Z +B Y +B Z +B X +C Y +C X +C X +B Z +B Y +C Z +B Y +B X +C Z +C Z +B X +A Z +B Z +A Z +C Y +C X +B Y +C Y +C X +C Y +C X +A Z +C Y +B Z +B X +C X +C Z +C X +C Z +B Z +B Y +B Z +B Y +C X +B Z +B Z +B Y +B Z +C Z +B Y +B Z +C Z +C Z +C X +B X +C Y +B X +C Y +B X +B X +C Y +A Z +B X +B X +C Z +C X +C X +C X +C Z +C Z +C Y +C X +A Y +B Z +C Z +C Y +C X +B Y +B Y +A Z +B X +B Y +B Y +C Z +C Z +B X +C X +A Z +B X +C Z +B Z +C X +A Z +B X +C X +C X +A Y +B Z +B Z +B X +C Y +C Z +C X +A Z +B Y +C Y +C Y +C Y +C X +B Y +B X +B X +C X +B Z +C X +B Z +B Z +B X +C X +A Y +B Y +C Z +C X +B Y +B Y +C Z +B X +C X +C Z +B Z +A Y +B X +B Z +B Y +C X +C Z +A Y +A Y +B X +B X +B Z +B Z +C Y +C X +B Y +B X +B X +B Y +B Y +C X +B X +B X +A Y +B Y +B Z +B Z +C Y +B Z +C Z +C X +C X +C Y +C X +C Z +C Z +B X +C X +B X +C Y +C Y +B Z +B Y +C X +B Z +C X +B Z +A Y +C X +B X +B Y +C X +C Y +B X +B Z +B X +C Y +B Z +B Y +B Z +C X +C X +C X +C Y +B X +B X +B X +C X +B X +B X +B Y +B Z +B Y +C X +B Y +B X +B X +A Y +C Y +B Z +A X +C Z +C Z +B Z +A Y +C Y +B Y +B Y +C Z +C Y +C X +A Y +C Y +B Y +C X +A Z +C Z +A Y +C Z +C Z +A Z +B Y +C Z +C Z +B Z +A Y +C X +C Y +B X +B Z +B X +C X +B X +C Z +B X +B X +B Y +C X +B Z +C X +A Z +C X +B Z +C X +C Z +B X +C X +B Y +B X +B Y +B Y +C X +B Y +C Z +C X +B Y +A Y +C Y +B Z +A Z +A Z +C X +C Y +C Y +B Y +B Y +C Z +C X +A X +B X +C Y +B Z +B X +B Y +A Z +A Z +A Z +C Z +C X +B Y +B Z +C X +B X +B X +B Z +A X +C X +A Y +C X +B X +C Y +C X +B Y +B Y +B Y +C X +C Y +C Y +B Z +B X +C Z +A Y +B Y +C Y +C X +C X +C Y +A Z +C Z +C Y +C Y +C Y +C Y +B Z +B Z +C X +B Y +C Y +B X +C X +C X +C Y +C Y +C Y +C X +B X +B Y +A Y +A Y +B X +B X +C Y +B Z +C X +A Y +A Y +C Z +B Z +C Z +C Z +A Z +B Z +A Y +B Z +B X +C X +A Y +B X +B Z +B X +C X +C Z +B Z +A X +B Z +B Y +B Z +B X +C Z +B X +B Y +B Y +B X +B Z +C X +A Y +B Z +B Y +C Y +A Y +C Z +B Z +C X +B Y +C Y +A Y +C Y +A Y +C X +B X +B Y +A Y +B X +B X +A Y +B X +B Y +B X +B X +C X +B Z +B Z +B Y +A X +C X +B X +C X +B Y +C X +C Y +C Y +C X +A Y +A Y +B Y +C X +B Y +C Y +B Y +C Z +C X +C X +C X +B Y +C Y +C Z +B Y +C X +B X +B Y +A Y +C X +B Y +B Z +A X +B Z +B Y +C Y +C X +B X +C X +C Y +B X +C Y +B Y +C X +B X +A Y +C Y +C X +A Y +B Y +C Y +C X +B Y +B Z +B X +B X +C Y +C Y +C X +B X +C Y +B Z +C Z +B Z +B Z +B Y +A Z +A Z +C Z +C Z +A X +A Y +B Z +C Y +A Y +B Y +C Z +B Z +C X +C Z +B Z +B Z +B Y +A Y +B Y +C X +C X +A Z +B X +C X +C Z +C Y +B X +B X +C Z +C X +C Y +C X +B Y +B Y +C X +C Y +C Z +B Z +C Z +B X +B Z +C Y +A X +A X +B Y +B X +B Z +C X +C X +A Y +C X +C X +C Z +C Y +C X +B X +C X +B X +B X +A Y +A Y +C X +B X +B Y +C X +C X +C Z +C Y +A X +C X +B Z +B X +C Y +B Y +A Z +C Y +C Z +B X +B Y +C Z +C Y +C Z +C Y +C X +C Z +B Z +A Z +B X +C X +B Z +B Z +A Y +C X +B X +C X +B X +C X +B Z +A Y +C X +B X +C Y +C Y +C X +C Y +B Z +C Z +C X +B Z +C Z +C Z +C Z +B Z +C Z +B Y +B Y +C Z +A Z +A X +B Z +C X +B X +C Y +A Y +C X +C X +A Y +C X +C Y +B Y +C Z +B X +A Y +C X +C X +B X +B X +A Z +B Y +B Z +B X +B X +B Z +B X +B X +B Z +A Z +C Z +B X +B X +C Y +B Z +B Z +B X +B Y +B Z +C Y +B Z +C Z +C X +C Y +A Y +C Y +C X +B Y +C Y +C Z +B Y +C X +B Z +B Z +A Y +B Y +B Y +B X +C Y +C X +B X +C X +A Y +C X +C Y +B X +C X +C Y +C Y +B Z +C Z +B Y +B Z +A X +C Y +A Y +C X +B X +B X +B Y +C Y +C Y +C X +A Y +A Z +B X +A X +C Z +C X +B Z +C Y +B X +A Y +C Y +C Y +B X +A Z +A Y +B Z +B Y +B Z +B Y +C X +A X +A Y +B X +B Z +B X +C X +B Y +B X +B Y +B X +C Z +C X +A Y +C Y +B X +B Y +A Z +B Z +C X +C X +C X +A Y +C X +C Y +B Y +B Z +B Y +B X +A Y +C Y +C Y +C Y +C X +A Y +B Z +C Z +C Y +B X +C X +C X +B X +B Z +B Z +B Y +A Z +B X +A Y +B Y +C X +B Y +A Y +B X +C Y +C X +A Y +C Z +C X +B Z +C Y +B X +C X +A X +C Y +B X +B Y +B Y +C X +B Y +C Y +C X +B Y +A Y +C Z +C Y +B Z +C Z +B Y +C X +B Z +A Y +C Z +B X +B Z +C Y +B Z +C X +C X +A Z +B Z +A Y +B X +C X +C X +B Y +A Z +C Z +C X +B Z +C X +B Z +C Y +C X +C Z +C Z +C Y +C Y +C X +C X +C Y +B X +C X +B Z +C Z +C Y +C X +C Y +B Y +B Y +B Z +B X +C Y +C Y +C X +C Z +C Y +C Y +C X +A Y +B X +B Z +C Z +C Y +B X +C X +A Y +C Z +B Y +C Y +C X +C Y +C Y +B X +C Y +C Y +B Y +C X +A Z +B X +B X +B X +B X +B Z +C Y +B X +A Z +B Z +A Y +C X +B X +B Z +C Z +C X +B Z +B X +A Z +A Y +B Y +A Z +B X +C Y +B Y +C Y +C X +B Y +B Y +C Y +A Z +B X +B Z +B Y +B Y +B X +B Y +B Z +C Z +B Y +C X +A Y +C X +B Y +B X +A Y +C Y +C Y +B X +B Y +B Z +C Y +C Y +C Z +C Z +A Y +C X +B Z +C X +B Y +C Y +B Z +C X +C X +A Y +C Y +A Y +C X +C X +C Z +A Y +A X +B X +C Y +B Z +C X +B Y +C X +C Y +C X +B X +B Y +B Z +C Y +B Y +A Z +C Y +B X +C X +A Z +C Y +B X +B X +C Y +C Y +B X +C Y +C Z +C X +B X +C Y +B Z +B Z +A Y +C X +C X +C Y +B X +A X +A Y +A Y +C X +B Y +C X +C Z +B Y +C Y +B X +C Y +B Z +B Y +A Z +B X +B Z +B Y +B X +C X +B Y +C X +C Y +B Y +A Y +C X +C Z +B Y +C Y +C X +C X +C X +B X +C X +C Y +B Y +C X +C Y +C X +A Y +B Z +B X +C X +A Y +B Z +A Y +B Z +B Z +B Z +A Y +B X +C Y +C X +B Y +A Y +C X +C X +A Y +C X +C Z +B X +C Y +C X +B Z +B Y +A Y +C X +C X +B Y +B Z +B X +B Y +C X +B X +C Y +B X +A X +B Z +B Y +B Y +C X +B X +C X +C X +C X +C X +B X +B Z +B X +B Z +B X +C X +B X +C Z +B Y +B Z +B Y +C X +B X +B Z +A Y +B Z +C Y +B X +B Y +C Z +C X +B X +A Y +A Y +B X +A Y +C Y +C X +A X +C Y +C Y +C X +C X +C Z +C Y +B X +A Y +C X +B Y +B Z +B Z +C Y +B Y +B Y +B Y +C Y +B Y +B Z +B Z +B Z +A X +B X +C Y +C Y +C Y +C Z +B Z +B X +C Z +C Y +A Y +A Y +C Y +B Z +C Y +C Z +A Z +C Y +A Y +C Z +C X +B Z +B Y +B Y +A X +C X +B Z +B X +B Z +C Z +B X +A Y +B Z +C X +C Y +B Y +C X +B Z +B Z +B Z +C X +B Z +B Y +B Y +B Y +C Y +A Y +B X +A Y +C Z +C X +C X +C X +C X +C Y +B Y +B X +C X +C X +B Z +A Z +C X +C Z +B X +B Z +C Y +B X +B X +B Y +C Y +B Z +A Z +B X +C Y +B Z +B X +C Y +B Z +B X +C Z +C X +C Z +B Z +A Y +B Y +A Z +C Z +B Z +B Z +B Z +C Z +C X +A Y +C Z +B Z +B X +B X +B Y +A Y +B Y +C X +B Y +C Z +C Y +B Z +C X +A Z +B Z +C Y +C Z +B X +C Z +A Y +A Y +A Y +C Z +C Z +B Y +C X +C Z +C X +C Y +B Z +C Z +B Y +C Y +A Y +B X +B X +B X +B X +C Y +C Y +C X +B Z +B X +A Y +B X +B X +C Y +C Y +C Y +C Y +B Z +B Y +C X +B Y +B X +C X +C X +B X +C X +C X +B X +B Y +B X +B X +B Y +B X +C Y +B Y +C Y +C Z +C X +B Z +B Z +B Y +C Z +C Z +C Y +B X +B Y +B Z +B Z +A Z +C X +C Y +B X +B X +C X +B Z +C X +B Y +C X +C Y +B Y +B Y +A Z +B Y +B X +C Y +B Z +A Z +B Y +C Y +C X +B X +B X +B Z +C Z +C Z +C X +B Z +B X +A Y +C X +A Y +A Y +B Y +C Y +B X +C Z +B Z +B X +C X +A X +C Z +B Z +B X +C Y +C X +B X +C Z +C Y +B Z +C Y +B Y +C X +B Z +A Y +C X +C Y +A Y +B Y +B Y +C X +B X +B Y +B Y +B Y +A Y +A Y +C Z +C Y +B X +A Y +C X +C X +C Y +C X +A Y +B Y +C Y +B X +C Y +C X +C X +C X +A Y +A Y +B Y +B X +B Y +B X +C X +C Y +B Z +B Y +C Y +C Z +A Z +B X +B Z +C Z +A Y +C Y +B X +C X +B X +B Z +C Y +B X +B Y +B X +B Z +C Y +C Z +A Y +C Y +A Z +B Y +A Y +A Y +C X +A X +A X +C Y +C Z +C Y +B X +C X +B Z +B Y +C X +C X +A Y +C X +C Y +C X +C X +C X +C X +C Z +B X +A Y +C Y +B Z +B Z +C Z +B Y +B X +B Y +C X +C Y +B Y +B X +B Y +C X +B Z +B X +C Z +C Z +B Z +C Y +A X +C Z +C X +C X +A Y +B X +C X +B Z +C X +B Y +C Z +B X +B Y +C Y +B Z +B Z +C X +C X +B Z +C Z +B Y +B Y +B Z +B X +C Y +C Y +B X +B X +B X +B Y +B Z +B Y +C X +C Y +C Z +B X +B Y +C X +B X +A Z +A Z +C Z +C Z +C X +C Y +C X +B Y +C X +C X +B Z +B Z +B Y +C Y +B Y +B Y +B X +B X +C Y +A Z +C Y +B X +B Z +B Y +A Y +C Z +B Z +C Y +C Z +C Y +C Z +B Z +B Z +C X +C X +B X +B Y +B X +A Z +B X +B Z +B X +B Y +C Y +B Y +C Z +C X +A Y +A Y +C Y +B Y +C Y +B X +B Y +C Z +A Z +B X +B Y +B Y +B Y +B X +C X +C Y +C X +B X +B X +B X +B Y +B X +B Z +B Y +C Y +A Z +C Z +B Y +C Y +B Z +B Y +B Y +C X +B X +C Z +C X +B X +A Y +B Z +C Y +C Y +B Y +B Y +A Y +A Z +B X +B Z +B Z +B Z +B Z +A Y +B Z +B X +C X +C Y +B Y +C Y +B X +C X +A Y +C Z +B X +B X +B Y +A X +B X +C Y +B Z +A X +C Y +C Z +C Z +B X +C X +A X +C X +A Z +B X +B Y +C Z +B Z +B X +C X +B X +C Z +C X +B Z +A Z +A Y +C X +C Y +B X +C X +A Y +C X +B X +B Z +C Y +B X +C Y +C X +B X +C X +C Z +A Z +C Y +C Y +C X +C Z +A Y +C X +C X +C X +C X +B Y +B Z +C X +C Y +C X +B X +A Y +C Y +A Y +A Z +B X +C Y +C X +C Y +C X +B X +B Y +B X +C X +B Z +B Z +B Y +B X +B X +B Y +B Y +A Y +C Y +B Z +B X +C Y +C Y +C X +A X +B Z +C Y +B X +C Y +B Y +C X +C Y +C Z +A Y +C X +A Z +C X +B Y +C X +B X +B Z +B Z +B Y +B Z +B Z +B X +C X +B X +B Y +B X +B Z +C Y +B X +C X +C Y +C X +B Y +B X +C X +B X +C X +B Y +C Z +C X +B Z +A Y +B X +A Y +B Y +B X +C Y +B X +B Z +C Z +B Y +C X +A Y +B Y +C X +C X +B Y +C Y +B Z +C X +B Z +B X +C Y +C X +C Z +B X +C Z +B X +B X +C Y +B Y +C Y +B Y +C X +A Y +B X +C X +C Z +C X +A Y +B Z +A Y +B Z +B X +B Z +B Y +A Y +C X +B Y +C Z +A Y +B X +C X +C Z +C X +C X +B X +C X +C Z +B Z +C Z +B X +C Z +B Z +B Y +B X +B X +B X +C Z +C Y +A Y +B Z +B X +B X +C Z +A Y +B X +C Y +B Z +C X +B Y +C Y +B X +B X +B X +B Y +B Y +C X +C Z +B Z +C X +B Y +B Z +B Z +B Y +B Y +C X +B Y +B Y +B Z +A Y +C Y +C X +B X +C Y +C X +C X +B X +B Z +C X +A Y +B Y +C Z +C Y +B X +B X +B Z +C Z +C X +A Y +C Z +C X +C X +B Z +B X +C Y +B Y +B Y +C Z +B Z +A Z +C X +A Y +C Y +B X +C X +B X +A Y +C X +C Z +C Y +A Z +C X +B Z +B Y +A Y +C X +B X +C Z +C Y +C Y +B Z +C X +C Y +B Z +B Y +C X +C Z +B Z +A Z +C Z +B X +C X +C X +C Y +C X +B Z +C X +C Y +C X +B Z +B Z +A Z +B Z +B X +B X +C Y +C Z +B Z +C Y +C Z +B X +A Y +B X +C X +B Y +C X +B Y +B X +C X +B Z +C Y +C X +B X +B X +B X +B Y +B Y +B Y +A X +B X +C Y +C Z +B Z +C X +A Y +C X +C Y +B Y +C Y +C X +B Z +B Y +B Y +B Z +C Y +C Y +A X +C Z +B X +B Z +B Y +C X +C Y +B Y +C Z +B Z +C X +B Z +C X +B Y +B Z +C X +C X +B Y +B Y +B Y +C X +B Y +B Z +B Y +A Z +B Z +A X +C Y +A Y +C Y +B Z +B X +A Y +C X +B X +A Y +B Y +C X +B Y +C X +B X +B Z +A Y +B Z +B X +C Z +C X +B Z +C X +A Y +C Y +C Y +A Y +B Y +C X +C Y +C X +B X +C Y +B Z +B X +B Y +B X +C X +B X +C Y +C Y +B Y +B Z +C Z +B X +C Y +C X +A X +A Y +B Z +B Y +A Y +C X +C X +C Y +B X +C Z +C Z +B Y +B X +C X +A Y +B X +B X +C Z +C X +C Z +B X +B X +B Y +B Y +C Y +C X +A Z +C Z +B Y +C X +B Z +C X +B X +C X +B Z +C Z +B Y +B X +B Y +C Y +B Y +C Z +A Z +B X +C Z +B Y +C Z +C X +A X +B Z +B Z +C Y +C X +B Y +C Y +C Z +B X +B Z +C X +C Z +B Z +C Z +B X +C X +B Y +B Z +C Y +B Y +B X +B Y +B Z +B Z +A Z +B Y +C Y +A X +B X +C Y +A Y +C Y +B X +C X +B Z +C Y +C X +C Z +B Y +B X +C Z +A Y +C Y +C X +B X +B Z +B Z +B X +C Y +C Z +C Z +B Z +B X +C X +A Y +B X +B Z +C Y +C X +B X +C X +C X +B Y +A Y +A X +C Z +C Y +C Z +C Z +C Z +C X +A Z +C Y +B X +A X +B X +B X +A Y +B X +C X +B X +B X +B X +C Y +C X +A Y +B X +C X +C Y +A Y +C X +C Y +C Z +C X +C Z +C Z +B Y +B Y +C Y +A Y +C Y +B X +B Z +B Z +C Z +C X +B X +B Z +C X +B Z +B Z +C X +B Z +B Z +B X +B Y +C Z +B Y +B Z +A Y +C X +C X +B Z +C Y +C X +A X +B Z +C Y +C Z +B Z +B Z +C Y +A Y +C Z +C X +C X +C X +B Z +C X +B Y +C X +C X +B Z +C X +A Y +C Z +C X +A Z +B Y +A Y +B X +B X +C Y +B Y +B X +A Z +B Z +C Y +C X +B Y +B Y +B Y +B Z +C Y +C Y +A Y +C Y +C Z +B X +C X +B Y +C Y +A Z +C Y +C X +B Z +C Z +B Z +C X +C X +C X +B X +C Y +C Z +B X +C X +A Y +C Y +B Y +B Z +C Y +C X +C X +B X +C X +C Z +C Y +A Y +C X +B Y +B Z +C X +C Z +B Z +C Z +B Z +B X +B X +C X +C Z +B Y +B X +C Z +A Y +B X +B Y +C X +B X diff --git a/src/day_1.rs b/src/day_1.rs index 9bd8f56..7e8cb77 100644 --- a/src/day_1.rs +++ b/src/day_1.rs @@ -1,10 +1,10 @@ -fn elf_calorie_counts(input: &String) -> Vec { +fn elf_calorie_counts(input: &str) -> Vec { input.split("\n\n").map(|elf| { elf.split_whitespace().map(|meal| meal.parse().unwrap_or(0)).sum() }).collect() } -pub fn part_1(input: &String) -> u64 { +pub fn part_1(input: &str) -> u64 { let mut elf_calorie_counts= elf_calorie_counts(input); elf_calorie_counts.sort_unstable(); @@ -12,7 +12,7 @@ pub fn part_1(input: &String) -> u64 { elf_calorie_counts.pop().unwrap() } -pub fn part_2(input: &String) -> u64 { +pub fn part_2(input: &str) -> u64 { let mut elf_calorie_counts= elf_calorie_counts(input); elf_calorie_counts.sort_unstable(); diff --git a/src/day_2.rs b/src/day_2.rs new file mode 100644 index 0000000..e373530 --- /dev/null +++ b/src/day_2.rs @@ -0,0 +1,133 @@ +#[derive(Debug)] +enum Error { + InvalidMove, + InvalidOutcome, +} + +#[derive(Clone, PartialEq)] +enum Move { + Rock, + Paper, + Scissors +} + +impl Move { + fn from_str(input: &str) -> Result { + match input { + "A"|"X" => Ok(Self::Rock), + "B"|"Y" => Ok(Self::Paper), + "C"|"Z" => Ok(Self::Scissors), + _ => Err(Error::InvalidMove) + } + } + + fn beats(&self) -> Move { + match self { + Move::Rock => Move::Scissors, + Move::Paper => Move::Rock, + Move::Scissors => Move::Paper, + } + } + + fn is_beaten_by(&self) -> Move { + match self { + Move::Rock => Move::Paper, + Move::Paper => Move::Scissors, + Move::Scissors => Move::Rock, + } + } + + /// I don't really know why, but these moves have different scores + fn score(&self) -> u64 { + match self { + Move::Rock => 1, + Move::Paper => 2, + Move::Scissors => 3, + } + } +} + +enum Outcome { + Win, + Draw, + Lose, +} + +impl Outcome { + pub fn from_str(input: &str) -> Result { + match input { + "X" => Ok(Self::Lose), + "Y" => Ok(Self::Draw), + "Z" => Ok(Self::Win), + _ => Err(Error::InvalidOutcome) + } + } +} + +fn play(player: Move, opponent: Move) -> Outcome { + if player.beats() == opponent { + Outcome::Win + } else if player == opponent { + Outcome::Draw + } else { + Outcome::Lose + } +} + +/// decrypt a rock-paper-scissors strategy guide, run through it and calculate the outcome +pub fn part_1(input: &str) -> u64 { + let mut score = 0; + let throws = input.lines(); + + for throw in throws { + let mut throw: Vec<&str> = throw.split_whitespace().take(2).collect(); + let player = Move::from_str(throw.pop().unwrap()).unwrap(); + let opponent = Move::from_str(throw.pop().unwrap()).unwrap(); + + score += player.score(); + + match play(player, opponent) { + Outcome::Win => { + score += 6; + } + Outcome::Draw => { + score += 3; + } + Outcome::Lose => {} + } + } + + score +} + +/// decrypt a rock-paper-scissors strategy guide, run through it and calculate the outcome +pub fn part_2(input: &str) -> u64 { + let mut score = 0; + let throws = input.lines(); + + for throw in throws { + let mut throw: Vec<&str> = throw.split_whitespace().take(2).collect(); + let player = throw.pop().unwrap(); + let opponent = Move::from_str(throw.pop().unwrap()).unwrap(); + + let player = match Outcome::from_str(player).unwrap() { + Outcome::Win => opponent.is_beaten_by(), + Outcome::Draw => opponent.clone(), + Outcome::Lose => opponent.beats(), + }; + + score += player.score(); + + match play(player, opponent) { + Outcome::Win => { + score += 6; + } + Outcome::Draw => { + score += 3; + } + Outcome::Lose => {} + } + } + + score +} diff --git a/src/main.rs b/src/main.rs index e294e4e..dff206f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,9 @@ mod day_1; +mod day_2; fn main() { - let day_1_input = std::fs::read_to_string("input/day_1.txt").unwrap(); - println!("Day 1, part 1: {}", day_1::part_1(&day_1_input)); - println!("Day 1, part 2: {:?}", day_1::part_2(&day_1_input)); + println!("Day 1, part 1: {}", day_1::part_1(include_str!("../input/day_1.txt"))); + println!("Day 1, part 2: {}", day_1::part_2(include_str!("../input/day_1.txt"))); + println!("Day 2, part 1: {}", day_2::part_1(include_str!("../input/day_2.txt"))); + println!("Day 2, part 2: {}", day_2::part_2(include_str!("../input/day_2.txt"))); }