47 lines
1.3 KiB
Rust
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); |