From 9204e5896283771e5f0e088e3920cc9d443da30f Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 4 Dec 2023 07:00:31 +0100 Subject: [PATCH] Day04 - part 2 --- src/day04.rs | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/day04.rs b/src/day04.rs index cccff52..bac93ae 100644 --- a/src/day04.rs +++ b/src/day04.rs @@ -42,7 +42,34 @@ fn run_part1(input: &str) -> Result> { fn run_part2(input: &str) -> Result> { println!("Running day04 - part 2"); - let res = 0; + + // on a une version originale de chaque carte + let mut n_cards: Vec = 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()); } } -- 2.39.5