heh
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs67
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) });
+}