diff --git a/src/input.txt b/src/input.txt new file mode 100644 index 0000000..3ac077e --- /dev/null +++ b/src/input.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 \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index e7a11a9..df0d807 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,126 @@ -fn main() { - println!("Hello, world!"); +// https://adventofcode.com/2022/day/2 + +const DATA: &'static str = include_str!("input.txt"); + +use std::str::FromStr; + +#[derive(PartialEq, Eq)] +enum Move +{ + Rock, + Paper, + Scissors +} + +#[derive(PartialEq, Eq)] +#[repr(i32)] +enum Outcome +{ + Loss = 0, + Draw = 3, + Win = 6 +} + +impl Outcome +{ + pub fn as_score(&self) -> i32 + { + match self { + Self::Loss => 0, + Self::Draw => 3, + Self::Win => 6, + } + } +} + +impl Move +{ + pub fn as_score(&self) -> i32 + { + match self { + Self::Rock => 1, + Self::Paper => 2, + Self::Scissors => 3 + } + } + + pub fn did_win(&self, other: &Move) -> Outcome + { + if self == other { Outcome::Draw } + else { + match self { + Self::Rock => { + if *other == Move::Paper { Outcome::Loss } + else { Outcome::Win } + } + + Self::Paper => { + if *other == Move::Scissors { Outcome::Loss } + else { Outcome::Win } + } + + Self::Scissors => { + if *other == Move::Rock { Outcome::Loss } + else { Outcome::Win } + } + } + } + } +} + +#[derive(Debug)] +enum MoveParseFailure +{ + InvalidMove, +} + +impl FromStr for Move { + type Err = MoveParseFailure; + fn from_str(s: &str) -> Result { + match s { + "A" => Ok(Self::Rock), + "B" => Ok(Self::Paper), + "C" => Ok(Self::Scissors), + "X" => Ok(Self::Rock), + "Y" => Ok(Self::Paper), + "Z" => Ok(Self::Scissors), + _ => Err(MoveParseFailure::InvalidMove) + } + } +} + +fn score_for_round(my_move: &Move, other_move: &Move) -> i32 +{ + let mut score = my_move.as_score(); + + let outcome = my_move.did_win(other_move); + + score += outcome.as_score(); + + score +} + +fn parse_round_and_get_score(round_str: &str) -> Option +{ + let mut moves = round_str.split(" "); + + let first_move = moves.nth(0)?; // Opponent's move goes first + let second_move = moves.nth(0)?; // My move goes second + + Some(score_for_round(&second_move.parse().expect("Expected a valid move"), + &first_move.parse().expect("Expected a valid move"))) +} + +fn part1() +{ + let mut score = 0; + for slice in DATA.split("\n") + { + score += parse_round_and_get_score(slice).expect("Input data is not correctly structured"); + } + println!("Your total score is {}", score); +} + +fn main() { + part1(); }