use std::fs::File; use std::io::Read; fn diff(arr: &Vec) -> Vec { arr.iter() .zip(arr.iter().skip(1)) .map(|(x, y)| y - x) .collect() } fn main() { // let filename = "in/day09.ref"; let filename = "in/day09.pzl"; let mut f = File::open(filename).expect("cannot open file"); let mut content = String::new(); f.read_to_string(&mut content).expect("cannot read file"); let lines = content.trim_end().split('\n'); // println!("{:?}", lines); let mut inp: Vec> = Vec::new(); for line in lines { let l: Vec = line.split(' ').map(|x| x.parse().unwrap()).collect(); inp.push(l); } let mut res1 = 0; let mut res2 = 0; for nums in inp.iter() { let mut desc: Vec> = Vec::new(); desc.push(nums.clone()); let mut d = diff(&nums); desc.push(d.clone()); while d.iter().filter(|x| **x != 0).collect::>().len() != 0 { d = diff(&d); desc.push(d.clone()); } let mut a: i64 = *desc[desc.len() - 2].last().unwrap(); for i in 0..desc.len() - 2 { a = *desc[desc.len() - 3 - i].last().unwrap() + a; } res1 += a; let mut b: i64 = desc[desc.len() - 2][0]; for i in 0..desc.len() - 2 { b = desc[desc.len() - 3 - i][0] - b; } res2 += b; } println!("res1: {}", res1); println!("res2: {}", res2); assert_eq!(res1, 1938800261); assert_eq!(res2, 1112); }