]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day04 - part 2
authoralex <null>
Mon, 4 Dec 2023 06:00:31 +0000 (07:00 +0100)
committeralex <null>
Mon, 4 Dec 2023 06:00:52 +0000 (07:00 +0100)
src/day04.rs

index cccff521d69cc44a099fe1f9c8a8d6ec6064eef0..bac93aec842dac099804683475fcfeccb914120c 100644 (file)
@@ -42,7 +42,34 @@ fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
 
 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)
 }
 
@@ -73,8 +100,14 @@ Card 1: 41 48 83 86  9 17 | 83 86  6 31 17  9 48 53";
 
     #[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());
     }
 }