From 460983753a0f48e4cf4ca14175ccc491586fe5e5 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 5 Dec 2023 08:10:20 +0100 Subject: [PATCH] Day05 - part 1 (fonctionnel) --- src/day05.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/day05.rs b/src/day05.rs index dda7d5d..78e039c 100644 --- a/src/day05.rs +++ b/src/day05.rs @@ -26,23 +26,29 @@ fn run_part1(input: &str) -> Result> { let mut loc = seeds.clone(); - // parcourir les lignes et on construit un vecteur de mappings // hypothèse, le chaînage est dans l'ordre des lignes et se lit de haut en bas // on parcours les blocs un par un - // pour chaque bloc on crée un vecteur correspondant au mapping + // pour chaque bloc on regarde si la graine est dans le slice (dst..dst+len) // puis on extrait la valeur final de chaque graine input.split("\n\n").skip(1) .for_each(|bloc| { - let mut map: Vec = (0..=99).map(|i: usize| i).collect(); - bloc.split("\n").skip(1) + // check que la graine n'a pas été déjà vue pour ce bloc + let mut seed_seen: Vec = (0..seeds.len()).map(|_| false).collect(); + bloc.split("\n").skip(1).filter(|l| !l.is_empty()) .for_each(|l| { let values: Vec = l.split_whitespace() .map(|s| s.parse().unwrap()) .collect(); let (dst, src, len) = (values[0], values[1], values[2]); - (0..len).for_each(|i| map[src + i] = dst + i); + // attention le changment de valeur n'est à opérer qu'une fois par bloc + // vérifier que la graines n'a pas été déjà parcourue pour ce bloc + (0..loc.len()).for_each(|i| { + if !seed_seen[i] && (src..(src + len)).contains(&loc[i]) { + loc[i] = loc[i] + dst - src; + seed_seen[i] = true; + } + }); }); - (0..loc.len()).for_each(|i| loc[i] = map[loc[i]]); }); let res = loc.into_iter().min().unwrap(); -- 2.39.5