Café & Tapioca

Advent of Code 2024 | Dia 3

Prólogo:

Desafio 1 (dia 3):

Contexto:

  1. mul(2,4)
  2. mul(5,5)
  3. mul(11,8)
  4. mul(8,5)

Código:

fn p1(f: &str) -> Result<u32, Error> {
    let re = Regex::new(r"mul\((?<num1>[0-9]{1,3}),(?<num2>([0-9]{1,3}))\)").unwrap();
    let mut result: u32 = 0;
    for caps in re.captures_iter(&fs::read_to_string(f)?) {
        if let (Some(num1), Some(num2)) = (caps.name("num1"), caps.name("num2")) {
            let num1 = num1.as_str().parse::<u32>().unwrap();
            let num2 = num2.as_str().parse::<u32>().unwrap();
            result += num1 * num2;
        }
    }
    Ok(result)
}

Explicação:


Desafio 2 (dia 3):

Contexto:

Exemplo:

xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))

Código:

fn p2(f: &str) -> Result<u32, Error> {
    let re = Regex::new(
        r"(?<cmd_do>do\(\))|(?<cmd_dont>don't\(\))|mul\((?<num1>[0-9]{1,3}),(?<num2>[0-9]{1,3})\)",
    )
    .unwrap();
    let content = fs::read_to_string(f)?;
    let mut enabled = true;
    let mut result: u32 = 0;
    for cap in re.captures_iter(&content) {
        if cap.name("cmd_do").is_some() {
            enabled = true;
        } else if cap.name("cmd_dont").is_some() {
            enabled = false;
        } else if let (Some(num1), Some(num2)) = (cap.name("num1"), cap.name("num2")) {
            if enabled {
                let num1 = num1.as_str().parse::<u32>().unwrap();
                let num2 = num2.as_str().parse::<u32>().unwrap();
                result += num1 * num2;
            }
        }
    }
    Ok(result)
}

Explicação:

  1. (?<cmd_do>do\(\)) - usado para ativar as operações;
  2. (?<cmd_dont>don't\(\)) - usado para desativar as instruções;
  3. mul\((?<num1>[0-9]{1,3}),(?<num2>[0-9]{1,3})\) - usado para identificar as instruções de multiplicação;

Considerações finais:

#adventofcode #adventofcode2024 #rust