heh
bendn 2024-12-23
parent 1365ad1 · commit 071bbea
-rw-r--r--Cargo.toml1
-rw-r--r--src/main.rs33
-rw-r--r--src/util.rs40
3 files changed, 67 insertions, 7 deletions
diff --git a/Cargo.toml b/Cargo.toml
index a857b58..eac7a73 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,7 +11,6 @@ car = "0.1.1"
# hinted = "0.0.1"
itertools = "0.12.0"
memchr = "2.6.4"
-pathfinding = "4.12.0"
# radsort = "0.1.1"
rustc-hash = { version = "2.1.0", features = ["nightly"] }
[profile.release]
diff --git a/src/main.rs b/src/main.rs
index 678c77d..e54f294 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -50,6 +50,21 @@ fn changes(mut x: u32) -> [(u8, i8); 2001] {
})
}
+#[rustfmt::skip]
+// 8051
+fn next2000(n: u32) -> u32 {
+ let n = n as u64;
+ let m = n | n << 24;
+ let r = (m & 0x61a765) ^ (m >> 1 & 0xc2f82d) ^ (m >> 2 & 0x286d53) ^ (m >> 3 & 0x44f679)
+ ^ (m >> 4 & 0x4d6be8) ^ (m >> 5 & 0x118005) ^ (m >> 6 & 0x5f19f2) ^ (m >> 7 & 0xf03667)
+ ^ (m >> 8 & 0xcea653) ^ (m >> 9 & 0xafa201) ^ (m >> 10 & 0xfd0d29) ^ (m >> 11 & 0x949200)
+ ^ (m >> 12 & 0x49a994) ^ (m >> 13 & 0x21673) ^ (m >> 14 & 0xb4c5bf) ^ (m >> 15 & 0x1e0aaf)
+ ^ (m >> 16 & 0x7cab00) ^ (m >> 17 & 0x95ba48) ^ (m >> 18 & 0x49f04c) ^ (m >> 19 & 0x9a8320)
+ ^ (m >> 20 & 0xb69d39) ^ (m >> 21 & 0x6a2085) ^ (m >> 22 & 0xd13c84) ^ (m >> 23 & 0x1c9e15);
+ r as u32
+
+}
+
#[no_mangle]
pub fn run(x: &str) -> impl Display {
let i = x.as_bytes();
@@ -71,13 +86,27 @@ pub fn run(x: &str) -> impl Display {
map.into_iter().r().max().ψ()
}
+use std::simd::prelude::*;
+#[no_mangle]
+pub fn p1(x: &str) -> impl Display {
+ let mut x = x.as_bytes();
+ let mut i = reading::Integer::<u32>::new(&mut x).array_chunks::<8>();
+ i.by_ref()
+ .map(|x| u32x8::from_array(x.map(next2000)))
+ .fold(u32x8::splat(0), |acc, x| acc + x)
+ .cast::<u64>()
+ .reduce_sum()
+ + i.into_remainder()
+ .map_or(0, |x| x.map(next2000).map(|x| x as u64).sum())
+}
+
fn main() {
let s = include_str!("inp.txt");
- println!("{}", unsafe { run(s) });
+ println!("{}", unsafe { p1(s) });
// dbg!(exec(&program, regi));
}
#[bench]
fn benc(b: &mut test::Bencher) {
let i = boxd(include_str!("inp.txt"));
- b.iter(|| unsafe { run(i) });
+ b.iter(|| unsafe { p1(i) });
}
diff --git a/src/util.rs b/src/util.rs
index 6d4b5d9..bf8b4b4 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -1103,6 +1103,38 @@ pub fn nail<const N: usize, T: Copy>(x: &[T]) -> [T; N] {
}
pub mod reading {
+ pub struct Integer<'a, 'b, T, const BY: u8 = b'\n'> {
+ pub x: &'a mut &'b [u8],
+ pub _ph: std::marker::PhantomData<T>,
+ }
+
+ impl<'a, 'b, T: Copy, const BY: u8> Integer<'a, 'b, T, BY> {
+ pub fn new(x: &'a mut &'b [u8]) -> Self {
+ Self {
+ x,
+ _ph: std::marker::PhantomData,
+ }
+ }
+ }
+ impl<
+ 'a,
+ 'b,
+ const BY: u8,
+ T: Default
+ + std::ops::Mul<T, Output = T>
+ + Add<T, Output = T>
+ + From<u8>
+ + Copy
+ + Ten
+ + Debug,
+ > Iterator for Integer<'a, 'b, T, BY>
+ {
+ type Item = T;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ (!self.x.is_empty()).then(|| read_until(self.x, BY))
+ }
+ }
#[inline]
pub fn 八(n: u64) -> u64 {
// reinterpret as u64 ("92233721" => 92233721)
@@ -1233,20 +1265,20 @@ pub mod reading {
Ok(num)
}
- pub fn 迄または完了<
+ pub fn read_until<
T: Default + std::ops::Mul<T, Output = T> + Add<T, Output = T> + From<u8> + Copy + Ten,
>(
x: &mut &[u8],
until: u8,
) -> T {
- let mut n = T::default();
- while let Ok(x) = x.by() {
+ let mut n = T::from(x.by().ψ() - b'0');
+ loop {
+ let x = x.by().ψ();
if x == until {
return n;
}
n = n * T::ten() + T::from(x - b'0')
}
- n
}
pub fn 負迄(x: &mut &[u8], until: u8) -> i64 {