day3: disable unicode matching, don't recompile RE for every iteration

This commit is contained in:
Keenan Tims 2024-12-04 16:39:57 -08:00
parent e5faee3470
commit dc67b38420
Signed by: ktims
GPG Key ID: 11230674D69038D4
3 changed files with 29 additions and 9 deletions

17
3/Cargo.lock generated
View File

@ -15,6 +15,7 @@ dependencies = [
name = "day3" name = "day3"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"nom",
"regex", "regex",
] ]
@ -24,6 +25,22 @@ version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.11.1" version = "1.11.1"

View File

@ -4,4 +4,5 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
regex = "1.11.1" nom = "7.1.3"
regex = { version = "1.11.1", default-features = false, features = ["perf", "std"] }

View File

@ -1,4 +1,4 @@
use regex::Regex; use regex::bytes::Regex;
use std::fs::File; use std::fs::File;
use std::io::{BufRead, BufReader, Lines}; use std::io::{BufRead, BufReader, Lines};
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
@ -39,10 +39,11 @@ fn main() {
fn problem1<T: BufRead>(input: Lines<T>) -> u64 { fn problem1<T: BufRead>(input: Lines<T>) -> u64 {
let mut sum = 0u64; let mut sum = 0u64;
let re = Regex::new(r"(?-u)mul\((\d+),(\d+)\)").unwrap();
for line in input.map(|i| i.unwrap()) { for line in input.map(|i| i.unwrap()) {
let re = Regex::new(r"mul\((\d+),(\d+)\)").unwrap(); let line = line.as_bytes();
for m in re.captures_iter(&line) { for m in re.captures_iter(line) {
sum += m[1].parse::<u64>().unwrap() * m[2].parse::<u64>().unwrap(); sum += std::str::from_utf8(&m[1]).unwrap().parse::<u64>().unwrap() * std::str::from_utf8(&m[2]).unwrap().parse::<u64>().unwrap();
} }
} }
sum sum
@ -52,13 +53,14 @@ fn problem1<T: BufRead>(input: Lines<T>) -> u64 {
fn problem2<T: BufRead>(input: Lines<T>) -> u64 { fn problem2<T: BufRead>(input: Lines<T>) -> u64 {
let mut sum = 0u64; let mut sum = 0u64;
let mut do_mul = true; let mut do_mul = true;
let re = Regex::new(r"(?-u)(do\(\)|don't\(\)|mul\((\d+),(\d+)\))").unwrap();
for line in input.map(|i| i.unwrap()) { for line in input.map(|i| i.unwrap()) {
let re = Regex::new(r"(do\(\)|don't\(\)|mul\((\d+),(\d+)\))").unwrap(); let line = line.as_bytes();
for m in re.captures_iter(&line) { for m in re.captures_iter(line) {
match &m[1] { match std::str::from_utf8(&m[1]).unwrap() {
"do()" => do_mul = true, "do()" => do_mul = true,
"don't()" => do_mul = false, "don't()" => do_mul = false,
_ if do_mul => sum += m[2].parse::<u64>().unwrap() * m[3].parse::<u64>().unwrap(), _ if do_mul => sum += std::str::from_utf8(&m[2]).unwrap().parse::<u64>().unwrap() * std::str::from_utf8(&m[3]).unwrap().parse::<u64>().unwrap(),
_ => {} _ => {}
} }
} }