Skip to content

Commit e5729c4

Browse files
committed
Optimize 2024 day 22
1 parent 435bc00 commit e5729c4

File tree

1 file changed

+29
-17
lines changed

1 file changed

+29
-17
lines changed

crates/year2024/src/day22.rs

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,39 +26,51 @@ impl Day22 {
2626
}
2727

2828
#[must_use]
29-
pub fn part2(&self) -> u32 {
29+
pub fn part2(&self) -> u16 {
3030
let mut bananas = [0; 130321]; // 19 ** 4
3131
let mut seen = [0; 130321];
3232
for (i, &(mut n)) in self.input.iter().enumerate() {
33-
let mut index = 0;
34-
let mut last_digit = n % 10;
35-
for j in 0..2000 {
36-
let next = Self::next(n);
37-
let digit = next % 10;
33+
let mut prev = n % 10;
34+
let mut s4;
3835

39-
index = (9 + digit - last_digit) as usize + ((index % 6859) * 19);
40-
if j >= 3 && seen[index] < i + 1 {
41-
bananas[index] += next % 10;
42-
seen[index] = i + 1;
36+
n = Self::next(n);
37+
let mut s3 = ((9 + n % 10 - prev) as usize) * 19 * 19;
38+
prev = n % 10;
39+
40+
n = Self::next(n);
41+
let mut s2 = ((9 + n % 10 - prev) as usize) * 19;
42+
prev = n % 10;
43+
44+
n = Self::next(n);
45+
let mut s1 = (9 + n % 10 - prev) as usize;
46+
prev = n % 10;
47+
48+
for _ in 3..2000 {
49+
n = Self::next(n);
50+
let digit = n % 10;
51+
(s1, s2, s3, s4) = ((9 + digit - prev) as usize, 19 * s1, 19 * s2, 19 * s3);
52+
53+
let index = s4 + s3 + s2 + s1;
54+
if seen[index] != (i + 1) as u16 {
55+
bananas[index] += digit as u16;
56+
seen[index] = (i + 1) as u16;
4357
}
4458

45-
n = next;
46-
last_digit = digit;
59+
prev = digit;
4760
}
4861
}
4962
bananas.iter().max().copied().unwrap()
5063
}
5164

5265
#[inline(always)]
5366
fn next(mut n: u32) -> u32 {
54-
n = (n ^ (n << 6)) % 0x1000000;
55-
n = (n ^ (n >> 5)) % 0x1000000;
56-
n = (n ^ (n << 11)) % 0x1000000;
57-
n
67+
n = (n ^ (n << 6)) & 0xFFFFFF;
68+
n = (n ^ (n >> 5)) & 0xFFFFFF;
69+
(n ^ (n << 11)) & 0xFFFFFF
5870
}
5971
}
6072

61-
examples!(Day22 -> (u64, u32) [
73+
examples!(Day22 -> (u64, u16) [
6274
{input: "1\n10\n100\n2024", part1: 37327623},
6375
{input: "1\n2\n3\n2024", part2: 23},
6476
]);

0 commit comments

Comments
 (0)