Day 3: Mull It Over
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Rust
Regex made this one pretty straightforward. The second part additionally looks for
do()
anddon't()
in the same regex, then we do a case distinction on the match.use regex::{Regex, Captures}; fn mul_cap(cap: Captures) -> i32 { let a = cap.get(1).unwrap().as_str().parse::<i32>().unwrap(); let b = cap.get(2).unwrap().as_str().parse::<i32>().unwrap(); a * b } fn part1(input: String) { let re = Regex::new(r"mul\((\d{1,3}),(\d{1,3})\)").unwrap(); let res = re.captures_iter(&input).map(mul_cap).sum::<i32>(); println!("{res}"); } fn part2(input: String) { let re = Regex::new(r"do\(\)|don't\(\)|mul\((\d{1,3}),(\d{1,3})\)").unwrap(); let mut enabled = true; let mut res = 0; for cap in re.captures_iter(&input) { match cap.get(0).unwrap().as_str() { "do()" => enabled = true, "don't()" => enabled = false, _ if enabled => res += mul_cap(cap), _ => {} } } println!("{res}"); } util::aoc_main!();
Our part1’s are basically identical, but for part 2 I just regex deleted everything between
don
t()and
do() `, after sanitizing out the newlines.I guess it would have failed if my test data had a mul after the last dont, but it worked out, so good enough :)