diff --git a/day-3/src/main.rs b/day-3/src/main.rs index 4ca4046..ba2be1c 100644 --- a/day-3/src/main.rs +++ b/day-3/src/main.rs @@ -1,24 +1,54 @@ use std::fs; - use regex::Regex; pub fn parse(input: &str) -> Vec<(i32, i32)> { - let pattern = Regex::new(r"mul\((\d+),(\d+)\)").unwrap(); - pattern.captures_iter(input).map(|caps| { - (caps.get(1).unwrap().as_str().parse().unwrap(), caps.get(2).unwrap().as_str().parse().unwrap()) - }).collect() + let pattern = Regex::new(r"^mul\((\d+),(\d+)\)").unwrap(); + let do_pattern = Regex::new(r"^do\(\)").unwrap(); + let dont_pattern = Regex::new(r"^don't\(\)").unwrap(); + + let mut index: usize = 0; + let mut do_mul = true; + + let mut parsed = Vec::new(); + + while index < input.len() { + if let Some(_) = do_pattern.captures(&input[index..]) { + do_mul = true; + index += 1; + } else if let Some(_) = dont_pattern.captures(&input[index..]) { + do_mul = false; + index += 1; + } else if let Some(caps) = pattern.captures(&input[index..]) { + if do_mul { + parsed.push(( + caps.get(1).unwrap().as_str().parse().unwrap(), + caps.get(2).unwrap().as_str().parse().unwrap(), + )); + index += caps.len(); + } else { + index += 1; + } + } else { + index += 1; + } + } + + parsed } fn main() { let input = fs::read_to_string("input.txt").unwrap(); + //let input = String::from("don't()mul(2,2)"); + let parsed = parse(&input); let mut sum = 0; - for (x, y) in parsed { - sum += x * y; + for (x, y) in &parsed { + sum += *x * *y; } - println!("{sum}"); + //println!("parsed: {parsed:?}"); + println!("sum: {sum}"); }