]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day02 - Part 2
authoralex <null>
Sat, 2 Dec 2023 07:57:22 +0000 (08:57 +0100)
committeralex <null>
Sat, 2 Dec 2023 07:57:22 +0000 (08:57 +0100)
src/day02.rs

index 7e8db573765d57b9b429f90b6a8db805d12756cc..3223c6a94b9a38f508d2a74f74f061fc705e5a77 100644 (file)
@@ -81,9 +81,48 @@ fn run_part1(input: &str) -> Result<i32, Box<dyn Error>> {
     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)]
@@ -104,8 +143,13 @@ Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green";
 
     #[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());
     }
 }