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 days {
|
||||||
mod day1;
|
mod day1;
|
||||||
|
mod day2;
|
||||||
}
|
}
|
||||||
|
|
||||||
aoc_lib! { year = 2022 }
|
aoc_lib! { year = 2022 }
|
||||||
|
|
Loading…
Reference in a new issue