From 256d351f8e6797355d9ec20966d346e5a67b5970 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Fri, 2 Dec 2022 09:05:31 +0100 Subject: [PATCH] Implement day 2 2022 --- 2022/benches/days.rs | 2 +- 2022/inputs/02.txt | 2500 +++++++++++++++++++++++++++++++++++++++ 2022/src/day02.rs | 124 +- 2022/src/samples/02.txt | 3 + 4 files changed, 2624 insertions(+), 5 deletions(-) create mode 100644 2022/inputs/02.txt create mode 100644 2022/src/samples/02.txt diff --git a/2022/benches/days.rs b/2022/benches/days.rs index 228c813..9918a20 100644 --- a/2022/benches/days.rs +++ b/2022/benches/days.rs @@ -8,7 +8,7 @@ use criterion::BenchmarkId; use criterion::Criterion; /// Number of days we have an implementation to benchmark -const DAYS_IMPLEMENTED: u8 = 1; +const DAYS_IMPLEMENTED: u8 = 2; fn read_input(day: u8) -> Vec { let input_path = format!("inputs/{:02}.txt", day); diff --git a/2022/inputs/02.txt b/2022/inputs/02.txt new file mode 100644 index 0000000..60a9320 --- /dev/null +++ b/2022/inputs/02.txt @@ -0,0 +1,2500 @@ +A Y +C Y +C X +A Y +C X +C Y +B Z +A Y +A Y +C Z +A Y +A Y +A Y +C Y +A Y +A Y +A Y +A X +B X +A X +A Y +C Y +C X +A Y +A Y +C Y +A X +A Y +B Z +A Y +C X +A Y +A Y +C Z +C Y +C X +A Y +A Z +A Y +A Y +A Y +A Y +C Y +C Y +B Z +B Z +C Y +B X +A Y +A Y +A Y +C Z +A Y +C X +A Z +C Y +A Y +A Y +A Y +A Y +A Y +C X +A Y +C Y +A Y +C Y +A Y +A X +C Y +A X +A Y +C Y +C Y +A Y +C X +A Y +A Y +A Y +C X +A Y +A Y +A Y +C X +A Y +C X +A Y +A Y +C Z +A Y +A Y +A Y +C X +A Y +A X +C Y +A X +B Z +C Y +A Y +A Y +B Z +C Y +A Y +A Z +C Z +C Y +B Z +A Y +A Y +C Y +A Y +C X +A Y +A Y +C X +C X +C Y +A Y +A Y +C X +A Y +A Y +A Y +A Y +C X +C Y +A Y +A Y +A Y +C Z +A Y +C Y +A Y +C X +C Z +A Y +B X +A Y +C X +A Y +B X +A Y +C Z +A Y +A Y +A Y +A X +A Y +A Y +A Y +C Y +A Y +A Y +A Y +A Y +C Y +C X +A Y +A Y +A Y +A Y +C Y +A Y +A Y +A Y +C Y +B X +A Y +A Y +A Y +A Y +A Y +A X +C Y +A Y +C X +A X +B Y +A Y +C X +A Y +C Y +C Y +A Z +C Z +C X +B X +C Y +A Y +C Z +A Z +A Y +C X +A Y +A Y +C X +A Y +B X +C X +A Z +C Y +A Y +C X +A Y +A Y +A Y +B Z +C Z +A Y +A X +C X +A Y +A Y +C Y +A Y +A Y +A X +A X +C Y +C X +B X +A Y +A Y +A Y +A Y +B Y +A Y +C Y +A Y +A X +B Z +A X +C Z +C X +C X +C Y +C X +C X +A X +C X +A Y +C Y +A X +C X +B Z +C Z +A Y +C X +B Y +A Z +C Y +C X +A Y +A Y +A Y +C X +A Y +A Y +A Y +A X +B Y +C Y +C X +B Z +A Y +A Y +B Y +A Y +A Y +A Y +C X +A Y +A Y +A Y +A Y +A Y +A Y +A Y +A Y +A Y +C Y +C Y +C Z +A Y +C Y +A Y +A Y +A X +A X +A Y +A Y +C Y +A Y +A X +A Y +A Y +C X +A Y +C X +C X +C Y +B Y +A Y +C X +A Y +A Y +A X +A Y +A Y +A X +A Y +B Z +C Y +A Y +A Y +A Y +C Y +C Z +A Y +A Y +A Y +A Y +A Y +C Y +C Y +C Y +C Y +C Y +A X +C Y +A Y +A Y +A Y +A Y +C X +A Y +C Z +A Y +B Y +A X +A Y +A Y +A Y +C Y +C Y +A X +C Y +A Y +A Y +A Y +B Z +A X +A Y +A Y +A Z +C Y +A Y +C X +C Y +C Y +C Z +B Y +C X +C X +A Z +C Y +A Y +A Z +A X +A Z +C Y +C X +B Z +A X +C Y +A Y +C Y +B Z +A Y +A Y +C X +C X +C X +A Y +B X +C X +C Y +C X +A X +A X +B X +A Y +A Y +A Y +C X +A Y +C Y +C X +A Y +B Z +A Y +A Y +A Y +B X +A Y +A Y +A Y +C Y +A Y +C X +C Y +C Y +A Y +B Z +C Y +C X +C Y +C X +C X +C Y +A Y +A Z +A Y +A Y +A Y +A Y +C Z +A Y +A Y +C Y +A Y +A X +C Z +C Y +C X +C X +A Y +A Z +A Z +B Y +A X +C X +C X +A Y +A Y +A Y +C Z +C X +C X +C X +A Y +C Z +A Z +C X +C Y +A X +C X +C X +A Y +C Y +C Y +B X +B Z +A Y +A Y +A Y +B Z +C Y +A Y +B Z +A X +C Y +C Y +B X +C X +B Y +A Y +B X +C Z +A Y +A Z +C Z +C Z +A Y +A X +A Y +A X +C Y +A Y +A Y +A Y +C X +C X +C X +A Y +A Y +A Y +A Y +A Y +C Y +A Y +C Y +A Z +C X +C Y +A Y +A Y +B Y +C Y +A Y +C Z +C Z +A Y +B Y +A Y +A Y +A X +C Y +A Y +A Y +A Y +C Z +C Y +C X +A Y +A Y +B Z +C Y +C X +C Z +A Y +C Y +A Y +A Y +C X +C Y +C Y +A Y +C Y +C X +C Y +A Y +A Y +A Y +A Z +B Z +A Y +A Y +A X +C Z +C X +A Y +A Y +A Y +C X +C Y +B Z +C X +A Y +A Y +A Y +C Y +A Y +C X +C Z +C X +A Y +A X +A Y +C Z +C X +B Y +A Y +A X +A Y +B Y +A Y +A Y +C Y +C Z +C Y +C Y +C X +A Y +A Y +A X +A Y +A Y +A Z +A X +C Y +A Y +C Y +C Y +C Z +C Y +C Y +A Z +A Y +C Z +C Y +C Y +C Y +B X +C Y +A Y +C X +A Y +B X +C Z +C Z +C Y +A Y +C X +A Y +A Y +A Y +A Y +C Z +A Z +A X +C Y +C X +A Y +A Y +C X +C Y +C Z +C X +C Y +A X +A Y +A Y +B X +A Y +A X +C X +A Y +A Y +A Y +B Z +A Z +B Z +C X +B Z +A Y +C X +A Y +C X +A Y +A Y +C Y +A Y +A Y +B X +A Y +C Y +A Y +A Y +A Y +C Y +A Y +A Y +A Y +B Y +A Y +C Y +A Y +A Y +A Y +A Y +C Y +A X +B X +A Y +B Z +C X +A X +B X +C Y +A Y +B X +C Y +A Y +B X +A Y +C X +B X +A Y +A Y +A Y +A Y +C X +C X +A Y +B X +C Y +A Y +A Y +A Y +A Y +B X +A Y +B Z +C X +A Y +B Z +C X +C Z +C Z +B X +C Y +A Y +A Y +A Y +A Y +A Y +A Y +C Y +A Y +A Y +A X +A X +C X +A Y +C Z +C Y +A Y +C X +A Z +A Z +A Y +C Z +A Y +A Y +A Y +C Y +A X +C X +C Z +A Y +A Y +C X +B X +A Y +A Z +C Y +A Z +A Y +A Y +A Y +A Y +A Y +B X +A Y +C Y +C X +A Y +A Y +C Z +C Z +C Y +A Y +B Z +A Y +A Y +A Y +A Y +A Y +C X +A Z +A Y +C Y +A Z +C X +A Y +C X +A Y +A Y +C Z +C Y +A Y +A Z +C X +C X +A Y +B Z +A Y +B X +C Y +C X +C Z +A Y +A X +C X +C Z +C Y +C X +A Y +A Y +A Y +A Y +A Y +A Y +C Y +A Y +C Y +A Y +C Y +B Y +A Y +A Y +A Y +A Y +B Z +C Y +A Y +C Y +A X +C Y +A Y +B Y +C Y +C X +C X +A Y +A Y +A Y +C X +A X +A Y +A X +C Y +A Y +A Y +C Y +C Y +A Z +A Y +A Y +B X +A Z +B X +A Y +C Y +A X +C Y +C Z +B Z +A Y +A Y +C Y +A Y +C Z +A Y +A X +A Y +C Y +A Y +A Y +A Y +A Y +A Y +A Y +A Y +A Y +C X +C Y +A Y +A Z +A Y +C X +A Y +C Z +A Y +C X +A X +A Y +C Y +A Y +C X +A X +A Y +A Y +A Y +C Y +A Y +C Y +A Y +B Y +C Y +C Y +A Y +A Y +A Y +A Y +C Z +A Y +C Z +A Y +C Y +B X +A X +C Y +C Z +A X +A Z +A Y +A X +C Z +C Y +A Z +C Y +A X +A Y +A Y +A X +C Z +A X +A Z +C Y +A Y +C Y +A Z +B Z +A Y +C X +C X +A Y +A Y +A X +A Y +A Y +A Y +C X +A Y +B X +A Y +C X +A Y +C Y +A Y +C Y +C Z +C Y +C Z +A Z +A Y +C Y +C Z +C Z +A Y +A Y +C Y +A X +A Y +C Y +A Y +A Y +A Y +A X +A Y +B Z +C Y +C X +A Y +C X +B X +C Y +C Y +A Y +C Y +C Y +A X +A Y +A X +A Y +A Z +C Z +B X +A Y +C X +A Y +C Z +A Y +C Y +A Z +A Y +A Y +A Y +C Y +C Y +A Y +A Y +C Y +A Y +C Y +C Y +A X +A Y +C X +C Z +A Y +A Y +A Y +C X +C X +C Y +C Y +C Z +A X +A Y +C Y +C Z +A Y +B Y +A Y +C Z +C Z +A Y +A Y +A Y +B Z +A Y +A Z +A X +C X +C X +C Z +A Y +C Z +A Z +C Y +C Z +C X +C Y +C X +A Y +C Y +A Z +A Y +A Y +A Y +A Y +C Y +A X +C X +A Y +A Y +C Z +B Z +A Y +A Y +C X +A Y +C Y +C Y +B Z +A Y +C Y +A Y +C X +C X +A Y +C Y +A X +C X +A Y +C Z +A Y +C X +A Y +C X +A Y +C Y +A Y +C Z +A Y +C Z +A Y +A Y +A Y +C Y +A Y +A X +A Z +A Y +C Y +C Y +A Y +A Y +B Z +A X +A X +C X +C X +C Z +C Z +A Y +A Y +A Y +A X +A X +A Y +A Z +C Y +C Y +C X +A Y +C X +B X +A X +A Z +A Y +B X +A Y +B Z +B Z +A Y +B X +C Y +A Y +A Y +C Y +C Y +A Y +A Y +A Z +A Y +C Z +B X +A Y +C Y +C Y +A Y +B X +C X +C Y +A X +C X +A Y +A X +A Y +A Y +B Z +A X +C Y +A Y +A Z +B Y +A Y +B X +A Z +C Y +C Z +C Z +C Z +C Y +A Y +C Y +C Y +B Y +A Y +C Z +B Y +A Y +A Y +A Y +A X +B Z +A Y +C Z +A Y +A X +C Z +C X +A Y +A Y +A Y +B Z +B Z +A Y +C Z +A Y +A Y +A Y +C Y +C Z +C X +A Y +B Z +C Y +B Z +C X +C X +A Y +A X +A X +B Z +C Y +C Y +C X +A Y +C X +C X +A Y +C X +C Z +A X +C Y +C Y +C Y +A Y +A X +C Y +A Y +A Y +C Y +C X +C Y +B X +C X +A Z +A X +A Y +C Y +A Y +A X +C Y +A Y +A X +C X +A X +C X +C Y +C Y +A Y +C X +A Y +A X +C Y +A Y +C Z +A Z +A Y +A Y +A Y +A Z +A Y +B X +B Z +C X +A Z +C X +A Y +A Z +A X +C Y +C Y +B Z +A Z +A Y +A Y +A Y +B X +C Y +A Y +A X +A Y +B Z +B Z +A Y +A Y +A Y +C X +C X +C X +C Y +A Y +C Y +C Y +A Y +A Y +A Y +A Y +C Y +A Y +C X +A Y +C X +C Y +C Y +C Z +B X +A Y +C Y +A Y +C Y +A Y +A Y +A Y +A Y +B Z +C Z +C Y +A X +C Y +A Y +C Y +C Y +A Y +B Z +C Y +B X +B X +A Y +A Y +C Y +C Y +B X +A X +C Y +C X +C Y +A Y +A Y +C X +A X +A Z +A Y +A Z +A Y +B X +A X +C X +A X +C X +C Z +A Y +C X +C Y +C X +C Y +A Y +C Y +A Y +A Y +C Y +C Z +C X +A Y +A Y +A X +C Y +B Z +A Y +C Y +B Z +C Y +A Y +C Y +A X +A X +A Y +B X +A Y +C X +C Y +A Y +A Y +A Y +C X +C Z +A Y +C Y +A Z +C Y +A Y +C Y +A Y +C Z +C Y +C X +A Y +C X +A Z +B Z +A Y +A X +A Y +A Y +A X +A Y +A Y +A Y +A Y +C Y +C X +A Y +A Y +A Y +A Y +A Y +C Y +C Y +C Y +A X +A Z +A Y +C X +A Y +A Y +C Y +B Y +C Y +A X +A Y +A Y +A Y +C X +A X +C Y +C Z +A Y +B Z +A Z +C Y +A Y +A Y +B Z +A X +A Y +C Y +A Y +A X +B X +C Z +B X +A Y +A Y +C Y +A Y +A Z +A Y +A Y +A Y +C X +A Y +A Z +A Z +A Y +C X +A Y +C Z +C Y +B X +C Y +A Y +C Z +B Z +A Y +C Y +A Z +A Y +C X +C Y +A X +A Y +C Z +A Y +A Y +A Y +A Y +B Z +A Z +C Z +A X +A Y +A Y +A Y +A Y +A Y +C Y +C Y +A Y +C X +A Y +A Y +A X +A X +A Y +C Y +C Z +A Z +A Y +A X +B X +B X +B Z +C X +C Y +A Y +A Y +A Y +C Z +A Y +A Y +A Y +C Y +C Y +B Y +C Z +B Z +C Y +B Z +A Y +A X +C X +A X +C X +B Y +A Y +A Z +A Y +A X +A Y +A Y +C X +A Y +A Y +C X +C X +A Y +C X +C Z +C X +B Z +B Z +B Z +C Y +B Z +C Y +C Z +B Y +A Y +C Z +A Y +C X +C X +B Z +B Y +A Y +A Z +C Y +C X +C Y +A Z +C X +C X +C X +A Y +A Y +C Y +A Y +C Y +C Y +A Y +C Y +C Z +A Y +B Y +C Y +C X +A Y +A Y +A X +A Y +C Y +B Z +A Y +A Y +A Y +A Y +C X +B X +A Y +A Y +A Y +A Y +B X +A Y +A Y +A X +C Y +A Y +A Y +C X +A Y +A Y +A Y +C X +B Y +A Z +C Y +C X +A Y +A Z +B X +A Y +A Y +A X +C Y +C Y +C Y +A Y +C Z +A Y +A Y +C Y +B Z +A Y +A Y +C X +A X +A Y +A Y +A Y +B Z +C Y +A Y +C Y +C Y +A Y +A Y +C Y +C Y +A Y +C Y +A Y +B X +C Y +A X +A Z +A Y +A Y +C Y +C Y +A Y +C Z +A Z +A Y +A Y +C Y +C Y +C X +C Y +A Y +C X +C Y +A Y +C X +C Y +C Y +A Y +A Y +A Y +C X +C Y +A Y +A Y +C Y +A Y +C Y +A Y +A Y +C Y +C Y +C Y +A Z +A Y +C Y +C Y +A Y +A X +C X +A Y +C Y +B X +C Y +A Y +A Y +C Y +C Y +A Y +A Y +A Y +B Z +A Y +C Y +A Y +A Y +C X +C Y +A Y +A Y +C Y +C Y +C Y +C Z +A Y +A Y +C X +A Y +C Z +A X +C X +B X +A Y +C Y +A Y +A Y +A X +A Y +A Z +B Y +A X +A Y +C Y +C Y +C X +A Y +C Y +A Y +C Y +A Y +C X +C X +A Y +C Y +C Z +C X +B X +A Y +B X +A Y +A Y +C Y +A Y +C Y +A Y +A Y +A Y +A Y +A X +A Z +A Y +B X +A Y +A Y +C X +A Y +C Z +A Y +A Y +C Y +C X +C X +A Y +A Y +B X +C X +A Y +C Y +A Y +C Y +A Y +B Z +A Y +C Y +A Y +A Y +A Y +C Z +A Y +A X +C X +A X +A Y +A Y +A Y +C X +C Y +C Y +C Y +A Y +A Y +A Z +C X +A Y +A Y +A Y +C Y +C Y +A X +A Y +C Y +B Y +A Y +A Z +C X +A Y +A Z +A X +A Y +A Y +A Y +C Y +A Y +A Y +A X +C Y +A X +B X +C X +C Y +A Y +A Y +A Y +C Y +A Y +A Y +A Y +A X +C X +A Y +A Y +A Y +C Y +A Y +B Y +C Y +C Y +C Y +C Y +A Y +A Y +C Y +C Y +A Y +C Y +C Y +A Y +C Y +C X +C X +C Y +A X +C X +C X +A Z +C Y +C Z +A Y +B Z +A Y +A Y +B X +C Y +A Y +C Z +A Y +C Z +A Y +A Y +A X +C Y +C X +C X +C Y +C X +A Y +A Y +C X +A Y +A Z +B X +C X +C Y +B X +B Z +A Y +A Y +A Y +C Y +A X +C Y +C Y +C X +A Y +C X +A Y +A X +C X +A Y +A Y +A X +C Y +B Y +A Y +A X +A Y +C Y +A X +C Y +A Z +A Y +A Y +C Z +A Z +C Y +A Y +C Y +A Y +A Z +C Y +C Y +B Z +B Y +C X +C X +B Z +A Y +A Y +A Y +A Y +A Y +A Y +C X +A Y +C Y +A Y +B Y +A Y +A Y +B X +A X +C X +C Y +A Y +C Y +A Y +A Y +A Y +A Y +C X +B Z +A Z +C Y +B Y +C X +A Y +A X +A Y +A Y +C Y +C Y +A Y +A Y +C Y +B Z +C Y +A X +C Y +A Z +A Y +A Y +A Y +B X +A Y +C Y +C X +B Y +C Y +A Y +B Y +A Y +A Y +C X +C Y +C Y +A Y +A Y +C X +C X +C Y +A Y +C X +C X +B X +C Y +A Y +C Y +B Z +A Y +B X +C Y +C X +A X +A Y +C Y +A Y +A Y +A Y +C X +A Y +C X +C X +A Y +C Y +A Y +B Z +C X +C Y +C Y +B X +A Y +C Y +A X +A X +B Z +C X +A Y +C Y +A Y +A X +C Y +A Y +A Y +A X +A X +A Z +C Z +B Y +C Y +C X +A Y +A Y +C Y +A Y +C Z +C X +C X +C Z +C Y +C X +C X +A Y +C Z +B X +C Z +A Y +A Y +C Y +C X +C Z +C X +C X +C Y +C X +C Y +A Y +A X +A Y +C X +A Y +A Y +A Y +A Y +A Z +C X +A X +B X +A Y +A Y +C Z +C Y +A Y +A Y +C Y +C Y +C Y +A Y +A Y +A Y +B X +A Y +B Z +A Z +A X +A X +C Y +A Y +C Z +A Y +A Y +C Y +A Y +A X +C Y +C Y +A X +A Y +C Y +A Y +C X +A Y +C X +A X +A Y +A Y +A Y +B X +C Z +A Z +B Y +A Y +B Z +B Z +A Y +C Z +B Z +A Y +A Y +A Y +C Y +B X +A Y +C X +A Y +C Z +C X +B Y +C X +C X +B X +C Y +B Z +A X +A Y +B Y +C Z +A Y +A Z +A Y +C X +A Y +A Y +C Y +C X +B Y +B X +C Y +B X +C Y +A X +A Z +A X +C X +B Z +C Y +C X +A Y +A Y +A X +B X +C X +A Y +B Y +C Z +A Y +C Y +A Y +A Y +A Y +B X +A Y +C X +A Y +A Y +A Y +A X +C X +A X +C Z +C Y +A Y +A Y +C Y +A X +C Z +A Y +A Y +A Y +B Y +C Y +C Y +C Z +C Z +C Z +A Y +C Y +A Y +A Y +A Y +A Y +A Y +B Y +C Y +C Y +A X +C Z +C Y +A Y +A Y +A Y +C X +A Z +A Y +A Y +A X +A Z +C X +B Y +A Y +A Y +C Y +B X +A Y +A Y +C Y +C Y +C Z +A X +C Y +C X +C X +C Z +A X +B Z +C X +C X +C Y +C X +C Z +C X +C X +B Z +B Z +A Y +B Z +A Y +A Y +A Y +B X +C X +A Y +C Z +A Z +A X +A Y +B Y +B X +B Z +A Y +A X +A X +A Y +C X +B X +A Y +C Y +A Y +A Y +C X +C Y +C X +C Z +B X +C X +C Z +A Z +A X +A Y +A Y +A Y +C Z +A Y +C Y +C X +A Y +A Y +C X +C X +A Y +C Y +C Z +C Y +C X +B Y +C Y +C X +A Y +B X +C X +A Y +A Y +C Y +C Z +A Y +A Z +B Y +A Y +B X +C Y +C Z +B X +B X +C X +A Y +B Z +A Y +A Y +A Y +A Y +C X +A Y +A Y +C Z +C X +B Y +C Y +C Y +A Y +C X +B Z +A Z +C Y +A Y +B Y +B X +B Y +A Z +C Y +C Z +A Y +C Z +C X +A Y +A Z +C Z +A Y +A Y +A Y +C X +A Y +C Y +B Z +A Y +C X +A X +A Y +C Y +C Z +C Y +A Y +C Z +A Z +A Y +C Y +A Y +C X +A Y +A Y +B Z +A Y +A Y +A Y +C Y +C Y +C Y +C X +C Y +C X +B Z +A Y +A Y +A Z +A Z +A Y +A Z +A Y +A Y +A X +C Z +A Y +A Y +A Y +C X +C Y +C X +A Y +A Y +A Y +C Y +C X +B Y +A Y +C Y +C Y +A Z +C Z +A Y +A X +A Y +A Y +B X +A Y +C Y +A X +C Y +A Y +A Y +A X +C Y +A X +B X +C Y +A Y +A Y +A Y +A Y +C Z +C Y +C X +A X +A Y +C X +C Y +A X +A X +B Y +B Z +A Y +C Z +A X +C Y +A X +A Y +C Y +C X +C Y +C X +A Y +A X +A Y +A X +C Z +A X +A Y +C Y +C X +C Y +C X +A Y +C Y +C X +A Y +A Y +C Y +C Y +A Y +A Z +C Y +A Z +A Y +C Y +A Y +A Y +C Y +A Y +B X +C X +C Y +C X +A Y +B Y +C Z +A Y +C X +A Y diff --git a/2022/src/day02.rs b/2022/src/day02.rs index 745aff3..cc152c7 100644 --- a/2022/src/day02.rs +++ b/2022/src/day02.rs @@ -1,9 +1,125 @@ use anyhow::Result; +use nom::character::complete::newline; +use nom::combinator::map_res; +use nom::multi::many0; +use nom::sequence::separated_pair; +use nom::sequence::terminated; +use nom::IResult; -pub fn part1(_input: &[u8]) -> Result { - todo!() +use crate::common::parse_input; + +#[derive(Copy, Clone, Eq, PartialEq)] +enum Rps { + Rock, + Paper, + Scissors, } -pub fn part2(_input: &[u8]) -> Result { - todo!() +impl Rps { + /// Score we get by playing this move + fn score(self) -> u32 { + match self { + Rps::Rock => 1, + Rps::Paper => 2, + Rps::Scissors => 3, + } + } + + /// Score we get from the result from playing given other + fn score_against(self, other: Self) -> u32 { + match (self, other) { + (a, b) if a == b => 3, + (Rps::Rock, Rps::Paper) | (Rps::Paper, Rps::Scissors) | (Rps::Scissors, Rps::Rock) => 0, + _ => 6, + } + } + + /// Score if the result is according to the instruction + fn score_result(self) -> u32 { + match self { + Rps::Rock => 0, // Rock is lose + Rps::Paper => 3, // Paper is draw + Rps::Scissors => 6, // Scissors is win + } + } + + /// Move we need to achieve the result indicated by self + fn needed(self, other: Self) -> Self { + match (self, other) { + (Rps::Paper, other) => other, + (Rps::Rock, Rps::Rock) => Rps::Scissors, + (Rps::Rock, Rps::Paper) => Rps::Rock, + (Rps::Rock, Rps::Scissors) => Rps::Paper, + (Rps::Scissors, Rps::Rock) => Rps::Paper, + (Rps::Scissors, Rps::Paper) => Rps::Scissors, + (Rps::Scissors, Rps::Scissors) => Rps::Rock, + } + } +} + +impl TryFrom for Rps { + type Error = anyhow::Error; + + fn try_from(value: u8) -> Result { + match value { + b'A' | b'X' => Ok(Rps::Rock), + b'B' | b'Y' => Ok(Rps::Paper), + b'C' | b'Z' => Ok(Rps::Scissors), + _ => Err(anyhow::anyhow!("Invalid RPS: {value}")), + } + } +} + +fn parse_plan(input: &[u8]) -> IResult<&[u8], Vec<(Rps, Rps)>> { + fn parse_rps(input: &[u8]) -> IResult<&[u8], Rps> { + // Note: alpha1 also sort of works but is significantly slower + map_res(nom::bytes::complete::take(1usize), |v: &[u8]| { + Rps::try_from(v[0]) + })(input) + } + + fn parse_line(input: &[u8]) -> IResult<&[u8], (Rps, Rps)> { + separated_pair(parse_rps, nom::character::complete::char(' '), parse_rps)(input) + } + + many0(terminated(parse_line, newline))(input) +} + +pub fn part1(input: &[u8]) -> Result { + let plan = parse_input(input, parse_plan)?; + + let result: u32 = plan + .into_iter() + .map(|(them, us)| us.score() + us.score_against(them)) + .sum(); + + Ok(result.to_string()) +} + +pub fn part2(input: &[u8]) -> Result { + let plan = parse_input(input, parse_plan)?; + + let result: u32 = plan + .into_iter() + .map(|(them, us)| us.score_result() + us.needed(them).score()) + .sum(); + + Ok(result.to_string()) +} + +#[cfg(test)] +mod tests { + use super::*; + + const SAMPLE: &[u8] = include_bytes!("samples/02.txt"); + + #[test] + fn sample_part1() { + assert_eq!(part1(SAMPLE).unwrap(), "15") + } + + #[test] + fn sample_part2() { + assert_eq!(part2(SAMPLE).unwrap(), "12") + } } diff --git a/2022/src/samples/02.txt b/2022/src/samples/02.txt new file mode 100644 index 0000000..db60e36 --- /dev/null +++ b/2022/src/samples/02.txt @@ -0,0 +1,3 @@ +A Y +B X +C Z