From 4aa7e9f43cd20a7b52ee33ab126918c62992bd3d Mon Sep 17 00:00:00 2001 From: Keenan Tims Date: Thu, 12 Dec 2024 17:56:28 -0800 Subject: [PATCH] day3: perf - branchless --- src/day3.rs | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/day3.rs b/src/day3.rs index 75879b2..a4d0109 100644 --- a/src/day3.rs +++ b/src/day3.rs @@ -11,33 +11,32 @@ pub fn get_input(input: &[u8]) -> Vec { // PROBLEM 1 solution #[aoc(day3, part1)] pub fn part1(input: &Vec) -> u64 { - let mut sum = 0u64; let re = Regex::new(r"(?-u)mul\((\d+),(\d+)\)").unwrap(); - for line in input { - let line = line.as_bytes(); - for m in re.captures_iter(line) { - sum += u64::from_radix_10(&m[1]).0 * u64::from_radix_10(&m[2]).0; - } - } - sum + input + .iter() + .map(|line| { + re.captures_iter(line.as_bytes()) + .map(|m| u64::from_radix_10(&m[1]).0 * u64::from_radix_10(&m[2]).0) + .sum::() + }) + .sum() } // PROBLEM 2 solution #[aoc(day3, part2)] pub fn part2(input: &Vec) -> u64 { let mut sum = 0u64; - let mut do_mul = true; + let mut do_mul: u64 = 1; let re = Regex::new(r"(?-u)(do\(\)|don't\(\)|mul\((\d+),(\d+)\))").unwrap(); for line in input { let line = line.as_bytes(); for m in re.captures_iter(line) { match &m[1] { - b"do()" => do_mul = true, - b"don't()" => do_mul = false, - _ if do_mul => { - sum += u64::from_radix_10(&m[2]).0 * u64::from_radix_10(&m[3]).0; + b"do()" => do_mul = 1, + b"don't()" => do_mul = 0, + _ => { + sum += u64::from_radix_10(&m[2]).0 * u64::from_radix_10(&m[3]).0 * do_mul; } - _ => {} } } }