11use core:: str;
22
33use aoc_runner_derive:: aoc;
4- use bitvec:: array:: BitArray ;
54
65const MAX : u32 = 16777216 ;
76
@@ -51,18 +50,19 @@ pub fn part1(s: &str) -> u64 {
5150 sum
5251}
5352
54- const SEQUENCES : usize = 18 << 15 | 18 << 10 | 18 << 5 | 18 ;
53+ const SEQUENCES : usize = 18 * 18 * 18 * 18 ;
5554
5655#[ aoc( day22, part2) ]
5756pub fn part2 ( s : & str ) -> i16 {
5857 let s = s. as_bytes ( ) ;
5958
6059 let mut sequences = [ 0 ; SEQUENCES ] ;
61- let mut done = BitArray :: < [ usize ; SEQUENCES . div_ceil ( usize :: BITS as usize ) ] > :: default ( ) ;
60+ let mut done = [ 0u16 ; SEQUENCES ] ;
6261
6362 let mut current_best = 0 ;
6463
6564 let mut i = 0 ;
65+ let mut monky = 1 ;
6666 unsafe {
6767 while i < s. len ( ) {
6868 #[ cfg( not( test) ) ]
@@ -95,7 +95,7 @@ pub fn part2(s: &str) -> i16 {
9595 sn = ( ( sn as u64 * 2048 ) % MAX as u64 ) as u32 ^ sn;
9696 let price = sn % 10 ;
9797 let diff = price + 9 - prev;
98- diffs = ( diffs << 5 ) | diff;
98+ diffs = diffs * 18 + diff;
9999
100100 prev = price;
101101 }
@@ -106,19 +106,20 @@ pub fn part2(s: &str) -> i16 {
106106 sn = ( ( sn as u64 * 2048 ) % MAX as u64 ) as u32 ^ sn;
107107 let price = sn % 10 ;
108108 let diff = price + 9 - prev;
109- diffs = ( ( diffs << 5 ) | diff) & 0xFFFFF ;
109+ diffs = ( diffs * 18 + diff) % SEQUENCES as u32 ;
110110
111- if ! done[ diffs as usize ] {
111+ if done[ diffs as usize ] != monky {
112112 sequences[ diffs as usize ] += price as i16 ;
113113 if current_best < sequences[ diffs as usize ] {
114114 current_best = sequences[ diffs as usize ] ;
115115 }
116- done. set ( diffs as usize , true ) ;
116+
117+ done[ diffs as usize ] = monky;
117118 }
118119
119120 prev = price;
120121 }
121- done . fill ( false ) ;
122+ monky += 1 ;
122123 }
123124 }
124125
0 commit comments