Ok(res)
}
-fn run_part2(input: &str) -> Result<String, Box<dyn Error>> {
+// on repart de la partie 1
+// sauf que chaque tour/partie/jeu est considéré
+// pour chaque partie, trouver le nombre minimal de cubes pour faire les tirages
+fn run_part2(input: &str) -> Result<i32, Box<dyn Error>> {
println!("Running day02 - part 2");
- Ok(input.to_string())
+
+ // [ red, green, blue ]
+ let regex = [
+ Regex::new(r"(\d+) red").unwrap(),
+ Regex::new(r"(\d+) green").unwrap(),
+ Regex::new(r"(\d+) blue").unwrap(),
+ ];
+
+ let res = input.lines()
+ .map(|l| {
+ let game: Vec<&str> = l.split(':').collect();
+ let l = game[1];
+
+ // tableau qui contient la valeur minimum (donc le max observé) de
+ // cubes nécessaire à chaque tirage
+ // REMARQUE: cas où le min de cube est 0 non abordé dans le sujet
+ let mut max = [ 0, 0, 0 ];
+ l.split(';')
+ .for_each(|draw| {
+ regex.iter().enumerate() // (re, limit)
+ .for_each(|(i, re)| {
+ let caps = re.captures(draw);
+ if caps.is_some() {
+ let n = caps.unwrap().get(1);
+ if n.is_some() {
+ let n: i32 = n.unwrap().as_str().parse().unwrap();
+ if n > max[i] {
+ max[i] = n;
+ }
+ }
+ }
+ });
+ });
+ max.iter().product::<i32>()
+ })
+ .sum();
+ Ok(res)
}
#[cfg(test)]
#[test]
fn day02_part2() {
- let input = "";
+ let input = "\
+Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
+Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
+Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
+Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
+Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green";
let res = run_part2(&input);
- assert_eq!("", res.unwrap());
+ assert_eq!(2286, res.unwrap());
}
}