Files
aoc-2023/src/bin/day09.rs

49 lines
1.2 KiB
Rust
Raw Normal View History

2023-12-21 17:37:32 +01:00
use anyhow::{Context, Result};
fn extrapolate(sequence: &mut Vec<i64>) -> Option<(i64, i64)> {
let diff = |seq: &mut Vec<i64>| {
(0..seq.len() - 1).for_each(|i| seq[i] = seq[i + 1] - seq[i]);
seq.pop();
};
let mut fwd = 0;
let mut bwd = 0;
let mut f = 1;
while sequence.len() > 1 {
fwd += sequence[sequence.len() - 1];
bwd += f * sequence[0];
diff(sequence);
f *= -1;
if sequence.iter().all(|&num| num == 0) {
return Some((bwd, fwd));
}
}
None
}
fn main() -> Result<()> {
let filename = std::env::args()
.nth(1)
.context("./day09 <path to puzzle input>")?;
let input = std::fs::read_to_string(filename)?;
let mut part1 = 0;
let mut part2 = 0;
for line in input.lines() {
let parse_i64 = |str: &str| str.parse::<i64>().unwrap();
let mut initial: Vec<i64> = line.split_ascii_whitespace().map(parse_i64).collect();
let (p2, p1) = extrapolate(&mut initial).context("malformed input")?;
part1 += p1;
part2 += p2;
}
println!("1) {}", part1);
println!("2) {}", part2);
Ok(())
}