This commit is contained in:
nora 2023-12-09 14:11:16 +01:00
parent 45b91e9718
commit b3bf7b2a97
2 changed files with 52 additions and 0 deletions

View file

@ -0,0 +1,48 @@
use std::ops::Add;
fn parse(input: &str) -> impl Iterator<Item = impl Iterator<Item = i64> + '_> + '_ {
input
.lines()
.map(|line| line.split_ascii_whitespace().map(|s| s.parse().unwrap()))
}
fn execute(
input: impl Iterator<Item = impl Iterator<Item = i64>>,
last_or_first: impl Fn(&[i64]) -> i64,
fold: impl Fn(i64, i64) -> i64 + Copy,
) -> i64 {
let mut values = Vec::with_capacity(128);
let mut derive = Vec::with_capacity(128);
let mut last_values = Vec::with_capacity(16);
input
.map(|values_iter| {
values.clear();
values.extend(values_iter);
derive.clone_from(&values);
last_values.clear();
last_values.push(last_or_first(&values));
while !derive.iter().all(|&n| n == 0) {
values.clear();
values.extend(derive.windows(2).map(|s| s[1] - s[0]));
last_values.push(last_or_first(&values));
std::mem::swap(&mut values, &mut derive);
}
last_values.iter().copied().rev().fold(0, fold)
})
.sum::<i64>()
}
pub fn part1(input: &str) -> u64 {
execute(parse(input), |s| *s.last().unwrap(), Add::add) as u64
}
pub fn part2(input: &str) -> u64 {
execute(parse(input), |s| *s.first().unwrap(), |a, b| b - a) as u64
}

View file

@ -1,3 +1,5 @@
mod less_alloc;
use std::ops::Add;
use helper::{Day, Variants};
@ -12,9 +14,11 @@ helper::define_variants! {
day => crate::Day09;
part1 {
basic => crate::part1;
less_alloc => crate::less_alloc::part1;
}
part2 {
basic => crate::part2;
less_alloc => crate::less_alloc::part2;
}
}