diff --git a/y2024/src/days/d3.rs b/y2024/src/days/d3.rs index dd9f3d9..a7307a1 100644 --- a/y2024/src/days/d3.rs +++ b/y2024/src/days/d3.rs @@ -10,8 +10,8 @@ pub fn process_part1(input: &str) -> i32 { // Could use this regex but wouldn't know how to solve part 2 // /mul\([0-9]{1,3},[0-9]{1,3}\)/g -// /don't\(\).*do\(\)/g would select anything between don't() and do() -// not sure how to invert this and combine +// /don't\(\).*do\(\)/g would select anything between first don't() and last do() +// not sure how to fix, invert and combine this fn extract_mul_pairs(line: &str) -> Vec<(i32, i32)> { let reg = Regex::new(r"mul\([0-9]{1,3},[0-9]{1,3}\)").unwrap(); reg.find_iter(line) @@ -25,10 +25,32 @@ fn extract_mul_pairs(line: &str) -> Vec<(i32, i32)> { .collect::>() } +fn remove_donts(line: &str) -> String { + let mut new_line = line.to_string(); + loop { + println!("len {}", line.len()); + let mut end_range = new_line.len() - 1; + if let Some(dont_idx) = new_line.find("don't()") { + if let Some(do_idx) = new_line.find("do()") { + if dont_idx < do_idx { + end_range = do_idx + 4; + } + } + println!("dont {dont_idx} to {end_range}"); + new_line.replace_range(dont_idx..end_range, ""); + } else { + return new_line; + } + } +} + pub fn process_part2(input: &str) -> i32 { input .lines() - .map(extract_mul_pairs) + .map(|line| { + let line = remove_donts(line); + extract_mul_pairs(&line) + }) .map(|pairs| pairs.iter().map(|(a, b)| a * b).sum::()) .sum() }