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

  • Gobbel2000
    link
    fedilink
    arrow-up
    2
    ·
    2 days ago

    Rust

    Regex made this one pretty straightforward. The second part additionally looks for do() and don'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!();
    
    • CameronDevOPM
      link
      fedilink
      arrow-up
      2
      ·
      1 day ago

      Our part1’s are basically identical, but for part 2 I just regex deleted everything between dont() anddo() `, 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 :)