heh
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 175 |
1 files changed, 68 insertions, 107 deletions
diff --git a/src/main.rs b/src/main.rs index 27d0ce1..710b2ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,117 +27,78 @@ extern crate test; pub mod util; use atools::prelude::*; -// use hinted::HintExt; -pub use util::prelude::*; - -#[no_mangle] -fn check(x: &[i8]) -> bool { - if x.len() > 8 { - unsafe { std::hint::unreachable_unchecked() } - } - let state = unsafe { x.first_chunk::<2>().map(|[a, b]| a < b).unwrap_unchecked() }; - x.array_windows::<2>().all(|[a, b]| match state { - true if !(1..=3).contains(&(b - a)) => return false, - false if !(1..=3).contains(&(a - b)) => return false, - _ => true, - }) +use logos::{Lexer as RealLexer, Logos, SpannedIter}; +#[derive(Logos, Debug, PartialEq, Clone)] +#[logos(skip r"[\n\s]+")] +#[allow(dead_code)] +pub enum P2 { + #[token("do()")] + Do, + #[token("don't()")] + Dont, + #[regex(r"mul\([0-9]+,[0-9]+\)", |lex| lex.slice().μ(',').array().map(|x| x.as_bytes().iter().filter(|x| x.is_ascii_digit()).fold(0, |acc, x| acc * 10 + (x -b'0') as u32)))] + Mul([u32; 2]), } -pub fn run(i: &str) -> impl Display { - let mut items = [0; 8]; - i.行() - .filter(|x| { - let mut len = 0; - let mut s = 0; - for &b in *x { - match b { - b' ' => { - C! { items[len] = s as i8 }; - len += 1; - s = 0; - } - b => s = s * 10 + (b - b'0'), - } - } - C! { items[len] = s as i8 }; - let slice = C! { &items[..len + 1] }; - check(slice) - // (0..items.len()).any(|n| { - // let mut items = items.clone(); - // items.remove(n); - // check2(&items) - // }) - }) - .count() +#[derive(Logos, Debug, PartialEq, Clone)] +#[logos(skip r"[\n\s]+")] +#[allow(dead_code)] +pub enum P1 { + #[regex(r"mul\([0-9]+,[0-9]+\)", |lex| lex.slice().μ(',').array().map(|x| x.as_bytes().iter().filter(|x| x.is_ascii_digit()).fold(0, |acc, x| acc * 10 + (x -b'0') as u32)))] + Mul([u32; 2]), } -#[no_mangle] -fn check_pof(x: &[i8]) -> Result<(), u8> { - if x.len() > 8 { - unsafe { std::hint::unreachable_unchecked() } - } - let state = match unsafe { - x.first_chunk::<2>() - .map(|[a, b]| a.cmp(b)) - .unwrap_unchecked() - } { - std::cmp::Ordering::Equal => return Err(0), - std::cmp::Ordering::Greater => false, - std::cmp::Ordering::Less => true, - }; - // windows at home 😔 - for i in 1..x.len() as u8 - 1 { - let [a, b] = util::nail(&x[i as usize..]); - match state { - true if !(1..=3).contains(&(b - a)) => return Err(i), - false if !(1..=3).contains(&(a - b)) => return Err(i), - _ => (), - } - } - Ok(()) +pub use util::prelude::*; + +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>() + + // i.行() + // .filter(|x| { + // // let x = x.κ::<u64>().collect_vec(); + // }) + // .count() } -#[no_mangle] -pub fn p2(i: &str) -> impl Display { - let mut items = [0; 8]; - i.行() - .filter(|x| { - let mut len = 0; - let mut s = 0; - for &b in *x { - match b { - b' ' => { - C! { items[len] = s as i8 }; - len += 1; - s = 0; - } - b => { - s = s * 10 + (b - b'0'); - } - } - } - C! { items[len] = s as i8 }; - let slice = C! { &items[..len + 1] }; - match check_pof(slice) { - Ok(()) => true, - Err(i) => { - let i = i as usize; - let mut place = [0i8; 7]; - macro_rules! rmv { - ($i:expr, $si: expr) => {{ - place[..$i].copy_from_slice(&slice[..$i]); - let put = &slice[$si..]; - place[$i..$i + put.len()].copy_from_slice(put); - &place[..slice.len() - 1] - }}; - } - check(rmv!(i, i + 1)) // [1, 2, >i<, 4, 5] - || check(rmv!(i + 1, i + 2)) // [1, 2, i, >4<, 5] - || (i > 0 && check(rmv!(i - 1, i))) // [1, >2<, i, 4, 5] - } +pub fn run(i: &str) -> impl Display { + let mut state = true; + P2::lexer(i) + .filter_map(Result::ok) + .map(|x| { + match x { + P2::Mul([a, b]) => return a * b * state as u32, + P2::Do => state = true, + P2::Dont => state = false, } + 0 }) - .count() + .sum::<u32>() + // let re = regex::Regex::new(r"mul\(([0-9]+),([0-9]+)\)|don't\(\)|do\(\)").unwrap(); + // let mut on = true; + // re.captures_iter(i) + // .map(|find| unsafe { + // match find.get(0).unwrap_unchecked().as_str() { + // "don't()" => on = false, + // "do()" => on = true, + // _ if on => { + // return reading::all::<u32>(find.get(1).ψ().as_str().as_bytes()) + // * reading::all::<u32>(find.get(2).ψ().as_str().as_bytes()) + // } + // _ => (), + // }; + // 0 + // }) + // .sum::<u32>() } fn main() { @@ -147,9 +108,9 @@ fn main() { // s.push_str(i); // } // std::fs::write("src/inp.txt", s); - // println!("{}", p1(i)); + println!("{}", p1(i)); println!("{}", run(i)); - println!("{}", p2(i)); + // println!("{}", p2(i)); } #[bench] @@ -159,7 +120,7 @@ fn bench(b: &mut test::Bencher) { } #[bench] -fn p21(b: &mut test::Bencher) { +fn bench2(b: &mut test::Bencher) { let i = boxd(include_str!("inp.txt").trim()); - b.iter(|| p2(i)); + b.iter(|| run(i)); } |