heh
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/src/main.rs b/src/main.rs index b2aa746..9a24313 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,9 +7,11 @@ static_mut_refs, incomplete_features, unused_imports, + unsafe_op_in_unsafe_fn, redundant_semicolons )] #![feature( + slice_as_array, stdarch_x86_avx512, impl_trait_in_bindings, iter_partition_in_place, @@ -39,26 +41,47 @@ pub mod util; use atools::prelude::*; use lower::apply; +use md5::Digest; use memchr::memmem; use regex::bytes::Regex; -use std::simd::prelude::*; +use std::{cmp::Reverse, simd::prelude::*}; pub use util::prelude::*; #[allow(warnings)] type u32x3 = Simd<u32, 3>; -#[no_mangle] -pub fn p1(x: &'static str) -> impl Display { - let (ro, co) = (2947u64, 3029u64); - // count diagonals - let point = (0..ro + co - 1).sum::<u64>() + co; - infinite_successors(20151125u64, |x| (x * 252533).rem_euclid(33554393)) - .nth(point as usize - 1) - .unwrap() +fn md5(x: &[u8]) -> [u8; 16] { + let mut hasher = md5::Md5::new(); + hasher.update(x); + *hasher.finalize().as_array::<16>().unwrap() +} + +#[unsafe(no_mangle)] +pub fn p1(_: &'static str) -> impl Display { + (0..) + .map(|n| md5(&format!("ojvtpuvg{n}").as_bytes())) + .filter(|&[a, b, c, ..]| a == 0 && b == 0 && c >> 4 == 0) + .map(|[_, _, x, ..]| b"0123456789abcdef"[(x & 0x0f).nat()] as char) + .take(8) + .collect::<String>() +} + +#[unsafe(no_mangle)] +pub fn p2(_: &'static str) -> impl Display { + let mut o = [0; 8]; + for [a, b, c, d, ..] in (0..).map(|n| md5(&format!("ojvtpuvg{n}").as_bytes())) { + if a == 0 && b == 0 && c >> 4 == 0 && o.get((c & 0x0f) as usize) == Some(&0) { + o[(c & 0x0f).nat()] = b"0123456789abcdef"[(d >> 4).nat()] + } + if o.iter().all(|x| *x != 0) { + break; + } + } + o.str().to_owned() } fn main() { - unsafe { println!("{}", p1(include_str!("inp.txt"))) }; + unsafe { println!("{}", p2(include_str!("inp.txt"))) }; } #[bench] |