feat: Day 3
This commit is contained in:
parent
22fc3511b7
commit
ff3fe411ae
100
aoc_2025/src/day3.rs
Normal file
100
aoc_2025/src/day3.rs
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
use std::iter::Sum;
|
||||||
|
|
||||||
|
use crate::{AoC, Day, SimpleDay, WinnowDay};
|
||||||
|
use winnow::{
|
||||||
|
Parser, Result,
|
||||||
|
ascii::newline,
|
||||||
|
combinator::{repeat, terminated},
|
||||||
|
error::ContextError,
|
||||||
|
token::one_of,
|
||||||
|
};
|
||||||
|
|
||||||
|
fn day() -> impl WinnowDay {
|
||||||
|
AoC::new(parse as _, part1 as _, part2 as _)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse<'a, 'b>(input: &'a mut &'b str) -> Result<Vec<Vec<usize>>> {
|
||||||
|
repeat(1.., parse_line).parse_next(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_line(input: &mut &str) -> Result<Vec<usize>, ContextError> {
|
||||||
|
terminated(
|
||||||
|
repeat(
|
||||||
|
1..,
|
||||||
|
one_of(('0'..='9',)).map(|c: char| c.to_string().parse::<usize>().unwrap()),
|
||||||
|
),
|
||||||
|
newline,
|
||||||
|
)
|
||||||
|
.parse_next(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: Vec<Vec<usize>>) -> usize {
|
||||||
|
input.iter().map(joltage(2)).sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: Vec<Vec<usize>>) -> usize {
|
||||||
|
input.iter().map(joltage(12)).sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn joltage<
|
||||||
|
'a,
|
||||||
|
B: IntoIterator<IntoIter = I> + Copy,
|
||||||
|
I: ExactSizeIterator<Item = &'a N>,
|
||||||
|
N: Sum<&'a N> + Into<usize> + From<usize> + Copy + Default + 'a,
|
||||||
|
>(
|
||||||
|
size: usize,
|
||||||
|
) -> impl Fn(B) -> N {
|
||||||
|
move |line| {
|
||||||
|
(line.into_iter().len() - size..line.into_iter().len())
|
||||||
|
.fold((0, 0), |(start, val), end| {
|
||||||
|
line.into_iter()
|
||||||
|
.enumerate()
|
||||||
|
.skip(start)
|
||||||
|
.take(end - start + 1)
|
||||||
|
.map(|(i, v)| (i + 1, (*v).into() + val * 10))
|
||||||
|
.reduce(|a, b| if a.1 >= b.1 { a } else { b })
|
||||||
|
.unwrap()
|
||||||
|
})
|
||||||
|
.1
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part1_test() {
|
||||||
|
day().assert1(
|
||||||
|
"987654321111111
|
||||||
|
811111111111119
|
||||||
|
234234234234278
|
||||||
|
818181911112111
|
||||||
|
",
|
||||||
|
"357",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part1_solve() {
|
||||||
|
day().assert1(include_str!("../input/day3.txt"), "17343");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part2_test() {
|
||||||
|
day().assert2(
|
||||||
|
"987654321111111
|
||||||
|
811111111111119
|
||||||
|
234234234234278
|
||||||
|
818181911112111
|
||||||
|
",
|
||||||
|
"3121910778619",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part2_solve() {
|
||||||
|
day().assert2(include_str!("../input/day3.txt"), "172664333119298");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -7,6 +7,7 @@ use winnow::Parser;
|
|||||||
|
|
||||||
mod day1;
|
mod day1;
|
||||||
mod day2;
|
mod day2;
|
||||||
|
mod day3;
|
||||||
|
|
||||||
trait Day {
|
trait Day {
|
||||||
fn assert1(&self, input: &str, output: &str);
|
fn assert1(&self, input: &str, output: &str);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user