Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs56
1 files changed, 33 insertions, 23 deletions
diff --git a/src/lib.rs b/src/lib.rs
index f7b7574..326e1b6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -26,20 +26,22 @@
mod util;
pub mod day1 {
use crate::util::prelude::*;
- pub fn part1(input: &str) -> impl std::fmt::Display {
+
+ pub fn part1(i: &str) -> impl Display {
static mut a: [u32; 1000] = [0; 1000];
static mut b: [u32; 1000] = [0; 1000];
- input
- .行()
- .map(crate::util::nail::<{ 5 + 5 + 3 }>)
- .map(|x| (reading::all(&x[0..5]), reading::all(&x[8..13])))
- .enumerate()
- .for_each(|(i, (x, y))| {
- C! { a[i] = x };
- C! { b[i] = y };
- });
unsafe {
+ i.as_bytes()
+ .as_chunks_unchecked::<14>()
+ .into_iter()
+ .map(|x| (reading::all(&x[0..5]), reading::all(&x[8..13])))
+ .enumerate()
+ .for_each(|(i, (x, y))| {
+ *a.get_unchecked_mut(i) = x;
+ *b.get_unchecked_mut(i) = y;
+ });
+
a.sort_unstable();
b.sort_unstable();
a.iter()
@@ -52,21 +54,29 @@ pub mod day1 {
pub fn part2(i: &str) -> impl Display {
static mut a: [u32; 1000] = [0; 1000];
- let mut map = HashMap::<u32, u32>::with_capacity_and_hasher(
- 1000,
- rustc_hash::FxBuildHasher::default(),
- );
- i.行()
- .map(crate::util::nail::<{ 5 + 5 + 3 }>)
- .map(|x| (reading::all(&x[0..5]), reading::all(&x[8..13])))
- .enumerate()
- .for_each(|(i, (x, y))| {
- C! { a[i] = x };
- map.entry(y).and_modify(|x| *x += 1).or_insert(1);
- });
+ static mut map: [u32; 100000] = [0; 100000];
+ let i = i.as_bytes();
+
unsafe {
+ let x = C! { &i[..14] };
+ let (x, y) = (reading::all(&x[0..5]), reading::all::<u32>(&x[8..13]));
+ *a.get_unchecked_mut(0) = x;
+ *map.get_unchecked_mut(y as usize) += 1;
+
+ for n in 1..1000 {
+ let x = crate::util::reading::八(
+ u64::from_le_bytes(crate::util::nail::<8>(&i[n * 14 - 3..]))
+ & 0xffffffffff000000,
+ );
+ let y = crate::util::reading::八(u64::from_le_bytes(crate::util::nail::<8>(
+ &i[n * 14 + 5..],
+ )));
+ *a.get_unchecked_mut(n) = x as u32;
+ *map.get_unchecked_mut(y as usize) += 1;
+ }
a.iter()
- .map(|x| x * map.get(x).copied().unwrap_or(0))
+ .copied()
+ .map(|x| x * map.get_unchecked(x as usize))
.sum::<u32>()
}
}