solution: day 3

This commit is contained in:
Matej Janezic 2024-12-03 07:22:09 +01:00
parent 0000004082
commit 0000005019
Signed by: janezicmatej
GPG Key ID: 4298E230ED37B2C0
2 changed files with 53 additions and 0 deletions

1
data/examples/03.txt Normal file
View File

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

52
src/bin/03.rs Normal file
View File

@ -0,0 +1,52 @@
use regex::Regex;
fn solve(input: &str, flip: bool) -> usize {
let r = Regex::new(r"mul\((\d+),(\d+)\)|do\(\)|don't\(\)").unwrap();
let mut enabled = true;
let mut res = 0;
for c in r.captures_iter(input) {
let full = c.get(0).unwrap().as_str();
match &full[..=2] {
"mul" => {
if enabled {
let a: usize = c.get(1).unwrap().as_str().parse().unwrap();
let b: usize = c.get(2).unwrap().as_str().parse().unwrap();
res += a * b;
}
}
"do(" => enabled = true,
"don" => enabled = !flip,
_ => unreachable!(),
}
}
res
}
pub fn part_one(input: &str) -> Option<usize> {
solve(input, false).into()
}
pub fn part_two(input: &str) -> Option<usize> {
solve(input, true).into()
}
aoc::solution!(3);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_one() {
assert_eq!(
part_one(&aoc::template::read_file("examples", 3)),
Some(161)
);
}
#[test]
fn test_part_two() {
assert_eq!(part_two(&aoc::template::read_file("examples", 3)), Some(48));
}
}