]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day09 - part 2
authoralex <null>
Sat, 9 Dec 2023 07:02:37 +0000 (08:02 +0100)
committeralex <null>
Sat, 9 Dec 2023 07:02:37 +0000 (08:02 +0100)
src/day09.rs

index 241b64819fdb241e1a3b09fe0dcd156e825b77e2..fecd18ce279e15d7f19c485306e0a9206b8238fd 100644 (file)
@@ -46,7 +46,33 @@ fn run_part1(input: &str) -> Result<i32, Box<dyn Error>> {
 
 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)
 }
 
@@ -68,6 +94,6 @@ mod tests {
     #[test]
     fn day09_part2() {
         let res = run_part2(TEXT_INPUT);
-        assert_eq!(0, res.unwrap());
+        assert_eq!(2, res.unwrap());
     }
 }