@@ -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\n 10\n 100\n 2024" , part1: 37327623 } ,
6375 { input: "1\n 2\n 3\n 2024" , part2: 23 } ,
6476] ) ;
0 commit comments