heh
gooder
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | bruh.rs | 45 | ||||
| -rw-r--r-- | src/main.rs | 101 | ||||
| -rw-r--r-- | src/util.rs | 2 |
4 files changed, 54 insertions, 96 deletions
@@ -9,9 +9,7 @@ edition = "2021" atools = "0.1.5" # hinted = "0.0.1" itertools = "0.12.0" -logos = "0.14.3" memchr = "2.6.4" -regex = "1.11.1" # radsort = "0.1.1" rustc-hash = { version = "2.1.0", features = ["nightly"] } [profile.release] diff --git a/bruh.rs b/bruh.rs deleted file mode 100644 index c844a77..0000000 --- a/bruh.rs +++ /dev/null @@ -1,45 +0,0 @@ -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 run(i: &str) -> u32 { - let mut i = i.as_bytes(); - let mut sum = 0; - while let Some(idx) = memchr::memchr(b'm', i) { - i = unsafe { &i.get_unchecked(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), - } - - }; - } - 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 -} diff --git a/src/main.rs b/src/main.rs index 68482cb..6bde11c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,27 +27,6 @@ extern crate test; pub mod util; use atools::prelude::*; -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]), -} - -#[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]), -} - pub use util::prelude::*; fn manual_n<const N: usize>(n: [&u8; N]) -> u32 { @@ -98,34 +77,60 @@ pub fn p1(i: &str) -> impl Display { } 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, + let mut i = i.as_bytes(); + let mut sum = 0; + let mut on = 1; + while let Some(idx) = memchr::memchr2(b'm', b'd', 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),+]) * on, rest) + } + )+ + _ => (0, i), + } + + }; } - 0 - }) - .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>() + 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; + } + _ => mat! { on { + 0 => match i { + [b'o', b'(', rest @ ..] => { + on = 1; + i = rest; + } + _ => {} + }, + 1 => match i { + [b'o', b'n', rest @ ..] => { + on = 0; + i =rest; + }, + _ => {}, + }, + }}, + } + } + + sum } fn main() { diff --git a/src/util.rs b/src/util.rs index 63b6e2d..3b8a80b 100644 --- a/src/util.rs +++ b/src/util.rs @@ -16,7 +16,7 @@ pub mod prelude { #[allow(unused_imports)] pub(crate) use super::{bits, dang, leek, mat, shucks, C}; pub use super::{ - even, gcd, gt, l, lcm, lt, pa, r, rand, reading, reading::Ext, sort, Dir, FilterBy, + even, gcd, gt, l, lcm, lt, nail, pa, r, rand, reading, reading::Ext, sort, Dir, FilterBy, FilterBy3, GreekTools, IntoCombinations, IntoLines, IterͶ, NumTupleIterTools, ParseIter, Printable, Skip, TakeLine, TupleIterTools2, TupleIterTools2R, TupleIterTools3, TupleUtils, UnifiedTupleUtils, UnsoundUtilities, Widen, Ͷ, Α, Κ, Λ, Μ, |