fn run_part2(input: &str) -> Result<i32, Box<dyn Error>> {
println!("Running day09 - part 2");
- let res = 0;
+
+ fn compute_diff(values: Vec<i32>) -> Vec<i32> {
+ (1..values.len())
+ .map(|i| values[i] - values[i - 1])
+ .collect()
+ }
+
+ let res = input.lines()
+ .filter(|l| !l.is_empty())
+ .map(|l| {
+ let mut values: Vec<i32> = l.split(' ')
+ .map(|v| v.parse().unwrap())
+ .collect();
+ let mut next: Vec<i32> = Vec::new();
+ let r = values[0];
+ while values.iter().sum::<i32>() != 0 {
+ values = compute_diff(values);
+ next.push(values[0]);
+ }
+ let mut prev = values[0];
+ (0..next.len()-1).rev()
+ .for_each(|i| {
+ prev = next[i] - prev;
+ });
+ r - prev
+ })
+ .sum();
Ok(res)
}
#[test]
fn day09_part2() {
let res = run_part2(TEXT_INPUT);
- assert_eq!(0, res.unwrap());
+ assert_eq!(2, res.unwrap());
}
}