day3: disable unicode matching, don't recompile RE for every iteration
This commit is contained in:
		
							
								
								
									
										17
									
								
								3/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										17
									
								
								3/Cargo.lock
									
									
									
										generated
									
									
									
								
							@@ -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"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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"] }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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(),
 | 
				
			||||||
                _ => {}
 | 
					                _ => {}
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user