heh
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs59
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 {