]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day10 - part 2
authoralex <>
Tue, 10 Dec 2024 09:04:04 +0000 (10:04 +0100)
committeralex <>
Tue, 10 Dec 2024 09:04:04 +0000 (10:04 +0100)
src/day10.rs

index 57b56a826340feeaff2cdca21f5b27b78d82fd91..aefb7ebba1600310681b98b8a0674d251e9d92fe 100644 (file)
@@ -50,6 +50,30 @@ impl Puzzle {
             })
             .sum()
     }
+
+    fn rating(self: &Self, pos: (isize, isize), value: u8) -> u32 {
+        [(-1,0), (0,1), (1,0), (0,-1)].iter()
+            .map(|dij| (pos.0 + dij.0 as isize, pos.1 + dij.1 as isize))
+            .map(|new_pos| {
+                match self.map.get(&new_pos) {
+                    Some(&value_next) => {
+                        if value_next == value + 1 {
+                            if value_next == b'9' {
+                                1
+                            }
+                            else {
+                                self.rating(new_pos, value_next)
+                            }
+                        }
+                        else {
+                            0
+                        }
+                    },
+                    _ => { 0 }
+                }
+            })
+            .sum()
+    }
 }
 
 fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
@@ -69,7 +93,12 @@ fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
 fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
     println!("Running {} - part 2", get_day());
 
-    Ok(0)
+    let puzzle = Puzzle::new(input);
+    let res = puzzle.start_pos.iter()
+        .map(|pos| puzzle.rating(*pos, b'0'))
+        .sum();
+
+    Ok(res)
 }
 
 pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
@@ -120,6 +149,7 @@ mod tests {
 ...8..3
 ...9..2
 .....01";
+
     static TEXT_INPUT: &str = "\
 89010123
 78121874
@@ -130,6 +160,22 @@ mod tests {
 01329801
 10456732";
 
+    static TEXT_INPUT_4: &str = "\
+.....0.
+..4321.
+..5..2.
+..6543.
+..7..4.
+..8765.
+..9....";
+    static TEXT_INPUT_5: &str = "\
+012345
+123456
+234567
+345678
+4.6789
+56789.";
+
     #[test]
     fn test_part1() {
         assert_eq!(1, run_part1(TEXT_INPUT_0).unwrap());
@@ -141,6 +187,9 @@ mod tests {
 
     #[test]
     fn test_part2() {
-        assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+        assert_eq!(3, run_part2(TEXT_INPUT_4).unwrap());
+        assert_eq!(13, run_part2(TEXT_INPUT_2).unwrap());
+        assert_eq!(227, run_part2(TEXT_INPUT_5).unwrap());
+        assert_eq!(81, run_part2(TEXT_INPUT).unwrap());
     }
 }