Files
2023-12-09 14:22:02 +01:00

47 lines
1.3 KiB
Rust

use criterion::{criterion_group, criterion_main, Criterion};
fn load_input() -> Vec<Vec<i32>> {
let data = std::fs::read_to_string("src/bin/part09.txt")
.expect("Could not read file")
.lines()
.map(|l| {
l.split_whitespace().map(|s| s.parse::<i32>().unwrap()).collect::<Vec<_>>()
})
.collect::<Vec<_>>();
data
}
fn extrapolate_next_value(series: &[i32]) -> i32 {
let differences = forward_differences(series);
let mut next_value = *series.last().unwrap();
//next_value += differences.iter().skip(1).map(|d| d.last().unwrap()).sum::<i32>();
for diff in differences.iter().skip(1) {
next_value += diff.last().unwrap();
}
next_value
}
fn forward_differences(series: &[i32]) -> Vec<Vec<i32>> {
let mut differences = vec![series.to_vec()];
while differences.last().unwrap().iter().any(|d| *d != 0) {
let last = differences.last().unwrap();
let next = last.windows(2).map(|w| w[1] - w[0]).collect();
differences.push(next);
}
differences
}
fn bench_extrapolate_next_value(c: &mut Criterion) {
let data = load_input();
c.bench_function("extrapolate_next_value", |b| b.iter(|| extrapolate_next_value(&data[0])));
}
criterion_group!(benches, bench_extrapolate_next_value);
criterion_main!(benches);