11use core:: str;
2+ use std:: hint:: unreachable_unchecked;
23
34use aoc_runner_derive:: aoc;
45
@@ -13,43 +14,39 @@ use aoc_runner_derive::aoc;
1314
1415#[ aoc( day17, part1) ]
1516pub fn part1 ( s : & str ) -> & ' static str {
16- #[ expect( unused_unsafe) ]
17- unsafe {
18- inner_part1 ( s. as_bytes ( ) )
19- }
17+ unsafe { inner_part1 ( s. as_bytes ( ) ) }
2018}
2119
2220static mut RESULT : [ u8 ; 128 ] = [ 0 ; 128 ] ;
2321
24- // #[target_feature(enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt")]
25- fn inner_part1 ( s : & [ u8 ] ) -> & ' static str {
22+ #[ target_feature( enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt" ) ]
23+ unsafe fn inner_part1 ( s : & [ u8 ] ) -> & ' static str {
2624 let mut i = 13 ;
27- let mut a = ( s [ 12 ] - b'0' ) as u64 ;
28- while s [ i ] != b'\n' {
25+ let mut a = ( * s . get_unchecked ( 12 ) - b'0' ) as u64 ;
26+ while * s . get_unchecked ( i ) != b'\n' {
2927 a *= 10 ;
30- a += ( s [ i ] - b'0' ) as u64 ;
28+ a += ( * s . get_unchecked ( i ) - b'0' ) as u64 ;
3129 i += 1 ;
3230 }
31+ i += 39 ;
3332
34- let i = memchr:: memchr ( b',' , s) . unwrap ( ) - 1 ;
35-
36- let x = ( s[ i + 6 ] - b'0' ) as u64 ;
33+ let x = ( * s. get_unchecked ( i + 6 ) - b'0' ) as u64 ;
3734
38- let o1 = s [ i + 12 ] ;
39- let o2 = s [ i + 16 ] ;
40- let o3 = s [ i + 20 ] ;
41- let o4 = s [ i + 24 ] ;
35+ let o1 = * s . get_unchecked ( i + 12 ) ;
36+ let o2 = * s . get_unchecked ( i + 16 ) ;
37+ let o3 = * s . get_unchecked ( i + 20 ) ;
38+ let o4 = * s . get_unchecked ( i + 24 ) ;
4239
4340 let y = match ( o1, o2, o3, o4) {
44- ( b'1' , b'4' , b'0' , b'5' ) => s [ i + 14 ] - b'0' ,
45- ( b'1' , b'4' , b'5' , b'0' ) => s [ i + 14 ] - b'0' ,
46- ( b'1' , b'0' , b'4' , b'5' ) => s [ i + 14 ] - b'0' ,
47- ( b'0' , b'1' , b'4' , b'5' ) => s [ i + 18 ] - b'0' ,
48- ( b'4 ' , b'1 ' , b'0 ' , b'5' ) => s [ i + 18 ] - b'0' ,
49- ( b'4' , b'1' , b'5 ' , b'0 ' ) => s [ i + 18 ] - b'0' ,
50- ( b'0 ' , b'4 ' , b'1 ' , b'5 ' ) => s [ i + 22 ] - b'0' ,
51- ( b'4' , b'0' , b'1' , b'5' ) => s [ i + 22 ] - b'0' ,
52- _ => unreachable ! ( ) ,
41+ ( b'1' , b'4' , b'0' , b'5' ) => * s . get_unchecked ( i + 14 ) - b'0' ,
42+ ( b'1' , b'4' , b'5' , b'0' ) => * s . get_unchecked ( i + 14 ) - b'0' ,
43+ ( b'1' , b'0' , b'4' , b'5' ) => * s . get_unchecked ( i + 14 ) - b'0' ,
44+ ( b'0' , b'1' , b'4' , b'5' ) => * s . get_unchecked ( i + 18 ) - b'0' ,
45+ ( b'0 ' , b'4 ' , b'1 ' , b'5' ) => * s . get_unchecked ( i + 22 ) - b'0' ,
46+ ( b'4' , b'1' , b'0 ' , b'5 ' ) => * s . get_unchecked ( i + 18 ) - b'0' ,
47+ ( b'4 ' , b'1 ' , b'5 ' , b'0 ' ) => * s . get_unchecked ( i + 18 ) - b'0' ,
48+ ( b'4' , b'0' , b'1' , b'5' ) => * s . get_unchecked ( i + 22 ) - b'0' ,
49+ _ => unreachable_unchecked ( ) ,
5350 } as u64 ;
5451
5552 let result_ptr = ( & raw mut RESULT ) . cast :: < u8 > ( ) ;
@@ -148,65 +145,66 @@ static LUT: [u64; 8 * 8 * 8 * 8] = const {
148145
149146#[ aoc( day17, part2) ]
150147pub fn part2 ( s : & str ) -> u64 {
151- #[ expect( unused_unsafe) ]
152- unsafe {
153- inner_part2 ( s. as_bytes ( ) )
154- }
148+ unsafe { inner_part2 ( s. as_bytes ( ) ) }
155149}
156150
157- // #[target_feature(enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt")]
158- fn inner_part2 ( s : & [ u8 ] ) -> u64 {
159- let i = memchr:: memchr ( b',' , s) . unwrap ( ) - 1 ;
151+ #[ target_feature( enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt" ) ]
152+ unsafe fn inner_part2 ( s : & [ u8 ] ) -> u64 {
153+ let mut i = 13 ;
154+ while * s. get_unchecked ( i) != b'\n' {
155+ i += 1 ;
156+ }
157+ i += 39 ;
160158
161- let x = ( s [ i + 6 ] - b'0' ) as usize ;
159+ let x = ( * s . get_unchecked ( i + 6 ) - b'0' ) as usize ;
162160
163- let o1 = s [ i + 12 ] ;
164- let o2 = s [ i + 16 ] ;
165- let o3 = s [ i + 20 ] ;
166- let o4 = s [ i + 24 ] ;
161+ let o1 = * s . get_unchecked ( i + 12 ) ;
162+ let o2 = * s . get_unchecked ( i + 16 ) ;
163+ let o3 = * s . get_unchecked ( i + 20 ) ;
164+ let o4 = * s . get_unchecked ( i + 24 ) ;
167165
168166 let a = match ( o1, o2, o3, o4) {
169167 ( b'1' , b'4' , b'0' , b'5' ) => {
170- let y = ( s [ i + 14 ] - b'0' ) as usize ;
171- let z = ( s [ i + 18 ] - b'0' ) as usize ;
172- LUT [ x * 512 + y * 64 + z * 8 + 0 ]
168+ let y = ( * s . get_unchecked ( i + 14 ) - b'0' ) as usize ;
169+ let z = ( * s . get_unchecked ( i + 18 ) - b'0' ) as usize ;
170+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 0 )
173171 }
174172 ( b'1' , b'4' , b'5' , b'0' ) => {
175- let y = ( s [ i + 14 ] - b'0' ) as usize ;
176- let z = ( s [ i + 18 ] - b'0' ) as usize ;
177- LUT [ x * 512 + y * 64 + z * 8 + 1 ]
173+ let y = ( * s . get_unchecked ( i + 14 ) - b'0' ) as usize ;
174+ let z = ( * s . get_unchecked ( i + 18 ) - b'0' ) as usize ;
175+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 1 )
178176 }
179177 ( b'1' , b'0' , b'4' , b'5' ) => {
180- let y = ( s [ i + 14 ] - b'0' ) as usize ;
181- let z = ( s [ i + 22 ] - b'0' ) as usize ;
182- LUT [ x * 512 + y * 64 + z * 8 + 2 ]
178+ let y = ( * s . get_unchecked ( i + 14 ) - b'0' ) as usize ;
179+ let z = ( * s . get_unchecked ( i + 22 ) - b'0' ) as usize ;
180+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 2 )
183181 }
184182 ( b'0' , b'1' , b'4' , b'5' ) => {
185- let y = ( s [ i + 18 ] - b'0' ) as usize ;
186- let z = ( s [ i + 22 ] - b'0' ) as usize ;
187- LUT [ x * 512 + y * 64 + z * 8 + 3 ]
183+ let y = ( * s . get_unchecked ( i + 18 ) - b'0' ) as usize ;
184+ let z = ( * s . get_unchecked ( i + 22 ) - b'0' ) as usize ;
185+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 3 )
188186 }
189187 ( b'0' , b'4' , b'1' , b'5' ) => {
190- let y = ( s [ i + 22 ] - b'0' ) as usize ;
191- let z = ( s [ i + 18 ] - b'0' ) as usize ;
192- LUT [ x * 512 + y * 64 + z * 8 + 4 ]
188+ let y = ( * s . get_unchecked ( i + 22 ) - b'0' ) as usize ;
189+ let z = ( * s . get_unchecked ( i + 18 ) - b'0' ) as usize ;
190+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 4 )
193191 }
194192 ( b'4' , b'1' , b'0' , b'5' ) => {
195- let y = ( s [ i + 18 ] - b'0' ) as usize ;
196- let z = ( s [ i + 14 ] - b'0' ) as usize ;
197- LUT [ x * 512 + y * 64 + z * 8 + 5 ]
193+ let y = ( * s . get_unchecked ( i + 18 ) - b'0' ) as usize ;
194+ let z = ( * s . get_unchecked ( i + 14 ) - b'0' ) as usize ;
195+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 5 )
198196 }
199197 ( b'4' , b'1' , b'5' , b'0' ) => {
200- let y = ( s [ i + 18 ] - b'0' ) as usize ;
201- let z = ( s [ i + 14 ] - b'0' ) as usize ;
202- LUT [ x * 512 + y * 64 + z * 8 + 6 ]
198+ let y = ( * s . get_unchecked ( i + 18 ) - b'0' ) as usize ;
199+ let z = ( * s . get_unchecked ( i + 14 ) - b'0' ) as usize ;
200+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 6 )
203201 }
204202 ( b'4' , b'0' , b'1' , b'5' ) => {
205- let y = ( s [ i + 22 ] - b'0' ) as usize ;
206- let z = ( s [ i + 14 ] - b'0' ) as usize ;
207- LUT [ x * 512 + y * 64 + z * 8 + 7 ]
203+ let y = ( * s . get_unchecked ( i + 22 ) - b'0' ) as usize ;
204+ let z = ( * s . get_unchecked ( i + 14 ) - b'0' ) as usize ;
205+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 7 )
208206 }
209- _ => unreachable ! ( ) ,
207+ _ => unreachable_unchecked ( ) ,
210208 } ;
211209 a
212210}
0 commit comments