use aoc; use std::io::{BufReader, Read}; use aoc::Day; use regex::Regex; struct Day3 {} impl Day for Day3 { fn example_input(&self) -> &'static str { r#" xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5)) "#.trim() } fn example_input_part_2(&self) -> &'static str { r#" xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5)) "#.trim() } fn example_result_part_1(&self) -> &'static str { "161" } fn example_result_part_2(&self) -> &'static str { "48" } fn part_1(&self, input: BufReader>) -> String { let code = self.read_lines(input).iter().map(|l| l.trim()).collect::>().join(""); let re = Regex::new(r"mul\((?P\d+),(?P\d+)\)").unwrap(); re .captures_iter(&code) .map(|c| { c.name("a").unwrap().as_str().parse::().unwrap() * c.name("b").unwrap().as_str().parse::().unwrap() }) .sum::() .to_string() } fn part_2(&self, input: BufReader>) -> String { let code = self.read_lines(input).iter().map(|l| l.trim()).collect::>().join(""); println!("{}", code); let mut mul = true; let re = Regex::new(r"mul\((?P\d+),(?P\d+)\)|(?Pdo)\(\)|(?Pdon't)\(\)").unwrap(); re .captures_iter(&code) .map(|c| { if c.name("enable") != None { mul = true; } else if c.name("disable") != None { mul = false; } else if mul { return c.name("a").unwrap().as_str().parse::().unwrap() * c.name("b").unwrap().as_str().parse::().unwrap(); } 0 }) .sum::() .to_string() } } fn main() { aoc::main(&Day3 {}); } #[cfg(test)] mod tests { use super::*; #[test] fn test_day3() { aoc::test_day(&Day3 {}); } }