heh
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/main.rs | 33 | ||||
| -rw-r--r-- | src/util.rs | 40 |
3 files changed, 67 insertions, 7 deletions
@@ -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 { |