day3: perf - branchless

This commit is contained in:
Keenan Tims 2024-12-12 17:56:28 -08:00
parent a5439062a4
commit 4aa7e9f43c
Signed by: ktims
GPG Key ID: 11230674D69038D4

View File

@ -11,33 +11,32 @@ pub fn get_input(input: &[u8]) -> Vec<String> {
// PROBLEM 1 solution // PROBLEM 1 solution
#[aoc(day3, part1)] #[aoc(day3, part1)]
pub fn part1(input: &Vec<String>) -> u64 { pub fn part1(input: &Vec<String>) -> u64 {
let mut sum = 0u64;
let re = Regex::new(r"(?-u)mul\((\d+),(\d+)\)").unwrap(); let re = Regex::new(r"(?-u)mul\((\d+),(\d+)\)").unwrap();
for line in input { input
let line = line.as_bytes(); .iter()
for m in re.captures_iter(line) { .map(|line| {
sum += u64::from_radix_10(&m[1]).0 * u64::from_radix_10(&m[2]).0; re.captures_iter(line.as_bytes())
} .map(|m| u64::from_radix_10(&m[1]).0 * u64::from_radix_10(&m[2]).0)
} .sum::<u64>()
sum })
.sum()
} }
// PROBLEM 2 solution // PROBLEM 2 solution
#[aoc(day3, part2)] #[aoc(day3, part2)]
pub fn part2(input: &Vec<String>) -> u64 { pub fn part2(input: &Vec<String>) -> u64 {
let mut sum = 0u64; 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(); let re = Regex::new(r"(?-u)(do\(\)|don't\(\)|mul\((\d+),(\d+)\))").unwrap();
for line in input { for line in input {
let line = line.as_bytes(); let line = line.as_bytes();
for m in re.captures_iter(line) { for m in re.captures_iter(line) {
match &m[1] { match &m[1] {
b"do()" => do_mul = true, b"do()" => do_mul = 1,
b"don't()" => do_mul = false, b"don't()" => do_mul = 0,
_ if do_mul => { _ => {
sum += u64::from_radix_10(&m[2]).0 * u64::from_radix_10(&m[3]).0; sum += u64::from_radix_10(&m[2]).0 * u64::from_radix_10(&m[3]).0 * do_mul;
} }
_ => {}
} }
} }
} }