fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
println!("Running day04 - part 2");
- let res = 0;
+
+ // on a une version originale de chaque carte
+ let mut n_cards: Vec<u32> = Vec::new();
+ input.lines().for_each(|_| n_cards.push(1));
+
+ // pour chaque carte, on compte le nombre de nombres gagnants
+ // (ce qui correspond à ce qui a été fait en partie 1)
+ // on prend en compte le numéro de la ligne (index dans le vecteur n_cards)
+ input.lines().enumerate()
+ .for_each(|(idx, l)| {
+ let (numbers, winning) = l.split_once(": ").unwrap().1.split_once(" | ").unwrap();
+ let winning: Vec<&str> = winning.split(' ')
+ .filter(|w| !w.is_empty())
+ .collect();
+ let n_win: usize = numbers.trim().split(' ')
+ .filter(|n| !n.is_empty() && winning.contains(n))
+ .map(|_| 1)
+ .sum();
+ if n_win > 0 {
+ for i in 1..=n_win {
+ n_cards[idx + i] += n_cards[idx];
+ }
+ }
+ });
+
+ //println!("n_cards: {:?}", n_cards);
+
+ let res = n_cards.iter().sum();
Ok(res)
}
#[test]
fn day04_part2() {
- let input = "";
+ let input = "\
+Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53
+Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
+Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1
+Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83
+Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
+Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11";
let res = run_part2(&input);
- assert_eq!(0, res.unwrap());
+ assert_eq!(30, res.unwrap());
}
}