]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day 10 refactor
authoralex <>
Tue, 10 Dec 2024 09:35:55 +0000 (10:35 +0100)
committeralex <>
Tue, 10 Dec 2024 09:35:55 +0000 (10:35 +0100)
src/day10.rs

index aefb7ebba1600310681b98b8a0674d251e9d92fe..2780f42fb2099ec376c064ae438737842ec0f953 100644 (file)
@@ -26,16 +26,30 @@ impl Puzzle {
         Self { map, start_pos }
     }
 
-    fn score(self: &Self, pos: (isize, isize), value: u8, visited: &mut HashSet<(isize, isize)>) -> u32 {
+    fn score(self: &Self,
+             pos: (isize, isize),
+             value: u8,
+             visited: &mut Option<HashSet<(isize, isize)>>
+    ) -> 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' && !visited.contains(&new_pos) {
-                                visited.insert(new_pos);
-                                1
+                            if value_next == b'9' {
+                                match visited {
+                                    Some(set) => {
+                                        if !set.contains(&new_pos) {
+                                            set.insert(new_pos);
+                                            1
+                                        }
+                                        else {
+                                            0
+                                        }
+                                    },
+                                    None => 1
+                                }
                             }
                             else {
                                 self.score(new_pos, value_next, visited)
@@ -51,25 +65,15 @@ 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 }
+    fn solve(self: &Self, with_rating: bool) -> u32 {
+        self.start_pos.iter()
+            .map(|pos| {
+                match with_rating {
+                    true => self.score(*pos, b'0', &mut None),
+                    false => {
+                        let visited = HashSet::new();
+                        self.score(*pos, b'0', &mut Some(visited))
+                    }
                 }
             })
             .sum()
@@ -80,25 +84,14 @@ fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
     println!("Running {} - part 1", get_day());
 
     let puzzle = Puzzle::new(input);
-    let res = puzzle.start_pos.iter()
-        .map(|pos| {
-            let mut visited = HashSet::new();
-            puzzle.score(*pos, b'0', &mut visited)
-        })
-        .sum();
-
-    Ok(res)
+    Ok(puzzle.solve(false))
 }
 
 fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
     println!("Running {} - part 2", get_day());
 
     let puzzle = Puzzle::new(input);
-    let res = puzzle.start_pos.iter()
-        .map(|pos| puzzle.rating(*pos, b'0'))
-        .sum();
-
-    Ok(res)
+    Ok(puzzle.solve(true))
 }
 
 pub fn run(input: &str) -> Result<(), Box<dyn Error>> {