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)]
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());
#[test]
fn test_part2() {
- assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+ assert_eq!(48, run_part2(TEXT_INPUT_2).unwrap());
}
}