From 76e71bc89d995078c914b63f909d7ee346caf5d9 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 2 Dec 2022 00:41:10 -0500 Subject: day 2 --- data/2022/2.txt | 2500 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/2022/2/mod.rs | 136 +++ src/2022/mod.rs | 4 + 3 files changed, 2640 insertions(+) create mode 100644 data/2022/2.txt create mode 100644 src/2022/2/mod.rs diff --git a/data/2022/2.txt b/data/2022/2.txt new file mode 100644 index 0000000..fb2c7eb --- /dev/null +++ b/data/2022/2.txt @@ -0,0 +1,2500 @@ +A Y +B Y +B Z +B Z +A Y +C Y +A Y +C Y +A Y +B X +B Y +B Z +A Y +A Y +C Y +C Y +A Y +C Y +B Y +A Y +A Y +C Y +C X +A Y +B Z +C Y +A Y +C Y +A Y +C Y +A Z +A Y +C Y +B Y +A Y +C Y +B X +B Z +C X +B Z +B X +C Y +B Z +A Y +C Y +B X +A Y +A Z +B Y +C Y +A X +C X +C Y +C Y +A Y +C X +A Y +C X +C Y +C Y +A Y +C Y +A Z +A Y +B Z +A Y +A Y +B X +A Y +B Y +A Y +B X +B Y +C Y +A Y +B X +A Y +C X +B Y +A Y +B Z +C Y +C Y +B Y +B Z +B Z +B Y +B Y +A Y +A Y +A Z +C Y +B X +A Y +B Y +A Y +B X +C Y +A Z +C Y +C Y +A Y +A Y +C Y +C Y +B X +A Y +A Y +B X +A Y +C Y +B Z +A Y +B Z +C Y +C X +C Y +B Z +C Y +A Y +A Y +B Y +C X +A X +B X +A Y +C Y +C Y +A Y +A Y +C Y +C Y +A Z +B X +C Y +B X +A Y +C Y +A Y +A Z +C Y +A Y +A Y +A Y +C Y +B X +C Y +A Y +A X +C Y +A Y +B X +C Y +A Y +A Y +B Y +A Y +A Y +C Y +B Y +B X +A Y +A Y +B X +A Y +C Y +A X +C Y +C Y +A Y +B Z +A Y +A Y +C Y +A Y +A Y +C Y +A Z +B Z +A Y +C Y +B X +B X +A Y +A Y +C Y +A Y +A Y +C Y +B Z +B Z +B Y +B Y +A Y +A Y +A Y +A Y +A Y +C X +A Y +A Y +A Y +B Z +C Y +A Y +B Z +A Y +A Y +A Y +B Z +A Z +C X +B X +B Z +B Y +B Y +C Y +C Y +B Y +A Y +C Y +A Y +A Y +C Y +B X +A Y +A X +A Y +A Y +B Z +C Z +A Y +B X +C Y +C Y +A Y +A Z +A Y +C Y +C Y +C Y +A Y +A Y +C Y +C Y +A Y +A Y +A X +A Y +C Y +B X +B Z +C Y +A Y +A X +A Y +C X +C Y +B Z +B Y +A Y +C X +C Y +C Y +C X +C Y +B X +A Y +A Y +A Y +A Z +C Y +A Y +C Y +A Y +B Y +C X +A Y +A Y +A Y +C Y +B Z +A Y +C X +B Y +A Y +B Z +A Y +C Y +C Y +A Y +B Z +C Y +A Z +C Y +A Y +B X +A Y +A Z +A Z +A Z +C Y +C Y +A Z +B Y +A Z +A Y +C X +C Y +A Y +A Y +B Y +A Y +A Y +A Y +B Y +C Y +A Y +C Y +A Y +C X +A Y +A Z +A Y +A Y +A Y +C Y +A Y +C Y +A Y +A Y +C X +A Y +C Y +B Z +C Y +A Y +B Y +A Z +C Y +B Y +A Y +A Y +A Y +A Y +A Y +B Z +B Z +B Z +A X +A Y +B Z +A Y +A Y +C Y +C Y +B Z +A Y +B X +C Y +A Y +A Y +B Y +C Y +B Z +A Y +A Y +A Y +B X +B Y +C Y +A Y +A Y +B X +A Y +B Z +C X +C X +A Y +C Z +C Y +C Y +A Z +B Z +C Y +A Y +A Y +C Y +C Y +C Y +A Y +A X +B Z +A Y +A Y +B Y +B Y +C Y +B Y +B Y +B Z +C Y +C Y +B Y +A Y +C Y +A Y +A Y +B Y +A Y +A X +A Y +B Y +A Y +B Y +C Y +A Y +B Z +A Y +B Y +A Y +A Y +C X +C Y +C X +A Z +C Z +B Y +B Y +C Y +B Y +A Y +A Y +B Y +C Y +C Y +C Y +A Y +B Z +B X +C Y +C Y +A Z +A Z +A Y +A Y +A Y +B Y +A Y +B Y +A Y +B Z +A Z +B Y +C Y +C Y +C Z +B Z +B Y +B X +A Y +B X +B X +B Y +C Y +B Z +A Y +C Y +A Y +C Z +B Y +A Y +A Y +C Y +B Y +C Y +B Y +B Y +A Y +A Y +A Z +C X +A Y +A Y +C Y +A Y +B Z +A Y +A Y +A Y +C Z +C Y +B Z +C Y +B Z +A Y +B Z +B Y +A Y +B Y +A Y +A Y +A Y +A Y +C Y +C Y +C Z +B Y +C Y +C Y +A Y +A Z +A Y +B Z +A Y +C Y +C Y +A Y +A Y +A Y +B Z +A Z +A Y +A Y +A Y +A Y +A Y +B Z +B Z +A Y +A Y +B Z +A Z +A Z +A Y +B Y +B Y +B Z +A Y +B Z +C Y +B Z +B Y +A Y +A Y +C Y +C Y +C Y +A Y +A Y +C Y +C X +C Y +A Y +B Z +A Y +B X +B Y +B Y +B X +A Y +A Z +C Y +B Z +C Y +A Z +A Y +A Y +A Y +C Y +C X +A Y +C Y +A Y +B Z +C Y +A Y +B Z +A Y +C Y +A Y +C Y +B Y +C Y +B X +A Y +A Z +C Y +A Y +C X +C Y +A Y +C Y +A Y +C Y +A Z +B Y +A Y +B Z +C Y +C Z +A Y +A Y +A Z +A Y +A Y +C Y +B Y +C Z +A Y +B Y +C X +B Z +C Y +C Y +B Z +B Z +A Y +B Y +C Y +B Y +C Y +B Y +A Z +C Y +B Z +A Y +A Y +C Y +A Y +B Z +A Y +A Y +C Y +C Y +A Z +A Y +A X +C Y +B Y +B Y +B Z +B Y +B Y +C Y +A Y +C Y +A Y +A Y +B X +C Y +B X +A Y +A Y +B Y +B Z +C Y +A Y +C Y +A Y +A Y +C Y +B Y +C Y +B Y +B X +C Y +A Y +A Y +B Z +B Y +B Y +A Y +A Y +A Y +A Y +A Y +C Y +A Y +A Y +C Y +A Y +B Y +C Y +A Y +A Y +A Y +C Y +A Y +B Y +B Y +A Z +A Y +C Y +B Y +C Y +A Z +B Z +A X +B Y +B Z +A Y +A Y +C Y +B Y +A Y +B Z +A Z +C Y +C Y +A Y +B X +C Y +A Y +C Y +C Y +B Z +A Y +A Y +A Y +C Y +A Y +C Y +B Y +B Y +B Y +A Z +C X +B X +C Y +A Y +A Y +A Y +A Y +C Y +A Y +B Y +A Y +C Z +C Y +A Z +B Y +A Y +C Z +C X +B Y +C X +A Y +B Z +A X +B Y +B Y +B X +C X +A Z +C Y +B Y +C Y +A Z +C Y +C Y +C Y +A Y +A Y +A Y +C Y +A Y +A Y +C X +B Z +C Y +C Y +B Z +C Y +B Y +B Z +A Y +B X +A Y +C Y +A Y +A Y +A Y +A Y +B Z +C Y +C Y +B Z +B Y +C Y +C Z +C Y +C Y +B Y +A Y +A Y +A Y +A Z +C Y +A Y +A Y +C Y +A Y +A Y +B Y +A Y +A X +A Y +A Z +B Y +C Y +A Y +A Y +C Y +A Y +B Z +B Z +C Y +C Y +A Y +A Y +B Z +B Z +A Y +B Y +C Y +A Y +B Y +C Y +A Y +C Y +B X +A Y +A Y +A Y +A Y +A Y +B X +C Y +C Y +B Y +A Y +C Y +B Y +C Z +C Y +B X +C Y +A Y +C Y +C Y +C Y +C Y +B X +A Y +C Y +A X +A Y +C X +A X +C X +C Y +A X +C Y +C Z +C Y +A Y +A Y +A Z +C Y +C Y +B Z +A Y +C Y +A Y +A Y +B Z +C Z +A Y +A Y +C Y +A Y +A Y +B Y +A X +A Y +B Z +A X +C Y +B X +A Y +A Z +C Y +B Z +B Y +B Y +A X +A Z +B Z +C X +C Y +B X +B Z +C Y +C Y +C Y +A Y +C Y +B X +C Y +A Y +A Y +A X +C Z +B Z +C Z +C Y +B Y +C Y +A Y +A Y +C Y +C Y +B Y +C Y +C Y +C Y +A Y +B X +A Y +B Y +C Y +B X +C Y +C Y +B Y +A Y +B Y +B Y +C Y +A Y +B X +C X +C Y +B X +A Y +A Y +B Z +B Y +A Y +B Y +B Y +A Z +B X +B Z +C Y +B Y +C Y +A Y +A Y +B X +A Y +C X +B Y +B Z +B X +C X +C Y +C X +A Y +C Y +B Y +B Y +A Y +B X +C Y +C Y +B X +B X +C Y +B Z +B Y +A Y +C Y +B X +C Y +A Y +A Z +A Y +A Y +C Y +A Z +A Y +B Z +A Y +B Y +B X +B Z +B Y +C Y +A Y +A Y +C X +B Y +A Y +B Y +A Y +C Y +C Y +A Y +B Y +B Y +B Y +C Y +A Y +B Y +B X +B X +A Y +C Y +C Y +A Y +A Y +A Y +A Z +C Y +A Y +C Y +A Y +B Z +C Y +C X +C Y +A Y +C X +B Z +C X +A Y +B X +A Y +C Z +C X +A X +A Y +C Y +B X +A X +B Y +A Y +A Y +A Y +C X +A Z +B Z +C Y +A Y +C Y +C Y +C X +C Y +B Y +C Y +B Z +B Z +C Y +B Y +A Y +A Y +A Y +B Y +C Y +A Y +A Y +C Y +B Y +B Y +C Y +A X +A Y +A Y +A Z +A Y +B Y +C Y +A Y +A Y +A Y +C Y +A Y +B X +A Y +C Y +A Y +A Y +B Z +B Y +B Z +C Y +A Y +A Z +A Y +A Y +B Y +A Y +C Y +C Y +A Y +B Y +C X +B Z +A Y +C Y +B X +B Y +C Y +B Y +C Z +A Z +A Y +C Y +A Y +C Y +C X +A Y +C Y +B X +C Y +A Y +A Y +C Y +A Z +B X +B Z +A Y +B Z +B Y +A Z +B Y +A Y +C Y +A Y +C Y +C Y +A Y +B Y +C Y +A Y +A Y +B X +A Y +A Y +A Y +C Y +A Z +B Y +B X +A Y +B Y +C Y +A Y +C Y +A Z +B X +A Y +A Y +A Y +A Z +A Y +B Y +B Z +B Z +A Y +A Z +A Y +B X +A Y +A Y +A Y +C Y +A Y +A Y +A Z +C Y +A Y +A Y +B X +B Y +C Y +B X +C Y +A Y +B Y +A Y +C Y +C Y +C Y +C Y +A Y +C Y +C Y +B Y +A Y +C Y +A Y +A Y +B Y +A Y +B Y +C X +A Y +A Y +A Y +C Y +B Z +C Y +A X +A Y +A Z +A Y +B X +C X +A Y +B Y +A Y +A Y +B Y +A Y +C Y +A Y +A Y +B Z +C Y +A Y +A X +B Z +A Y +A Y +A Z +C Y +A Z +C Y +B Y +A Y +C X +B X +A Y +C X +C X +A Y +A Y +A X +A Y +A Y +A Y +B Y +C X +A Y +C Y +C Y +A Y +B Z +A Y +C Y +B Z +A Y +C Y +C Y +B X +B Y +B Z +A Y +C Z +C Y +A Y +C X +A Y +C X +B Z +A Y +B Y +A Y +C Y +B Y +A Y +B Y +B X +A Y +B Y +C Y +A Y +C Y +C Y +A X +C Y +C X +A X +A Y +C Y +C Y +C X +C X +C Y +C Y +C Y +A Z +A Y +B Z +C Y +C Y +A Z +A Y +A Y +C X +A Y +A Y +A Y +C Y +A Y +C Y +A Y +A Y +A Y +C Y +C Y +A Y +B Y +B Y +A Z +B X +B X +B Y +C Y +A Y +A X +A Y +B X +C Y +B X +C X +C Y +A Y +A Y +C Y +A Y +C Y +A Y +B Z +C Y +A Y +B Y +A Y +A Y +A Y +A Y +A Z +C Y +A Y +B Y +C Y +C Y +A Y +C X +A Y +A Y +C Y +C Y +C X +B Y +A Y +A Y +A Y +A Y +C Y +A Y +B X +A Z +A Y +C Y +B X +A Y +C Y +A Y +A Y +A Y +C Y +B Y +A Y +A Y +B Z +C Y +C X +A Y +A Y +C Y +A Y +C X +C Y +C Y +A Y +C Y +C Y +C Y +C X +A Y +A Y +A Y +A Y +C Y +B Y +C Y +A Y +A Z +B Z +A Y +B Y +B Z +C Y +A X +B Y +C Y +A Y +A Y +C Y +A Y +A Y +A Z +B Z +C X +B Y +B Y +C Y +C Y +C Y +A Y +A Y +A Y +A Y +C Z +B Y +B Z +C Y +C Y +A Y +B Y +C Y +A Y +A X +B X +C Y +A Y +C Y +C X +C Y +A Y +A Y +B Y +B X +A Y +C Y +A Z +B X +C Y +B X +A Y +B Z +A Y +A Y +B Y +B Z +B X +A Y +B X +B Z +A Y +C Y +A Y +A Y +A Z +B X +A Y +A Y +B Y +A Y +B Z +B X +C Y +C X +C X +C X +A X +A Y +A Y +A Y +B Y +A Y +A Y +A Y +C Y +B Y +B X +B Y +C Y +A Z +A Y +B Z +A Y +C Y +A Y +A Z +B Z +C Y +B Z +A Y +C Y +B Y +C Y +A Y +C Y +B Z +B Y +B X +C X +A Y +A X +B X +C Y +C Y +A Y +C Y +B Y +A Y +B Z +A Y +B X +A Y +C Y +A Y +C Y +C Y +A Y +A Y +A Y +C X +B Y +B Z +B Y +A Y +A Y +A Z +B X +A Y +A Z +C Y +B Z +B X +A Y +C Y +A Y +B Z +A Y +A Z +B Y +C X +A Y +C Y +C Y +C Y +C Y +A Y +A Y +B Y +A Y +C Y +A Y +B Z +C Y +A Z +C Y +A Y +A Z +C Y +B X +C Y +C Y +A Y +A Y +B Z +B Y +B X +A Y +A Y +B Y +A Y +A Y +B X +B Y +A Y +C Y +A Y +C Y +C Y +B Y +B Y +C Y +A Y +A Z +A Y +A Y +A Y +C Y +C X +B Z +C Y +A Y +A Y +C Y +A Y +A Y +A Z +C X +C Y +A Y +A Y +C Y +C Y +A Y +A Y +C Y +C X +A Y +A Y +B Y +A Z +B Y +A Y +B Z +C Y +C Y +A Y +B Y +A Y +C Y +B Z +A Y +A Y +C X +C Y +C X +A Y +A Y +A Y +B Y +C X +A Y +B X +B Y +C Y +A Y +C Y +A Y +A Y +C Y +A Z +A Y +C X +A Y +A Y +C Y +C Y +C X +A Y +A Y +C Y +B Y +A Y +C Y +A Y +B Z +A Y +C Y +A Y +A Y +A Z +A Y +B Z +A Y +A Y +A Y +A Y +A Y +C Z +C X +A Y +A Z +C Y +C Y +B Z +A Y +B X +A Y +A Y +A Z +B Z +A Y +A Y +C Y +A Y +C Y +B Z +B X +C X +A Y +B Y +C Y +C X +B Y +C Y +A Y +A Y +A Y +A Z +B Y +A Y +C Y +A Y +A Y +A Y +A Y +C Y +C Y +A Y +A Z +C Y +B Y +C Y +C Y +B Y +A Y +C Y +B Z +A Y +A Y +B Z +C Y +B Z +C Y +C Y +B Z +B Y +A Y +C X +C Y +B Y +A Y +A Y +A Y +B Z +A Y +B Y +A Y +C Y +A Y +A Y +C Y +A Z +A Y +C Y +B Y +A Y +B Z +C Y +A Y +A Y +C Y +B Z +B Z +A Y +A Y +A Y +A Y +A Y +C Y +A Y +A Y +A Y +A Y +C Y +A Y +C Y +B X +B Y +A Y +C Z +B Y +C Y +C Y +A Y +C Y +C Y +A Y +A Y +A Y +A Y +B X +B Z +C Y +B X +B Y +B Y +B Z +B X +A Y +A Y +B Y +B X +A Y +A Y +C Y +C X +A Y +B Y +A Y +B Y +B Y +B Y +C Y +A Y +A X +A Y +C Y +B X +B Y +A Y +A X +C Y +C X +A Y +A Y +A Y +B Y +C X +A Z +B Z +A Y +B Z +A Y +A Y +A Y +A Y +B X +A Y +C Z +C Y +C Y +C Y +B Z +A Y +A Y +B Z +B Y +A Z +A Y +A Y +B Z +C Y +A Y +C Y +C Y +C Y +B X +B Y +A Y +A Y +A Y +A Y +B Y +A Y +B Z +B Z +A Y +C Y +C Y +C Y +A Y +C Y +B Y +C Y +A Y +B Y +B Y +B X +C X +A Y +A Y +A Y +B Y +C Y +B Y +C X +B Y +B Y +A Z +C Z +C X +B Y +C Y +B Y +C Y +B Z +A Y +C Y +A Y +B Y +C Y +A Y +A Y +C Z +B X +A Z +C Y +C Y +A Y +B Z +B Y +C X +A Y +B Z +A Y +A Y +A X +A Y +B Y +C Y +B Y +A Y +A Y +B Y +C Y +B Y +A Y +A Y +B Y +C Y +B Y +C Y +B Y +B Y +B X +A Y +A Y +C X +A Y +C Y +B Z +A Y +B Y +A Z +A Y +A Y +B Y +C Y +B Z +A Z +A Y +B Z +C Y +A Y +A Y +A Y +C X +C Y +A Y +C Y +A Y +A Y +B Z +A Y +A Z +C Y +C Y +A X +C X +A Y +B Z +A Y +A Y +B Y +A Y +A Y +B Z +A Y +B Y +B Z +A Y +A Z +A Y +A Z +C Y +B Y +A Y +A Y +B Z +C X +C Y +A Y +A Y +A Y +A Y +A Y +A Z +C Y +B X +A Z +B Y +A Y +A Z +A Y +C X +A Y +A Y +C Z +B Y +C Y +C Y +B Y +C X +A Y +A Y +B Y +A Y +A Y +A Y +B Y +B Y +C Y +A Y +A Y +B Y +B X +A Y +A Y +C Y +B Y +C Y +B Z +A Z +C X +B X +A Y +A Y +A Y +C Z +A Y +C Y +B Y +A Y +B X +A Y +C Y +A Y +B Y +A Y +B X +B Y +A Y +C Y +C Y +A Y +A Y +A Y +A Y +C Y +C Y +A Y +A Y +B Y +C Y +B Z +C Y +C Y +C Z +A Z +B X +C Y +A Y +B Y +B Y +A Y +B X +A Y +B Y +B X +C Y +B X +B Y +B Y +B Z +A Y +A Z +B Z +A X +C Y +B X +C X +A Y +B Z +A Y +A Y +A Z +C X +A Y +B Y +B Y +A Y +A Z +A Y +B X +B X +A Y +B Y +C Y +A Y +B X +B Z +B Z +B Z +C X +A Y +C Y +A Z +B Y +B Y +A Y +B Y +C Y +A Y +A Z +B X +C Y +C Y +A X +C Y +C Y +B Y +B X +C X +A Y +C X +C Y +A Y +B Y +A Y +A Y +B Z +C Y +B X +A X +C Y +B X +C Y +C Y +A Y +C Y +C Y +C X +A Y +A Y +B Y +C Y +C Y +A Y +C Y +A Z +A Y +A Y +B X +A Y +A Y +A Y +A Y +A Y +C Y +B Y +B Y +A Y +A Y +B Y +C Y +B Y +A Y +A Y +B Z +C X +A Y +C Y +B Y +B X +A X +A Y +B Y +B X +B Y +A Y +C Y +A Z +B Y +C Y +C Y +B Z +C Y +C Y +C Y +C Y +C Y +A Y +B Z +C Y +C Y +A Z +A Y +B Z +A Y +B X +C Y +C X +A Y +A Y +B Y +A Z +A Y +C Z +A Y +B Y +A Y +B X +A Y +B Z +C Y +A Y +A Z +A Y +B Y +A Y +B Z +A Y +A Y +A Y +A Y +C X +A Y +B Z +A Y +B Z +B X +A Y +B Y +C Y +B Z +B Z +C Y +B Z +A Z +A Z +B Z +A Y +C Y +C Y +A Y +C Y +B X +C Y +C Y +B Z +A Y +A Y +C Y +B Y +A Y +C Y +C Y +A Y +B Y +A Y +B Y +A Y +A Y +A Y +C Y +B X +B X +C Y +C Y +B X +A Y +C Y +A Y +B Z +A Z +A Y +C Y +A Y +C Y +A Y +C Y +C Y +C Y +A Z +A Y +C Y +B Y +A Y +A Y +C Y +C Y +A Y +B X +B Y +C Y +B Y +B Z +C Y +A Y +C Y +C Y +C Y +A X +A Y +C X +A Z +C Y +C Y +A Y +C Y +A Y +C Y +A Y +A Y +C Y +B Y +A Y +A Y +A Y +C Y +C Z +A Z +A Y +C Y +A Y +A Z +C Y +A Y +C Y +B Y +A Y +B Y +C Y +B Y +A Y +A Z +A Y +B X +C X +C Y +B Z +C Y +C Y +A Y +B X +B Z +A Y +B Z +B X +A Y +A Y +A Y +B X +C Y +C Y +C Y +C Y +B Z +A Y +B Y +B Z +A Y +A Z +A Y +A Y +A Y +B Z +C Y +A Y +A Y +B Y +C Y +C X +A Y +C Y +A Y +A Y +A Y +C Z +A Z +B Y +A Z +B X +B Y +A X +A Y +A Y +C Y +C Y +B X +A Z +C Y +B Y +C X +A Y +A Y +B Y +C Y +C Y +A Y +C X +A Y +A Y +A Y +A Y +C Y +C Y +A Y +C Y +A Z +A Y +C Y +A Y +B X +C Y +C Y +C Y +B X +B Y +A Y +A Y +A Y +C Y +A Y +A Y +B Y +A Y +A Y +C Y +C Y +A Y +C Y +C Y +C Y +C Y +C Y +B Z +C Z +C Y +B X +B Y +C Y +A Y +A Y +A Y +A Y +B Z +A Y +A Z +C X +A X +A Y +A Y +C X +C Y +B Y +A Y +C Z +B Y +B Y +C Z +C Z +A Y +A Y +A Y +C X +B Y +B Z +A Y +A Y +B Y +C X +B Y +A Y +C Y +B Y +A Y diff --git a/src/2022/2/mod.rs b/src/2022/2/mod.rs new file mode 100644 index 0000000..5f173ac --- /dev/null +++ b/src/2022/2/mod.rs @@ -0,0 +1,136 @@ +#![allow(dead_code)] +#![allow(unused_variables)] + +use crate::prelude::*; + +#[derive(Copy, Clone, Eq, PartialEq)] +enum Outcome { + Lose, + Draw, + Win, +} + +impl Outcome { + fn score(self) -> i64 { + match self { + Self::Lose => 0, + Self::Draw => 3, + Self::Win => 6, + } + } +} + +impl std::str::FromStr for Outcome { + type Err = (); + + fn from_str(s: &str) -> Result { + Ok(match s { + "X" => Self::Lose, + "Y" => Self::Draw, + "Z" => Self::Win, + _ => return Err(()), + }) + } +} + +#[derive(Copy, Clone)] +enum Shape { + Rock, + Paper, + Scissors, +} + +impl Shape { + fn score(self) -> i64 { + match self { + Self::Rock => 1, + Self::Paper => 2, + Self::Scissors => 3, + } + } + + fn outcome(self, other: Self) -> Outcome { + match self { + Self::Rock => match other { + Self::Rock => Outcome::Draw, + Self::Paper => Outcome::Lose, + Self::Scissors => Outcome::Win, + }, + Self::Paper => match other { + Self::Rock => Outcome::Win, + Self::Paper => Outcome::Draw, + Self::Scissors => Outcome::Lose, + }, + Self::Scissors => match other { + Self::Rock => Outcome::Lose, + Self::Paper => Outcome::Win, + Self::Scissors => Outcome::Draw, + }, + } + } + + fn shape_for(self, outcome: Outcome) -> Self { + if Self::Rock.outcome(self) == outcome { + return Self::Rock; + } + if Self::Paper.outcome(self) == outcome { + return Self::Paper; + } + if Self::Scissors.outcome(self) == outcome { + return Self::Scissors; + } + unreachable!() + } +} + +impl std::str::FromStr for Shape { + type Err = (); + + fn from_str(s: &str) -> Result { + Ok(match s { + "A" | "X" => Self::Rock, + "B" | "Y" => Self::Paper, + "C" | "Z" => Self::Scissors, + _ => return Err(()), + }) + } +} + +pub fn parse(fh: File) -> Result> { + Ok(parse::lines(fh)) +} + +pub fn part1(lines: impl Iterator) -> Result { + Ok(lines + .map(|line| { + let mut parts = line.split(' '); + let them: Shape = parts.next().unwrap().parse().unwrap(); + let me: Shape = parts.next().unwrap().parse().unwrap(); + me.score() + me.outcome(them).score() + }) + .sum()) +} + +pub fn part2(lines: impl Iterator) -> Result { + Ok(lines + .map(|line| { + let mut parts = line.split(' '); + let them: Shape = parts.next().unwrap().parse().unwrap(); + let outcome: Outcome = parts.next().unwrap().parse().unwrap(); + let me = them.shape_for(outcome); + me.score() + outcome.score() + }) + .sum()) +} + +#[test] +fn test() { + assert_eq!( + part1(parse(parse::data(2022, 2).unwrap()).unwrap()).unwrap(), + 13565 + ); + assert_eq!( + part2(parse(parse::data(2022, 2).unwrap()).unwrap()).unwrap(), + 12424 + ); +} diff --git a/src/2022/mod.rs b/src/2022/mod.rs index ea3dd92..6647253 100644 --- a/src/2022/mod.rs +++ b/src/2022/mod.rs @@ -2,6 +2,8 @@ use crate::prelude::*; #[path = "1/mod.rs"] mod day1; +#[path = "2/mod.rs"] +mod day2; // NEXT MOD pub fn run(day: u8, puzzle: u8) -> Result { @@ -9,6 +11,8 @@ pub fn run(day: u8, puzzle: u8) -> Result { match (day, puzzle) { (1, 1) => day1::part1(day1::parse(parse::data(2022, 1)?)?), (1, 2) => day1::part2(day1::parse(parse::data(2022, 1)?)?), + (2, 1) => day2::part1(day2::parse(parse::data(2022, 2)?)?), + (2, 2) => day2::part2(day2::parse(parse::data(2022, 2)?)?), // NEXT PART _ => Err(anyhow!("unknown puzzle {}-{}", day, puzzle)), } -- cgit v1.2.3-54-g00ecf