]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day03 - part 2
authoralex <>
Tue, 3 Dec 2024 09:06:34 +0000 (10:06 +0100)
committeralex <>
Tue, 3 Dec 2024 09:06:34 +0000 (10:06 +0100)
src/day03.rs

index a650dfd01ea884b1799c4c98b5dfc95865156bc5..51bf91d6e1691bf321dc9c2b85a738c330a853b6 100644 (file)
@@ -39,7 +39,26 @@ fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
 fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
     println!("Running {} - part 2", get_day());
 
-    Ok(0)
+    let re = Regex::new(r"mul\(\d{1,3},\d{1,3}\)|do\(\)|don't\(\)").unwrap();
+
+    let mut res: u32 = 0;
+    let mut enabled = true;
+
+    re.find_iter(input)
+        .map(|m| m.as_str())
+        .for_each(|m| {
+            if m == "do()" { enabled = true; }
+            else if m == "don't()" { enabled = false; }
+            else if enabled {
+                let v = m[4..m.len()-1]
+                    .split(",")
+                    .map(|v| v.parse::<u32>().unwrap())
+                    .collect::<Vec<u32>>();
+                res += v[0]*v[1];
+            }
+        });
+
+    Ok(res)
 }
 
 #[cfg(test)]
@@ -49,6 +68,9 @@ mod tests {
     static TEXT_INPUT: &str = "\
 xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))";
 
+    static TEXT_INPUT_2: &str = "\
+xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))";
+
     #[test]
     fn test_part1() {
         assert_eq!(161, run_part1(TEXT_INPUT).unwrap());
@@ -56,6 +78,6 @@ xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))";
 
     #[test]
     fn test_part2() {
-        assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+        assert_eq!(48, run_part2(TEXT_INPUT_2).unwrap());
     }
 }