From 332d1bcecd2bbf53b1bf0dcfc152bb0dbd02fc90 Mon Sep 17 00:00:00 2001 From: missing Date: Sat, 3 Dec 2022 13:37:09 -0600 Subject: [PATCH] day 2 --- src/days/day2.rs | 98 ++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 99 insertions(+) create mode 100644 src/days/day2.rs diff --git a/src/days/day2.rs b/src/days/day2.rs new file mode 100644 index 0000000..29de3f0 --- /dev/null +++ b/src/days/day2.rs @@ -0,0 +1,98 @@ +use aoc_runner_derive::{aoc, aoc_generator}; + +#[derive(Clone, Copy)] +enum Rps { + Rock, + Paper, + Scissors, +} + +#[derive(Clone, Copy)] +enum Xyz { + X, + Y, + Z, +} + +impl Xyz { + fn to_rps(self) -> Rps { + match self { + Xyz::X => Rps::Rock, + Xyz::Y => Rps::Paper, + Xyz::Z => Rps::Scissors, + } + } + + fn part_two_stuff(self, opp: Rps) -> u32 { + match (self, opp) { + // need to lose + (Xyz::X, Rps::Rock) => Rps::Scissors, + (Xyz::X, Rps::Paper) => Rps::Rock, + (Xyz::X, Rps::Scissors) => Rps::Paper, + // need to draw + (Xyz::Y, _) => opp, + // need to win + (Xyz::Z, Rps::Rock) => Rps::Paper, + (Xyz::Z, Rps::Paper) => Rps::Scissors, + (Xyz::Z, Rps::Scissors) => Rps::Rock, + } + .score_against(opp) + } +} + +impl Rps { + fn score_against(self, opp: Rps) -> u32 { + // 1 for Rock, 2 for Paper, 3 for Scissors + // 0 for loss, 3 for tie, 6 for win + #[allow(clippy::identity_op)] + match (self, opp) { + (Rps::Rock, Rps::Rock) => 1 + 3, + (Rps::Rock, Rps::Paper) => 1 + 0, + (Rps::Rock, Rps::Scissors) => 1 + 6, + (Rps::Paper, Rps::Rock) => 2 + 6, + (Rps::Paper, Rps::Paper) => 2 + 3, + (Rps::Paper, Rps::Scissors) => 2 + 0, + (Rps::Scissors, Rps::Rock) => 3 + 0, + (Rps::Scissors, Rps::Paper) => 3 + 6, + (Rps::Scissors, Rps::Scissors) => 3 + 3, + } + } +} + +#[aoc_generator(day2)] +fn day1_generator(s: &str) -> Vec<(Rps, Xyz)> { + s.lines() + .map(|l| { + ( + match l.chars().next().unwrap() { + 'A' => Rps::Rock, + 'B' => Rps::Paper, + 'C' => Rps::Scissors, + _ => panic!(), + }, + match l.chars().nth(2).unwrap() { + 'X' => Xyz::X, + 'Y' => Xyz::Y, + 'Z' => Xyz::Z, + _ => panic!(), + }, + ) + }) + .collect() +} + +#[aoc(day2, part1)] +fn day1_part1(input: &[(Rps, Xyz)]) -> u32 { + input + .iter() + .map(|&(opp, me)| me.to_rps().score_against(opp)) + .sum() +} + +#[aoc(day2, part2)] +fn day1_part2(input: &[(Rps, Xyz)]) -> u32 { + input + .iter() + .map(|&(opp, target_xyz)| target_xyz.part_two_stuff(opp)) + .sum() +} diff --git a/src/lib.rs b/src/lib.rs index f339768..b2f0aef 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ use aoc_runner_derive::aoc_lib; mod days { mod day1; + mod day2; } aoc_lib! { year = 2022 }