]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day05 - part 1 (fonctionnel)
authoralex <null>
Tue, 5 Dec 2023 07:10:20 +0000 (08:10 +0100)
committeralex <null>
Tue, 5 Dec 2023 07:10:20 +0000 (08:10 +0100)
src/day05.rs

index dda7d5d25cf24e43c67dd9d59f49778aaec116fa..78e039cc9ae92adb8ade0be978f9538cb42f1e50 100644 (file)
@@ -26,23 +26,29 @@ fn run_part1(input: &str) -> Result<usize, Box<dyn Error>> {
 
     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<usize> = (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<bool> = (0..seeds.len()).map(|_| false).collect();
+            bloc.split("\n").skip(1).filter(|l| !l.is_empty())
                 .for_each(|l| {
                     let values: Vec<usize> = 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();