From ee5cc5f1ef293876ebd977639a1816ac65ae2423 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 10 Dec 2023 22:02:07 +0100 Subject: [PATCH] Day10 - part 2 optimisation MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit On commence à chercher depuis l'intérieur (et non l'extérieur). Ça reste long comme solution, mais on gagne déjà un peu de temps. --- src/day10.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/day10.rs b/src/day10.rs index bc98b11..4b16c8a 100644 --- a/src/day10.rs +++ b/src/day10.rs @@ -396,13 +396,30 @@ fn run_part2(input: &str) -> Result> { count } - let start = (1, 1); - let count_outside = travel(start, &mut seen, map_extended, &frontier_coord); + // on cherche une case à l'intérieur + // on sait que les lignes intermédiaires ne contiennent que de '|' et de ' ' + // on parcourt les lignes intermédiaires et on s'arrête dès qu'on trouve + // la frontière et une limite '|' + let mut start = (1, 1); + for r in (1..map_extended.len()).step_by(2) { + let mut is_inside = false; + for c in (0..map_extended[0].len()).step_by(2) { + if map_extended[r][c] == '|' && is_frontier(&frontier_coord, (r, c)) { + is_inside = !is_inside; + start = (r, c + 1); + break; + } + } + if start != (1, 1) { + break; + } + } + let count_inside = travel(start, &mut seen, map_extended, &frontier_coord); // penser à retirer 2 lignes et 2 colonnes (les bordures en plus) let total: u32 = (puzzle.map[0].len() - 2) as u32 * (puzzle.map.len() - 2) as u32; - let res = total - puzzle_frontier_length - count_outside; + let res = count_inside; Ok(res) } -- 2.39.5