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 day2;
|
||||
mod day3;
|
||||
|
||||
trait Day {
|
||||
fn assert1(&self, input: &str, output: &str);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user