heh
gooder
bendn 2024-12-04
parent d4d58fb · commit e52c997
-rw-r--r--Cargo.toml2
-rw-r--r--bruh.rs45
-rw-r--r--src/main.rs101
-rw-r--r--src/util.rs2
4 files changed, 54 insertions, 96 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 2ef72f6..c94db9a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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, Ͷ, Α, Κ, Λ, Μ,