Day 2
This commit is contained in:
parent
2685989a89
commit
57767cb6c2
132
src/day02.rs
Normal file
132
src/day02.rs
Normal file
@ -0,0 +1,132 @@
|
||||
use std::str::FromStr;
|
||||
|
||||
use aoc_runner_derive::{aoc, aoc_generator};
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct InvalidMove;
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||
pub enum Move {
|
||||
Rock,
|
||||
Paper,
|
||||
Scissors,
|
||||
}
|
||||
|
||||
impl Move {
|
||||
fn shape_score(self) -> u64 {
|
||||
match self {
|
||||
Self::Rock => 1,
|
||||
Self::Paper => 2,
|
||||
Self::Scissors => 3,
|
||||
}
|
||||
}
|
||||
|
||||
fn round_score(self, opp: Self) -> u64 {
|
||||
if self == opp {
|
||||
return 3;
|
||||
}
|
||||
match (self, opp) {
|
||||
(Self::Rock, Self::Scissors) => 6,
|
||||
(Self::Scissors, Self::Paper) => 6,
|
||||
(Self::Paper, Self::Rock) => 6,
|
||||
_ => 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FromStr for Move {
|
||||
type Err = InvalidMove;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
// X Y and Z are treated as moves because part 1 uses them as moves even though they are
|
||||
// not.
|
||||
match s {
|
||||
"A" | "X" => Ok(Self::Rock),
|
||||
"B" | "Y" => Ok(Self::Paper),
|
||||
"C" | "Z" => Ok(Self::Scissors),
|
||||
_ => Err(InvalidMove),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||
pub enum Outcome {
|
||||
Lose,
|
||||
Draw,
|
||||
Win,
|
||||
}
|
||||
|
||||
impl Outcome {
|
||||
fn compute_move(&self, opp: Move) -> Move {
|
||||
match self {
|
||||
Outcome::Lose => match opp {
|
||||
Move::Rock => Move::Scissors,
|
||||
Move::Paper => Move::Rock,
|
||||
Move::Scissors => Move::Paper,
|
||||
},
|
||||
Outcome::Draw => opp,
|
||||
Outcome::Win => match opp {
|
||||
Move::Rock => Move::Paper,
|
||||
Move::Paper => Move::Scissors,
|
||||
Move::Scissors => Move::Rock,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct InvalidOutcome;
|
||||
|
||||
impl FromStr for Outcome {
|
||||
type Err = InvalidOutcome;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s {
|
||||
"X" => Ok(Self::Lose),
|
||||
"Y" => Ok(Self::Draw),
|
||||
"Z" => Ok(Self::Win),
|
||||
_ => Err(InvalidOutcome),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[aoc_generator(day2, part1)]
|
||||
pub fn input_generator_part1(input: &str) -> Vec<(Move, Move)> {
|
||||
input
|
||||
.lines()
|
||||
.map(|line| {
|
||||
let (opp, you) = line.split_once(' ').unwrap();
|
||||
(opp.parse().unwrap(), you.parse().unwrap())
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
}
|
||||
|
||||
#[aoc(day2, part1)]
|
||||
pub fn solve_part1(input: &[(Move, Move)]) -> u64 {
|
||||
input
|
||||
.iter()
|
||||
.map(|&(opp, you)| you.shape_score() + you.round_score(opp))
|
||||
.sum()
|
||||
}
|
||||
|
||||
#[aoc_generator(day2, part2)]
|
||||
pub fn input_generator_part2(input: &str) -> Vec<(Move, Outcome)> {
|
||||
input
|
||||
.lines()
|
||||
.map(|line| {
|
||||
let (opp, outcome) = line.split_once(' ').unwrap();
|
||||
(opp.parse().unwrap(), outcome.parse().unwrap())
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
}
|
||||
|
||||
#[aoc(day2, part2)]
|
||||
pub fn solve_part2(input: &[(Move, Outcome)]) -> u64 {
|
||||
input
|
||||
.iter()
|
||||
.map(|&(opp, outcome)| {
|
||||
let you = outcome.compute_move(opp);
|
||||
you.shape_score() + you.round_score(opp)
|
||||
})
|
||||
.sum()
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
use aoc_runner_derive::aoc_lib;
|
||||
|
||||
pub mod day01;
|
||||
pub mod day02;
|
||||
|
||||
aoc_lib! { year = 2022 }
|
||||
|
Loading…
Reference in New Issue
Block a user