49 lines
1.2 KiB
Rust
49 lines
1.2 KiB
Rust
|
|
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(())
|
||
|
|
}
|