#[path = "../lib.rs"] mod lib; fn get_start_values(numbers: &Vec) -> Vec { let mut tmp = numbers.clone(); let mut start_values = vec![]; while tmp.iter().any(|x| *x != 0) { for i in (1..tmp.len()).rev() { tmp[i] -= tmp[i - 1]; } start_values.push(tmp.remove(0)); } return start_values; } fn get_value(v: &Vec, i: i64) -> i64 { let mut sum = 0; let mut base = 1; for (k, x) in v.iter().enumerate() { if k > 0 { base = base * (i - (k as i64) + 1) / (k as i64); } sum += x * base; } return sum; } fn main() { let mut sum1 = 0; let mut sum2 = 0; for line in lib::iter_input() { let numbers = line .split_whitespace() .map(|s| s.parse().unwrap()) .collect(); let v = get_start_values(&numbers); sum1 += get_value(&v, numbers.len() as i64); sum2 += get_value(&v, -1); } println!("part1: {}", sum1); println!("part2: {}", sum2); }