From: alex <> Date: Tue, 10 Dec 2024 09:35:55 +0000 (+0100) Subject: Day 10 refactor X-Git-Url: https://aoc.elinar.fr/?a=commitdiff_plain;h=6a23bd17d4404a930ce2508d8bad5f5e315b3b2e;p=aoc_2024 Day 10 refactor --- diff --git a/src/day10.rs b/src/day10.rs index aefb7eb..2780f42 100644 --- a/src/day10.rs +++ b/src/day10.rs @@ -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> + ) -> 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> { 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> { 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> {