use criterion::{criterion_group, criterion_main, Criterion}; fn load_input() -> Vec> { 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::().unwrap()).collect::>() }) .collect::>(); 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::(); for diff in differences.iter().skip(1) { next_value += diff.last().unwrap(); } next_value } fn forward_differences(series: &[i32]) -> Vec> { 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);