heh
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs139
1 files changed, 44 insertions, 95 deletions
diff --git a/src/main.rs b/src/main.rs
index ebea405..17c30a3 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,5 +1,6 @@
#![allow(confusable_idents, uncommon_codepoints, mixed_script_confusables)]
#![feature(
+ inline_const,
slice_flatten,
iter_collect_into,
let_chains,
@@ -15,112 +16,60 @@
)]
extern crate test;
pub mod util;
-
+use arrayvec::ArrayVec;
pub use util::prelude::*;
-pub fn p1(i: &str) -> usize {
- let mut mat = Vec::with_capacity(100);
- let mut i = i.as_bytes();
- for _ in 0..100 {
- mat.push(unsafe { <&[u8; 100]>::try_from(i.get_unchecked(..100)).unwrap() });
- i = unsafe { i.get_unchecked(100..) };
- if i.len() != 0 {
- i = unsafe { i.get_unchecked(1..) };
- }
- }
- let mut rows = [0u8; 100];
- for j in 0..100 {
- let mut count = 0;
- for i in 0..100 {
- if *unsafe { mat.get_unchecked(i).get_unchecked(j) } == b'O' {
- *unsafe { rows.get_unchecked_mut(count) } += 1;
- count += 1;
- } else if mat[i][j] == b'#' {
- count = i + 1;
- }
- }
- }
- rows.iter()
- .ι::<usize>()
- .map(|(&x, i)| (x.nat()) * (100 - i))
- .sum::<usize>()
+pub fn hash(s: impl AsRef<[u8]>) -> u8 {
+ s.as_ref()
+ .iter()
+ .fold(0u8, |acc, &x| acc.wrapping_add(x).wrapping_mul(17))
}
-fn pushhhh(mat: &mut Vec<[u8; 100]>) {
- for j in 0..100 {
- let mut count = 0;
- for i in 0..100 {
- let curr = C! { mat[i][j] };
- mat!(curr {
- b'O' => {
- C! { mat[i][j] = mat[count][j] };
- C! { mat[count][j] = curr };
- count += 1;
- },
- b'#' => count = i + 1,
- b'.' => {},
- });
+pub fn p2(i: &str) -> u32 {
+ let mut 品 = [const { ArrayVec::<_, 10>::new_const() }; 256];
+ for i in i.as_bytes().split(|&b| b == b',') {
+ match i.split_once(|&b| b == b'=').map(|x| x.mr(|x| x[0] - b'0')) {
+ None => {
+ let ι = &i[..i.len() - 1];
+ let h = hash(ι);
+ let β = &mut 品[h.nat()];
+ β.retain(|(α, _)| *α != ι);
+ }
+ Some((ι, κ)) => {
+ let h = hash(ι);
+ let bx = &mut 品[h.nat()];
+ if let Some((_, σ)) = bx.iter_mut().find(|(α, _)| *α == ι) {
+ *σ = κ;
+ } else {
+ unsafe { bx.push_unchecked((ι, κ)) };
+ }
+ }
}
}
+ 品.into_iter()
+ .ι1::<u32>()
+ .map(|(bx, i)| {
+ bx.iter()
+ .ι1::<u32>()
+ .map(|(&(_, x), j)| x as u32 * j)
+ .sum::<u32>()
+ * i
+ })
+ .sum::<u32>()
}
#[no_mangle]
-pub fn run(i: &str) -> impl Display {
- p2(i)
+pub fn p1(i: &str) -> impl Display {
+ i.as_bytes()
+ .split(|&x| x == b',')
+ .take(4000)
+ .inspect(|x| shucks!(if x.len() > 8))
+ .map(|x| hash(x) as u32)
+ .sum::<u32>()
}
-fn weigh(mat: &[[u8; 100]]) -> u32 {
- mat.iter()
- .ι::<usize>()
- .map(|(row, i)| (util::count::<100>(&row, b'O') * (100 - i)) as u32)
- .sum()
-}
-
-pub fn h(data: &[u8; 10000]) -> u16 {
- let mut buffer = 509;
- let mut data = &data[..];
- while data.len() > 16 {
- let (value, rest) = data.split_at(16);
- let [a, b]: [u64; 2] = unsafe { rint(<[u8; 16]>::try_from(value).unwrap()) };
- buffer ^= a.wrapping_mul(b) ^ a;
- data = rest;
- }
- (buffer ^ buffer.swap_bytes()) as u16
-}
-
-fn hash(x: &[[u8; 100]]) -> u16 {
- h(&unsafe { *x.as_ptr().cast() })
-}
-
-pub fn p2(i: &str) -> impl Display {
- let mut mat = Vec::with_capacity(100);
- let mut i = i.as_bytes();
- for _ in 0..100 {
- mat.push(unsafe { <[u8; 100]>::try_from(i.get_unchecked(..100)).unwrap() });
- i = unsafe { i.get_unchecked(100..) };
- if i.len() != 0 {
- i = unsafe { i.get_unchecked(1..) };
- }
- }
- let mut map = vec![(hash(&mat), weigh(&mat))];
- loop {
- for _ in 0..4 {
- pushhhh(&mut mat);
- let mut new = vec![[0; 100]; 100];
- for row in 0..100 {
- for col in 0..100 {
- C! { new[col][99 - row] = mat[row][col] };
- }
- }
- mat = new;
- }
- let c = hash(&mat);
- if let Some(y) = map.iter().position(|&(x, _)| x == c) {
- let c = map.len() - y;
- return C! { map[y + (1e9 as usize - y) % c] }.1;
- }
- map.push((c, weigh(&mat)));
- }
+pub fn run(i: &str) -> impl Display {
+ p1(i)
}
fn main() {