heh
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/src/main.rs b/src/main.rs index 710b2ab..68482cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,24 +50,51 @@ pub enum P1 { pub use util::prelude::*; +fn manual_n<const N: usize>(n: [&u8; N]) -> u32 { + n.iter() + .map(|&&x| (x - b'0') as u32) + .fold(0, |acc, x| acc * 10 + x) +} + pub fn p1(i: &str) -> impl Display { - P1::lexer(i) - .filter_map(Result::ok) - .map(|P1::Mul(a)| a.product()) - .sum::<u32>() - // let re = regex::Regex::new("mul\\(([0-9]+),([0-9]+)\\)").unwrap(); - // re.captures_iter(i) - // .map(|find| { - // reading::all::<u32>(find.get(1).ψ().as_str().as_bytes()) - // * reading::all::<u32>(find.get(2).ψ().as_str().as_bytes()) - // }) - // .sum::<u32>() + let mut i = i.as_bytes(); + let mut sum = 0; + while let Some(idx) = memchr::memchr(b'm', i) { + i = C! { &i[idx + 1..] }; + match i { + [b'u', b'l', b'(', rest @ ..] => { + macro_rules! cases { + ($([$($i:ident)+,$($t:ident)+])+) => { + match rest { + $( + [$($i @ b'0'..=b'9'),+, b',', $($t @ b'0'..=b'9'),+, b')', rest @ ..] => { + (manual_n([$($i),+]) * manual_n([$($t),+]), rest) + } + )+ + _ => (0, i), + } - // i.行() - // .filter(|x| { - // // let x = x.κ::<u64>().collect_vec(); - // }) - // .count() + }; + } + let (res, rest) = cases!( + [a b c , d e f] + [a b c , d e] + [a b c , d] + [a b , d e f] + [a b , d e] + [a b , d] + [a , d e f] + [a , d e] + [a , d] + ); + sum += res; + i = rest; + } + _ => {} + } + } + + sum } pub fn run(i: &str) -> impl Display { |