From 0000005019c0faa7e3175b4a179eb34d21f0cca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Jane=C5=BEi=C4=8D?= Date: Tue, 3 Dec 2024 07:22:09 +0100 Subject: [PATCH] solution: day 3 --- data/examples/03.txt | 1 + src/bin/03.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 data/examples/03.txt create mode 100644 src/bin/03.rs diff --git a/data/examples/03.txt b/data/examples/03.txt new file mode 100644 index 000000000..30032cb --- /dev/null +++ b/data/examples/03.txt @@ -0,0 +1 @@ +xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5)) diff --git a/src/bin/03.rs b/src/bin/03.rs new file mode 100644 index 000000000..523f868 --- /dev/null +++ b/src/bin/03.rs @@ -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 { + solve(input, false).into() +} + +pub fn part_two(input: &str) -> Option { + 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)); + } +}