use anyhow::{Context, Result}; fn extrapolate(sequence: &mut Vec) -> Option<(i64, i64)> { let diff = |seq: &mut Vec| { (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 ")?; 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::().unwrap(); let mut initial: Vec = 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(()) }