heh
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 67 |
1 files changed, 29 insertions, 38 deletions
diff --git a/src/main.rs b/src/main.rs index fbd910c..66d5dd7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,14 +13,13 @@ iter_partition_in_place, slice_swap_unchecked, generic_const_exprs, + ptr_sub_ptr, iter_array_chunks, + slice_from_ptr_range, if_let_guard, - const_mut_refs, - get_many_mut, maybe_uninit_uninit_array, once_cell_get_mut, iter_collect_into, - hint_assert_unchecked, let_chains, anonymous_lifetime_in_impl_trait, array_windows, @@ -32,55 +31,47 @@ slice_as_chunks, array_chunks, slice_split_once, + import_trait_associated_functions, core_intrinsics )] extern crate test; pub mod util; -use std::simd::prelude::*; - +use atools::prelude::*; +use atools::ArrayTools::sort; pub use util::prelude::*; #[no_mangle] pub unsafe fn p1(x: &str) -> impl Display { - let i = x.as_bytes().as_ptr(); - static mut keys: [u32; 256] = [u32::MAX; 256]; - let mut ki = 0; - static mut locks: [u32; 250] = [u32::MAX; 250]; - let mut li = 0; - for j in 0..500 { - let acc = i - .add(j * (7 * 6 + 1) + 3) - .cast::<u8x32>() - .read_unaligned() - .simd_eq(Simd::splat(b'#')) - .to_bitmask() as u32; - if acc & 1 == 0 { - C! { keys[ki] = acc }; - ki += 1; - } else { - C! { locks[li] = acc }; - li += 1; - } - } - let mut sum = i32x8::splat(0); - for &lock in &locks { - for &k in keys.as_chunks_unchecked::<8>() { - sum += (u32x8::splat(lock) & u32x8::from_array(k)) - .simd_eq(Simd::splat(0)) - .to_int(); - } - } - -sum.reduce_sum() as u32 + x.行() + .map(|x| x.κ::<u16>().carr::<3>()) + .filter(|tri| (2 * tri.iter().max().unwrap()) < tri.sum()) + .count() } -fn main() { - let s = include_str!("inp.txt"); - println!("{}", unsafe { p1(s) }); +#[no_mangle] +pub unsafe fn p2(x: &str) -> impl Display { + x.行() + .map(|x| x.κ::<u16>().carr::<3>()) + .array_chunks::<3>() + .map(|x| mattr::transposed::<_, 3, 3>(x.flatten()).chunked::<3>()) + .flatten() + .map(sort) + .filter(|&[a, b, c]| a + b > c) + .count() +} - // dbg!(exec(&program, regi)); +fn main() { + unsafe { println!("{}", p2(include_str!("inp.txt"))) }; } + #[bench] fn benc(b: &mut test::Bencher) { let i = boxd(include_str!("inp.txt")); b.iter(|| unsafe { p1(i) }); } + +#[bench] +fn benc_sort(b: &mut test::Bencher) { + let i = boxd(include_str!("inp.txt")); + b.iter(|| unsafe { p2(i) }); +} |