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();