Day 01 optimization + Day02
This commit is contained in:
parent
f9b3e9214b
commit
07251c2305
4 changed files with 164 additions and 25 deletions
46
src/day01.rs
46
src/day01.rs
|
@ -1,19 +1,27 @@
|
|||
use std::cmp::Reverse;
|
||||
|
||||
use aoc_runner_derive::{aoc, aoc_generator};
|
||||
#[aoc_generator(day1)]
|
||||
pub fn input_generator(input: &str) -> Vec<usize> {
|
||||
input.split("\n\n").map(|chunk| chunk.lines().map(|line| line.trim().parse::<usize>().unwrap()).sum()).collect()
|
||||
}
|
||||
|
||||
#[aoc(day1, part1)]
|
||||
pub fn solve_part1(input: &[usize]) -> usize {
|
||||
input.iter().max().copied().unwrap_or(0)
|
||||
}
|
||||
|
||||
#[aoc(day1, part2)]
|
||||
pub fn solve_part2(input: &[usize]) -> usize {
|
||||
let mut scores: Vec<usize> = input.to_vec();
|
||||
scores.sort_by_key(|v| Reverse(*v));
|
||||
scores.iter().take(3).sum()
|
||||
}
|
||||
use std::cmp::Reverse;
|
||||
|
||||
use aoc_runner_derive::{aoc, aoc_generator};
|
||||
#[aoc_generator(day1)]
|
||||
pub fn input_generator(input: &str) -> Vec<usize> {
|
||||
input
|
||||
.split("\n\n")
|
||||
.map(|chunk| {
|
||||
chunk
|
||||
.lines()
|
||||
.map(|line| line.trim().parse::<usize>().unwrap())
|
||||
.sum()
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
#[aoc(day1, part1)]
|
||||
pub fn solve_part1(input: &[usize]) -> usize {
|
||||
input.iter().max().copied().unwrap_or(0)
|
||||
}
|
||||
|
||||
#[aoc(day1, part2)]
|
||||
pub fn solve_part2(input: &[usize]) -> usize {
|
||||
let mut scores: Vec<usize> = input.to_vec();
|
||||
scores.sort_by_key(|v| Reverse(*v));
|
||||
scores.iter().take(3).sum()
|
||||
}
|
||||
|
|
131
src/day02.rs
Normal file
131
src/day02.rs
Normal file
|
@ -0,0 +1,131 @@
|
|||
use std::str::FromStr;
|
||||
|
||||
use aoc_runner_derive::{aoc, aoc_generator};
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
||||
pub enum Choice {
|
||||
Rock,
|
||||
Paper,
|
||||
Scissors,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
||||
pub enum Outcome {
|
||||
Win,
|
||||
Loose,
|
||||
Draw,
|
||||
}
|
||||
|
||||
|
||||
impl Outcome {
|
||||
fn other(&self, choice: &Choice) -> Choice {
|
||||
match (self,choice) {
|
||||
(Outcome::Win, Choice::Rock) => Choice::Paper,
|
||||
(Outcome::Win, Choice::Paper) => Choice::Scissors,
|
||||
(Outcome::Win, Choice::Scissors) => Choice::Rock,
|
||||
(Outcome::Loose, Choice::Rock) => Choice::Scissors,
|
||||
(Outcome::Loose, Choice::Paper) => Choice::Rock,
|
||||
(Outcome::Loose, Choice::Scissors) => Choice::Paper,
|
||||
(Outcome::Draw, other) => *other,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Outcome> for usize {
|
||||
fn from(val: Outcome) -> Self {
|
||||
match val {
|
||||
Outcome::Win => 6,
|
||||
Outcome::Loose => 0,
|
||||
Outcome::Draw => 3,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&Choice> for Outcome {
|
||||
fn from(value: &Choice) -> Self {
|
||||
match value {
|
||||
Choice::Rock => Outcome::Loose,
|
||||
Choice::Paper => Outcome::Draw,
|
||||
Choice::Scissors => Outcome::Win,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Choice {
|
||||
fn shape_score(&self) -> usize {
|
||||
match self {
|
||||
Choice::Rock => 1,
|
||||
Choice::Paper => 2,
|
||||
Choice::Scissors => 3,
|
||||
}
|
||||
}
|
||||
fn outcome(&self, other: &Self) -> Outcome {
|
||||
match (self, other) {
|
||||
(Choice::Rock, Choice::Scissors) => Outcome::Win,
|
||||
(Choice::Paper, Choice::Rock) => Outcome::Win,
|
||||
(Choice::Scissors, Choice::Paper) => Outcome::Win,
|
||||
(Choice::Rock, Choice::Rock) => Outcome::Draw,
|
||||
(Choice::Paper, Choice::Paper) => Outcome::Draw,
|
||||
(Choice::Scissors, Choice::Scissors) => Outcome::Draw,
|
||||
(Choice::Rock, Choice::Paper) => Outcome::Loose,
|
||||
(Choice::Paper, Choice::Scissors) => Outcome::Loose,
|
||||
(Choice::Scissors, Choice::Rock) => Outcome::Loose,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FromStr for Choice {
|
||||
type Err = ();
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s.to_ascii_uppercase().as_str() {
|
||||
"A" | "X" => Ok(Self::Rock),
|
||||
"B" | "Y" => Ok(Self::Paper),
|
||||
"C" | "Z" => Ok(Self::Scissors),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[aoc_generator(day2)]
|
||||
pub fn input_generator(input: &str) -> Vec<(Choice, Choice)> {
|
||||
input
|
||||
.lines()
|
||||
.map(|line| {
|
||||
let rule = line
|
||||
.split_ascii_whitespace()
|
||||
.map(|r| r.parse().unwrap())
|
||||
.collect::<Vec<Choice>>();
|
||||
(rule[0], rule[1])
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
#[aoc(day2, part1)]
|
||||
pub fn solve_part1(input: &[(Choice, Choice)]) -> usize {
|
||||
input
|
||||
.iter()
|
||||
.map(|(other, mine)| {
|
||||
let shape_score = mine.shape_score();
|
||||
let outcome: usize = mine.outcome(other).into();
|
||||
shape_score + outcome
|
||||
})
|
||||
.sum()
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#[aoc(day2, part2)]
|
||||
pub fn solve_part2(input: &[(Choice, Choice)]) -> usize {
|
||||
input
|
||||
.iter()
|
||||
.map(|(other, goal)| {
|
||||
let goal: Outcome = goal.into();
|
||||
let mine = goal.other(other);
|
||||
let shape_score = mine.shape_score();
|
||||
let outcome: usize = goal.into();
|
||||
shape_score + outcome
|
||||
})
|
||||
.sum()
|
||||
}
|
|
@ -5,11 +5,11 @@ pub fn input_generator(input: &str) -> _ {
|
|||
}
|
||||
|
||||
#[aoc(dayX, part1)]
|
||||
pub fn solve_part1(input: &[usize]) -> _ {
|
||||
pub fn solve_part1(input: &[usize]) -> usize {
|
||||
todo!()
|
||||
}
|
||||
|
||||
// #[aoc(dayX, part2)]
|
||||
// pub fn solve_part2(input: &[usize]) -> _ {
|
||||
// pub fn solve_part2(input: &[usize]) -> usize {
|
||||
// todo!()
|
||||
// }
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
use aoc_runner_derive::aoc_lib;
|
||||
pub mod day01;
|
||||
aoc_lib! { year = 2022 }
|
||||
use aoc_runner_derive::aoc_lib;
|
||||
pub mod day01;
|
||||
pub mod day02;
|
||||
aoc_lib! { year = 2022 }
|
||||
|
|
Loading…
Reference in a new issue