day 2
This commit is contained in:
parent
9ddfd522af
commit
332d1bcecd
98
src/days/day2.rs
Normal file
98
src/days/day2.rs
Normal file
|
@ -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()
|
||||
}
|
|
@ -2,6 +2,7 @@ use aoc_runner_derive::aoc_lib;
|
|||
|
||||
mod days {
|
||||
mod day1;
|
||||
mod day2;
|
||||
}
|
||||
|
||||
aoc_lib! { year = 2022 }
|
||||
|
|
Loading…
Reference in a new issue