diff --git a/2022/Data/day2-input.txt b/2022/Data/day2-input.txt new file mode 100644 index 0000000..60a97a4 --- /dev/null +++ b/2022/Data/day2-input.txt @@ -0,0 +1,2500 @@ +B Z +B Z +B Y +C Y +B Y +C Y +C Y +A Z +B Y +A Y +C X +A Y +A Y +C Y +A Y +B Y +B Y +C Y +A Y +A Y +A Y +C Y +A Y +B Y +A Y +B Y +C Y +B X +A X +A Y +C X +B Y +C Y +B Y +B X +C X +B Y +B Y +A Y +A X +A X +A Y +B Y +C Y +C X +A X +B Y +C Z +B Y +C X +A Y +A X +C X +A Y +A Y +A Y +A Y +B X +C Y +C Z +B Y +C Y +A Y +A Y +B Y +A Y +C X +B Y +C Y +C Y +A Y +C X +B Y +A Y +B Y +C Y +C Y +A Y +B Y +C Y +C Y +C Y +A X +A X +B Y +B Y +C Z +C Y +B Y +B Y +B Y +C Y +A Y +C Y +A Y +A Y +A X +C Y +A X +A Y +A Y +B Y +B Y +C Y +C Y +A Y +A Y +A X +B Z +C Y +A Y +A X +C Y +B Y +C Y +A Y +A X +A X +A X +A Y +A X +B Y +A Y +C Y +A X +B Y +C Y +B Y +A X +B Y +B Y +C Z +C Y +C X +A Y +C X +B Y +B Y +C Y +A X +A X +C Z +B Z +C Y +C Y +A X +A X +B Y +B Z +C Y +B Y +B Y +B Y +A X +A X +B Y +C Y +A Y +C Y +C Y +A X +B Y +A Y +A X +C Y +C X +A Y +A Y +C Y +C X +C Y +B Y +A Y +A Y +C Y +B Y +C X +A Y +C X +A X +B Y +C X +A Y +A Y +A Y +C Y +C Y +A Y +A X +C Y +C Z +B X +C Z +B Z +A Z +A Y +B Y +A Y +B Y +B Y +A Y +A Y +C X +C Y +A Y +A Y +B Y +A Y +B Y +B Z +A Y +B Y +C Y +A Y +C Y +B X +A Y +A X +A Y +A X +A Y +C Y +A X +C Y +C Y +A X +B Y +A Y +B Y +A Y +A Z +C Y +B Z +C X +C Y +C X +B Y +C X +B Y +A Y +C Y +A Y +A X +C Y +A X +A X +C X +C X +C Y +C X +C Y +A X +B Z +A Y +B X +B Y +C Z +B Y +B Y +B Y +C X +B Y +A Y +B Y +A Y +C Y +C Y +B Z +B Y +A X +A Y +C Y +B Y +C Y +B Y +B Y +A X +B Y +B Z +C Y +A Y +A Y +A Y +A Y +A Y +A Y +C X +B Y +B Y +C Y +B Y +B Y +A Z +C Y +A Y +A Y +C Y +C X +A Y +B Y +A Y +C X +B Y +A Y +C Y +B Y +B Z +A Y +B Y +A Y +C Y +A Y +B Y +C Y +B Y +A X +C Z +C Y +A Y +C Y +B Y +C Z +A Y +A Y +C Y +C X +B Y +C Y +C X +B Y +C X +A Y +C X +C Y +B Y +B Y +A Y +B Y +A X +C X +C Y +B Y +A Y +A X +C Y +C Y +C Y +C X +B Z +B Y +C Y +A X +C Y +A X +C Y +B Y +B Y +B Y +B Y +C X +C Y +C Y +A Z +B Y +B Y +A Y +A Y +B X +A Y +B Y +B Y +B Z +C Y +A X +A X +A Y +B Z +B Y +C Y +B Y +B Y +B Y +B Y +A X +B Y +C Y +A Y +B Y +A X +C Y +C Y +B Y +B Y +C Y +B Y +A Y +A Y +A X +A Y +B X +B Y +C Y +C Y +A Y +A Y +B Y +B Y +A X +B Y +A X +C Y +C Y +C Y +B Y +A Y +B Y +A Y +A Y +A X +C Y +A Y +A Y +B Z +C Y +A X +C X +B Y +C X +C Y +C X +C X +C Z +A Y +A X +A Y +B Z +B Y +A X +A Y +A X +B Y +A Y +C X +B Y +B Y +A Y +A Y +C Y +A Y +A Z +C Y +C Y +C Z +A Y +C Y +C Y +C Y +C Y +A Y +B Y +B Y +C Y +A Y +C Y +C Y +A X +B X +B Y +A Y +B Y +A Y +C Y +A Y +C Y +B Y +B Y +B Y +A Y +C Y +C X +C X +C X +C X +C Y +C Y +C X +B Y +A Y +A X +B Y +C X +B X +C Y +B Y +C Y +C X +C Y +B Y +A Y +A Y +A Y +C Y +C Y +A X +A X +C X +A Y +A Y +B Y +B X +B Z +C Z +B Y +B Y +B Y +B Y +B Y +A Y +A Y +B Y +A Y +C Z +A Y +C X +A Y +A Y +C Y +C X +B Y +A Y +B Y +B Y +C Z +A Y +A Y +A X +C Y +C Z +B Y +A X +C Y +C X +B Y +C Z +A X +A X +A Y +C Y +A Z +B Y +B Y +B Y +B Y +C Y +B Y +C X +A Y +C Y +B Y +B Y +A Y +A X +A Y +C Y +C Y +A X +C Y +B Y +B Y +C Y +C Y +A Y +B Y +A Y +B Y +A Y +B Y +C X +A X +C X +B Y +B Y +B Y +C Y +B Y +C Y +B X +A Y +A Y +C Y +C X +C X +C Y +C X +A X +A Y +A Z +A Y +A Y +B Y +B Y +C X +C Y +A Y +B Z +A Y +A X +A Y +C Y +A Y +A X +C Y +B Y +B Y +C X +A X +A Z +C Y +B Y +A X +A Y +C Y +C Y +A X +C Y +B Y +A Y +A X +C Y +B Y +A Y +A Y +C X +B Y +B Y +B Y +C Z +C Y +C X +C X +B Y +A X +A Y +B X +A Y +C Y +B Y +B Y +B Y +C Y +C Z +A Y +C X +C Y +A Y +A Y +B Y +B X +B X +B Y +A Y +A Y +A Y +C Y +C Z +B X +C Y +A Z +A X +B Y +C Y +B Y +B X +A Y +A Y +C Y +B Y +A X +C X +B Y +C Y +B Y +B Y +A X +A Y +A X +C Y +A Y +C Y +B Y +A Y +C Y +A X +A Y +C Y +C X +C Y +A X +B Y +B Y +B Z +A Y +C Y +B Y +B Y +C Y +A X +C X +C Y +C Y +B Y +C Y +B Y +A Y +B Y +A Y +B Y +A Y +C Y +B Y +C X +B Y +C X +A Y +C Y +A X +C X +B Y +A Y +B Y +C X +B Y +C Y +C Z +A Y +C Z +C X +C X +A Y +A X +A Y +B Z +C Y +C Y +B Y +A X +A Y +B Y +C Y +A Y +A X +B Y +C Y +A Z +C Y +B Y +B Y +B Y +C Y +A Y +B Y +A Y +C X +A X +A Y +B Y +C Y +B X +C Y +A X +A Y +A Y +C Y +A Y +C Y +A Y +A X +B Y +C Y +B Y +C Y +B Y +B Y +A Y +A X +A Y +C Y +A X +C Y +B Y +B X +C Y +B Z +C Y +B X +B Y +C X +C Y +A X +C Y +C Y +A X +C Z +C X +B Y +A X +A X +C Y +B Y +A Y +A Y +B Y +B Y +A X +C Y +B Y +A X +A Y +B Y +C Y +A X +A X +A Y +A X +A X +A Y +A Y +A Y +A X +C Y +A X +A Y +A Y +A Y +B Y +C Y +C Y +B Y +A Y +B Y +B Z +B Y +B Y +C Y +B Y +C X +A Y +C Y +A Y +C Y +B Y +C X +B Y +B Y +C Z +C Y +B Z +B X +B Y +A Z +A Y +B Y +A Y +C Y +A X +B Y +C Y +A Z +A Y +C Y +C Y +B Y +C Y +C X +B Y +C Y +C X +B X +C X +A X +A X +A Y +C Y +B Y +C X +B X +A X +B Y +C Y +A Y +C X +C Y +B Y +C Y +B Y +A Y +B Y +A Y +A Y +A Y +A Y +B X +C X +A Y +B Y +A X +B Y +C Y +B Y +A X +A Y +C Y +A X +C Z +C Y +A X +B Y +A Y +B X +A Y +A Y +A Y +A Y +A Y +B Y +B X +A Y +B Y +C X +C Y +B Y +B Y +B Y +B Y +B X +A Y +A X +B Y +A X +A X +A Y +B Y +A Y +A Y +C Y +B X +B Y +B Y +A Y +A X +C Y +A Y +C Y +A X +B Y +B Y +A X +A X +A X +A Y +A X +C Y +C Z +B Y +B Y +A X +C Y +B X +A Y +B Y +A Y +B Z +B Y +B Y +A Z +B Y +A Y +B Y +B Y +C X +B Y +A X +B Y +B Y +C Y +B Y +A X +C Y +C Y +C X +C Y +B Y +B Z +A Y +B Y +C X +A Y +B Y +B Y +A X +B Y +A Z +B Y +A Y +C X +B Y +A Y +B X +A X +C X +C Y +B Y +A X +B Y +B Y +C Y +B Y +C Y +A Y +C X +C Y +A Y +C Y +A Y +C Z +A Y +B Y +A Y +C Z +A Y +C Y +A Y +C X +C Y +C Y +A Y +B Y +B Y +B Y +A Y +A Y +B Y +B Y +B Y +B Y +B Y +C Z +A X +A Y +B Y +B Y +A Y +B Y +B Z +B X +A Y +A Y +A Y +C X +B Y +A Y +C Y +A Y +A Z +B Y +B Y +A X +B Y +B Y +A Y +C X +A X +A Y +A Y +C Y +B X +A Y +C Y +C X +A Z +B Y +B Y +A X +A Y +C X +B Y +C Y +A Y +C Y +B Y +A Y +A Y +B Y +B Y +B X +C Y +A X +A Y +C X +A Y +C Y +A Y +C X +C Y +B Y +A Y +A Y +A Y +B Y +A Y +A X +B Y +B Y +B Y +A Y +B Y +B Y +B Y +C X +B Y +A Y +C X +B Y +B Y +A Y +C Y +B Y +A Y +B Y +C Y +B Y +B Y +C Y +C X +C X +C Y +B Y +B Y +A Y +A Y +A Z +B Y +C X +B Y +B Y +C Y +C Y +C Y +A Y +A X +A Y +A Y +C X +C X +B Y +C Z +C X +A Z +B Y +A Y +B Y +C X +A Y +B Z +C Y +A Y +B Y +C Y +C Y +C Y +A Y +B Y +C Y +A X +B Y +A Y +C Y +A Y +C X +B Z +B X +C Y +C Y +C Y +B Y +C X +A Y +A Y +B Y +C Y +A Y +A Y +B Y +B Y +A X +A Y +A Y +B Z +A X +A X +C Y +C Y +C X +B X +A Z +B Y +A X +A Y +B Y +A Y +B X +A Y +A Z +B Y +A X +B Y +A Y +A X +A Y +A Y +B Y +A Y +A X +A Y +C Y +B Y +B Y +A Y +A Y +A X +C Y +A Y +B Z +C Y +B Y +A Y +C Z +A Y +B Y +A Y +C Y +B Z +B Y +B Y +C Y +B Y +C Y +C Z +B Y +B Y +A X +B Y +C Y +A Y +B Y +A X +B Y +C Y +C Y +A Y +C X +C X +B Y +C Y +B Y +A Y +A X +B Z +B Y +C Y +A Y +C X +B Y +C Z +B Y +A Y +B Y +A X +A X +A Y +B Y +A Y +A X +C Y +C Y +C X +A X +A X +A Z +C Y +A Y +A X +A Y +A Y +B Y +B Y +C X +B Y +C Y +A Y +A Y +A Y +A X +C X +A Y +C X +A Y +B Y +A Y +B Y +A X +C Y +A X +B Y +A X +B X +A X +B X +C Y +B X +B Y +B Y +A X +A Z +C Z +B Y +C X +A Y +C Y +A Y +B Y +C X +B Y +C Y +C Y +B Y +A X +B X +C Z +C X +A X +C Y +B Y +A X +C Y +C Y +A Y +B Y +C Y +C Y +B Y +B Z +A Y +A X +C X +B Y +B Y +C X +A Y +A Y +B Y +A X +B Y +B Y +C X +A Y +B Y +B Z +C Y +A X +B Y +A Y +A Y +B Y +C Y +A Y +A Y +A Y +B Y +A Y +B Y +B Y +B X +A Z +B Z +A Z +A Y +B Y +C Y +B Y +B Y +B Y +B Y +A Y +A Y +B Y +B Y +A Y +C Y +A Y +C X +A Y +C X +B Y +B X +C Y +C X +B Y +B Y +B Y +B Y +C Y +A Z +A Y +B Z +C Y +A Y +A Y +B Y +C X +A X +A Y +C Y +A Y +C Y +A X +A X +C Y +B Z +A X +A Y +B Y +B Y +A Y +A Y +A Y +B Y +B X +A Y +C X +B Y +C X +C Y +C Z +C Y +A X +C Y +A Y +C Y +C X +A Y +A Z +A X +A X +A X +B Y +A Y +C Y +C Y +C X +A Y +B Y +A Y +A X +C X +A Y +B Y +A Y +C Y +C Y +C Y +C Y +C X +B Y +C X +B X +A X +C Y +B X +C Z +B Z +B Y +A Y +B Y +B X +C X +C X +B Y +C Y +C Y +A X +A X +C Y +A X +A Y +A Y +A Y +C Y +A Z +C X +C X +B Y +B Y +A Z +B Y +A Y +A Y +A Y +C Y +B Y +C Y +B Y +B Y +A Y +B Y +A Y +B Y +C Y +C X +A Y +A Y +C Y +A X +C Y +B Y +A Y +C X +C X +B Y +A Y +A Y +C Y +C Z +A X +C Z +B Y +B Y +B Y +C X +A Y +B Y +C Y +B Y +C Y +B Y +B Y +A Y +B Y +A Z +A Y +A X +A Y +A X +A Y +A X +A Y +A Y +C Y +A Y +A Y +B Z +A Y +A Y +C Y +B X +C Y +A Y +C X +C Y +A Y +C Y +B Y +A X +A Y +A X +A Y +B Y +C X +C Y +C X +C X +A Y +C Y +A Y +B Y +C X +C X +A Y +C Y +B X +C X +B Y +C X +A Y +C Y +A X +B X +C Y +C Y +C Y +B Y +A Y +A X +A Y +A Y +B Y +B Y +A Y +C Y +C Y +B Y +B Y +B Y +B Y +B Y +B Z +A Y +A X +C Y +B Y +C Y +C X +B Y +A Y +B Y +C Y +B Z +A X +B X +B Y +A X +B Z +A X +A X +B Y +B X +C X +A Y +A Y +B Y +B Z +A Y +B X +C Y +C Y +B Y +A Y +A Y +B Y +A Y +B Z +C Y +B Y +A X +C X +A Y +B Y +B Y +A Y +C X +C Y +C Z +B Y +B Y +A Y +C Y +A X +C X +A X +C X +C Y +B Y +A Z +A Y +A X +C Y +A X +C X +A Y +B Y +C Z +B Y +C Z +B Y +B Y +A Y +A Z +B Z +A Y +A Y +B Y +A Y +A Z +B Y +B Z +B Y +B Z +B Y +A Y +A Y +B Y +B Z +B Y +A Y +B Y +C X +B Y +C X +A Y +B Y +C Y +A Y +A Y +B Y +B Z +A Y +A Y +B Y +C X +C Y +C Y +A Y +B Y +A Y +A X +B Z +A Y +A X +A X +A Z +A Z +A Y +C Y +A Z +A Y +C Y +A Y +B Z +C X +C Y +C Y +B Y +C X +C X +A Y +C Y +B X +C Y +B Y +B Y +B Y +B X +C Y +C Y +A X +A Y +B Z +A Y +B Y +A Y +B Y +B Y +A Y +B Y +B Z +A X +C Y +A Y +A X +A Y +B Y +A Y +B Y +B Y +C Y +B Y +B Y +C Y +B Y +C X +C Y +A X +B X +C Y +B Y +C X +A Y +A Y +B Y +A Y +B Y +A Y +B Z +C Y +B Y +B Y +C Y +A Y +A X +B X +A Y +B Y +B Y +C Y +A Y +C Y +A Y +A Y +B X +C X +A Y +B Y +B Y +B Y +B Y +A Y +C Y +A X +B Y +A Y +C Y +A X +A Y +A Y +C Y +A Y +B Y +A X +A Y +B Y +A X +C X +C Y +A Y +A Y +B Y +C Y +C Y +A X +C Y +C Y +B Y +A Y +C X +B Y +A Y +A Y +A Y +A Y +B Y +A Y +B Z +A Y +B Z +A X +A Y +A Y +A X +C Y +A X +A X +C Y +A X +A X +A Y +C Y +A Y +B Y +A X +C Z +A Y +B X +A Y +B Y +C Y +A Y +B Y +A Y +C Y +B X +C Y +B Y +A Y +B Y +C Y +C Y +A Y +A Y +C X +A X +A Y +B Y +C Y +C Y +B Z +C Y +C Y +B Y +B Z +A Y +A Y +B Y +B Y +B Y +A X +B Y +C Y +B Y +A Y +C Y +C Y +C X +B Y +A Y +B Y +C Y +B Y +C Y +A Y +A Y +C Z +C X +B Y +A Y +A X +B Y +C Y +A Y +C Y +B Y +C Y +C X +A X +C Y +A Y +A X +A X +A X +C Y +C Y +A X +C Y +C Y +C Z +A X +C Y +C X +B Z +C Y +A Y +A X +C X +A Y +C Z +A Y +C X +B Y +A Y +C X +A X +B Y +B Y +A X +C Y +B Y +C X +C X +B Y +A Y +C X +C Z +C X +C X +A Y +C Y +C Y +C Y +A X +B Y +C Y +A X +C X +C Y +B X +B Y +C Y +A Y +A Y +B Y +B Y +B Y +B Y +B Y +B Y +A Y +A X +B Y +B Y +B Y +B Z +B X +C Y +A X +A Y +A Y +C Y +A Y +A X +C X +A Y +A Y +C X +A Y +B Y +A Y +B Y +C Y +C X +A X +C Y +C Y +B Z +A Y +C Z +A X +A X +B Y +A X +A Y +B Y +C Y +B Y +C Y +A Y +A X +C Y +C Y +C Y +A X +C Y +A Y +A Z +A X +C Z +C Y +C X +B Y +C Y +B Y +C Y +A Y +C X +B Y +C Y +C X +A Y +B Y +C X +C Y +C Y +A Y +A Y +B Y +A X +B Y +A Y +C Y +B X +C Y +B Y +B Y +B Y +B Y +A X +C Y +A X +A Y +A Y +B Z +C X +B Y +B Y +A X +C Y +A Y +A Y +B Y +A X +B Z +B Y +B Y +A Y +A X +A X +A Y +A Y +C X +C X +A X +B Y +C X +C Z +C Y +B Y +C Z +A Y +A Y +B Y +B Y +C X +A Z +A X +A Y +B Y +B Y +A Y +A X +A X +A Y +A Y +C Y +B Y +B Y +A X +A X +C Y +C X +C Z +A Y +A Y +A Y +C Y +C X +B Y +C Y +A X +B Y +C Y +A Y +A X +B Y +C Y +A Y +B Y +C X +A Y +A Y +B Y +B Y +C Y +A Y +A Y +A X +B Z +A X +A Y +C Y +C Y +A Y +A Y +C Y +C Y +B Y +A Y +A X +A Y +C X +C X +B Y +B Y +A Y +A X +C X +A Y +B Y +B Y +A Y +C Y +B Y +C X +C Y +A Y +A Y +C Y +B Y +B X +C Y +C Y +B Y +B X +A Y +B X +A X +B Y +C X +A X +B Y +A Y +A Y +A Y +C Y +B X +A Y +B Y +A Y +A X +C Z +B Y +A Y +B Y +B Y +A Y +A Y +B Y +C Y +A Y +C Y +B Y +C Y +A X +A Y +C Y +A Y +C Y +B Y +B Y +C Y +A Y +A Y +B Y +A Y +C Y +A Y +A Y +B Y +B Y +B Y +B Y +A X +A X +C Y +C Y +B X +C Z +C Y +A X +A Y +B Y +A Y +C Y +C X +B Y +B Z +C Y +A X +A Y +A X +B Y +B X +B Y +B X +C Y +A Z +B Y +C Y +A Y +A X +C Y +C X +B Y +A Y +A Y +A X +C X +A Y +C X +A Y +C Y +C X +A X +C Z +B Y +A X +B Y +A Y +A X +A X +A Y +A Y +A Y +C X +C X +A Y +A Y +B Y +C Y +C Y +B Y +C Y +A Y +C Y +A Y +B Y +B Y +A Y +B Y +C X +B X +A X +A X +B Y +B Y +B Y +C Z +C Y +B X +A X +B Y +A X +B Y +A Y +B Y +C Y +A Y +A Y +C Y +B Y +A Y +A Y +C Y +C Y +C Y +B Y +A Y +C Y +C Y +B X +B Y +B Y +A Y +B X +A Y +B Y +C Z +B Z +B Y +C Y +B Z +C Y +C Y +B Z +A Y +A Y +A Y +C Z +B Y +A Y +A Y +C Z +A Y +A Y +A Y +B Y +C X +A Y +A Y +A Y +A Y +A Z +C Y +A X +A Y +A Y +A Y +B Y +B Y +A X +B Y +A Y +A Z +A Y +A Y +A Y +A Y +A Y +C Y +B Y +C X +B Y +C Y +C X +B Y +A Y +B Y +A Y +B Y +B Y +A Y +A X +A Y +B Y +B Y +B Y +A X +C Y +A Y +B Y +B X +A Y +C X +B Y +A X +A Y +A Y +C Z +C Y +B Y +C Y +B Z +A X +B Y +C Y +B Y +A Y +A Y +C Y +A Y +C Y +A Y +C Y +A X +A X +A Y +B Y +B Y +B X +A X +A Y +A Y +A X +A Y +C Y +C Y +B Y +A X +C Y +A Y +C X +B Y +A Y +C Y +C X +A Y +C Y +B Y +B Y +A X +A Y +C Y +A X +A X +B Y +B Y +A Y +A X +A Y +B Y +A X +B Y +A X +A X +C Z +C Z +B Y +A X +B Y +A Y +B Y +B Z +A Y +A X +C Y +C Y +C Z +C Y +C Z +A X +A Y +C Y +C Y +C Y +A Y +B Y +A Y +A Y +B Y +C Y +B Z +A Y +C Y diff --git a/2022/aoc2022/src/day2.rs b/2022/aoc2022/src/day2.rs new file mode 100644 index 0000000..243ceed --- /dev/null +++ b/2022/aoc2022/src/day2.rs @@ -0,0 +1,177 @@ +use std::io::Result; + +use crate::file::line_reader_for_file; + +const SCORE_FOR_ROCK: i32 = 1; +const SCORE_FOR_PAPER: i32 = 2; +const SCORE_FOR_SCISSORS: i32 = 3; + +const SCORE_FOR_WIN: i32 = 6; +const SCORE_FOR_DRAW: i32 = 3; +const SCORE_FOR_LOSS: i32 = 0; + +#[derive(Clone, Copy, PartialEq, PartialOrd)] +enum Shape { Rock, Paper, Scissors } + +impl Shape { + fn part1_from_string(s: &str) -> Option { + if s == "A" || s == "X" { + Some(Shape::Rock) + } else if s == "B" || s == "Y" { + Some(Shape::Paper) + } else if s == "C" || s == "Z" { + Some(Shape::Scissors) + } else { + None + } + } + + fn part2_from_string(s: &str) -> Option { + if s == "A" { + Some(Shape::Rock) + } else if s == "B" { + Some(Shape::Paper) + } else if s == "C" { + Some(Shape::Scissors) + } else { + None + } + } + + fn part2_from_shape_and_outcome(shape: Shape, outcome: Outcome) -> Shape { + match outcome { + Outcome::Win => shape.shape_to_win(), + Outcome::Draw => shape.shape_to_draw(), + Outcome::Loss => shape.shape_to_lose(), + } + } + + fn shape_to_win(&self) -> Shape { + match self { + Shape::Rock => Shape::Paper, + Shape::Paper => Shape::Scissors, + Shape::Scissors => Shape::Rock, + } + } + + fn shape_to_draw(&self) -> Shape { + *self + } + + fn shape_to_lose(&self) -> Shape { + match self { + Shape::Rock => Shape::Scissors, + Shape::Paper => Shape::Rock, + Shape::Scissors => Shape::Paper, + } + } +} + +#[derive(Clone, Copy, PartialEq, PartialOrd)] +enum Outcome { Win, Draw, Loss } + +impl Outcome { + fn part2_from_string(s: &str) -> Option { + match s { + "X" => Some(Outcome::Loss), + "Y" => Some(Outcome::Draw), + "Z" => Some(Outcome::Win), + _ => None + } + } + + fn with_shapes(opponent: Shape, me: Shape) -> Outcome { + match (opponent, me) { + (Shape::Rock, Shape::Rock) => Outcome::Draw, + (Shape::Rock, Shape::Paper) => Outcome::Win, + (Shape::Rock, Shape::Scissors) => Outcome::Loss, + (Shape::Paper, Shape::Rock) => Outcome::Loss, + (Shape::Paper, Shape::Paper) => Outcome::Draw, + (Shape::Paper, Shape::Scissors) => Outcome::Win, + (Shape::Scissors, Shape::Rock) => Outcome::Win, + (Shape::Scissors, Shape::Paper) => Outcome::Loss, + (Shape::Scissors, Shape::Scissors) => Outcome::Draw, + } + } +} + +struct Round { + opponent: Shape, + me: Shape, + outcome: Outcome, +} + +impl Round { + fn part1_from_string(s: &str) -> Option { + let split: Vec<&str> = s.split(" ").collect(); + match (Shape::part1_from_string(split[0]), Shape::part1_from_string(split[1])) { + (Some(opponents_shape), Some(my_shape)) => { + Some(Round { + opponent: opponents_shape, + me: my_shape, + outcome: Outcome::with_shapes(opponents_shape, my_shape) + }) + }, + _ => None + } + } + + fn part2_from_string(s: &str) -> Option { + let split: Vec<&str> = s.split(" ").collect(); + match (Shape::part2_from_string(split[0]), Outcome::part2_from_string(split[1])) { + (Some(opponents_shape), Some(expected_outcome)) => { + Some(Round { + opponent: opponents_shape, + me: Shape::part2_from_shape_and_outcome(opponents_shape, expected_outcome), + outcome: expected_outcome + }) + }, + _ => None + } + } + + fn score(&self) -> i32 { + self.score_for_my_shape() + self.score_for_outcome() + } + + fn score_for_my_shape(&self) -> i32 { + match self.me { + Shape::Rock => SCORE_FOR_ROCK, + Shape::Paper => SCORE_FOR_PAPER, + Shape::Scissors => SCORE_FOR_SCISSORS, + } + } + + fn score_for_outcome(&self) -> i32 { + match self.outcome { + Outcome::Win => SCORE_FOR_WIN, + Outcome::Draw => SCORE_FOR_DRAW, + Outcome::Loss => SCORE_FOR_LOSS, + } + } +} + +pub fn main(input_filename: &str) -> Result<()> { + let line_reader = line_reader_for_file(input_filename)?; + + let mut number_of_rounds: i32 = 0; + let mut part1_total_score: i32 = 0; + let mut part2_total_score: i32 = 0; + + for line in line_reader { + let line = line.expect(format!("Failed to read line after {} rounds!", number_of_rounds).as_str()); + if let Some(round) = Round::part1_from_string(&line) { + part1_total_score += round.score(); + } + if let Some(round) = Round::part2_from_string(&line) { + part2_total_score += round.score(); + } + number_of_rounds += 1; + } + + println!("Processed {} rounds", number_of_rounds); + println!("Part 1: total score two shapes: {}", part1_total_score); + println!("Part 2: total score with expected outcomes: {}", part2_total_score); + + Ok(()) +}