@@ -12,64 +12,60 @@ use aoc_runner_derive::aoc;
1212// 5 5: out out b
1313// 3 0: jnz a!=0 -> 0
1414
15- #[ aoc( day17, part1) ]
16- pub fn part1 ( s : & str ) -> & ' static str {
17- unsafe { inner_part1 ( s. as_bytes ( ) ) }
18- }
19-
2015static mut RESULT : [ u8 ; 128 ] = [ 0 ; 128 ] ;
2116
22- #[ target_feature( enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt" ) ]
23- unsafe fn inner_part1 ( s : & [ u8 ] ) -> & ' static str {
24- let mut i = 13 ;
25- let mut a = ( * s. get_unchecked ( 12 ) - b'0' ) as u64 ;
26- while * s. get_unchecked ( i) != b'\n' {
27- a *= 10 ;
28- a += ( * s. get_unchecked ( i) - b'0' ) as u64 ;
29- i += 1 ;
30- }
31- i += 39 ;
32-
33- let x = ( * s. get_unchecked ( i + 6 ) - b'0' ) as u64 ;
34-
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 ) ;
39-
40- let y = match ( o1, o2, o3, o4) {
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 ( ) ,
50- } as u64 ;
51-
52- let result_ptr = ( & raw mut RESULT ) . cast :: < u8 > ( ) ;
53- let mut out_ptr = result_ptr;
54- let result_ptr = result_ptr. cast_const ( ) ;
55-
56- while a != 0 {
57- let b = a % 8 ;
58- let b = b ^ x;
59- let c = a >> b;
60- let b = b ^ y ^ c;
17+ #[ aoc( day17, part1) ]
18+ pub fn part1 ( s : & str ) -> & ' static str {
19+ unsafe {
20+ let s = s. as_bytes ( ) ;
21+ let mut i = 13 ;
22+ let mut a = ( * s. get_unchecked ( 12 ) - b'0' ) as u64 ;
23+ while * s. get_unchecked ( i) != b'\n' {
24+ a *= 10 ;
25+ a += ( * s. get_unchecked ( i) - b'0' ) as u64 ;
26+ i += 1 ;
27+ }
28+ i += 39 ;
29+
30+ let x = ( * s. get_unchecked ( i + 6 ) - b'0' ) as u64 ;
31+
32+ let o1 = * s. get_unchecked ( i + 12 ) ;
33+ let o2 = * s. get_unchecked ( i + 16 ) ;
34+ let o3 = * s. get_unchecked ( i + 20 ) ;
35+ let o4 = * s. get_unchecked ( i + 24 ) ;
36+
37+ let y = match ( o1, o2, o3, o4) {
38+ ( b'1' , b'4' , b'0' , b'5' ) => * s. get_unchecked ( i + 14 ) - b'0' ,
39+ ( b'1' , b'4' , b'5' , b'0' ) => * s. get_unchecked ( i + 14 ) - b'0' ,
40+ ( b'1' , b'0' , b'4' , b'5' ) => * s. get_unchecked ( i + 14 ) - b'0' ,
41+ ( b'0' , b'1' , b'4' , b'5' ) => * s. get_unchecked ( i + 18 ) - b'0' ,
42+ ( b'0' , b'4' , b'1' , b'5' ) => * s. get_unchecked ( i + 22 ) - b'0' ,
43+ ( b'4' , b'1' , b'0' , b'5' ) => * s. get_unchecked ( i + 18 ) - b'0' ,
44+ ( b'4' , b'1' , b'5' , b'0' ) => * s. get_unchecked ( i + 18 ) - b'0' ,
45+ ( b'4' , b'0' , b'1' , b'5' ) => * s. get_unchecked ( i + 22 ) - b'0' ,
46+ _ => unreachable_unchecked ( ) ,
47+ } as u64 ;
48+
49+ let result_ptr = ( & raw mut RESULT ) . cast :: < u8 > ( ) ;
50+ let mut out_ptr = result_ptr;
51+ let result_ptr = result_ptr. cast_const ( ) ;
52+
53+ while a != 0 {
54+ let b = a % 8 ;
55+ let b = b ^ x;
56+ let c = a >> b;
57+ let b = b ^ y ^ c;
6158
62- unsafe {
6359 out_ptr. write ( ( b % 8 ) as u8 + b'0' ) ;
6460 out_ptr. offset ( 1 ) . write ( b',' ) ;
6561 out_ptr = out_ptr. offset ( 2 ) ;
62+ a = a / 8 ;
6663 }
67- a = a / 8 ;
68- }
6964
70- let out_len = unsafe { out_ptr. offset_from ( result_ptr) } ;
65+ let out_len = out_ptr. offset_from ( result_ptr) ;
7166
72- unsafe { str:: from_utf8_unchecked ( & RESULT [ ..( out_len - 1 ) as usize ] ) }
67+ str:: from_utf8_unchecked ( & RESULT [ ..( out_len - 1 ) as usize ] )
68+ }
7369}
7470
7571const fn find_a_r ( p : & [ u64 ] , x : u64 , y : u64 , pa : u64 ) -> Option < u64 > {
@@ -145,66 +141,65 @@ static LUT: [u64; 8 * 8 * 8 * 8] = const {
145141
146142#[ aoc( day17, part2) ]
147143pub fn part2 ( s : & str ) -> u64 {
148- unsafe { inner_part2 ( s . as_bytes ( ) ) }
149- }
144+ unsafe {
145+ let s = s . as_bytes ( ) ;
150146
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 ;
147+ let mut i = 13 ;
148+ while * s. get_unchecked ( i) != b'\n' {
149+ i += 1 ;
150+ }
151+ i += 39 ;
158152
159- let x = ( * s. get_unchecked ( i + 6 ) - b'0' ) as usize ;
153+ let x = ( * s. get_unchecked ( i + 6 ) - b'0' ) as usize ;
160154
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 ) ;
155+ let o1 = * s. get_unchecked ( i + 12 ) ;
156+ let o2 = * s. get_unchecked ( i + 16 ) ;
157+ let o3 = * s. get_unchecked ( i + 20 ) ;
158+ let o4 = * s. get_unchecked ( i + 24 ) ;
165159
166- let a = match ( o1, o2, o3, o4) {
167- ( b'1' , b'4' , b'0' , b'5' ) => {
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 )
171- }
172- ( b'1' , b'4' , b'5' , b'0' ) => {
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 )
176- }
177- ( b'1' , b'0' , b'4' , b'5' ) => {
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 )
181- }
182- ( b'0' , b'1' , b'4' , b'5' ) => {
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 )
186- }
187- ( b'0' , b'4' , b'1' , b'5' ) => {
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 )
191- }
192- ( b'4' , b'1' , b'0' , b'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 )
196- }
197- ( b'4' , b'1' , b'5' , b'0' ) => {
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 )
201- }
202- ( b'4' , b'0' , b'1' , b'5' ) => {
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 )
206- }
207- _ => unreachable_unchecked ( ) ,
208- } ;
209- a
160+ let a = match ( o1, o2, o3, o4) {
161+ ( b'1' , b'4' , b'0' , b'5' ) => {
162+ let y = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
163+ let z = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
164+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 0 )
165+ }
166+ ( b'1' , b'4' , b'5' , b'0' ) => {
167+ let y = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
168+ let z = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
169+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 1 )
170+ }
171+ ( b'1' , b'0' , b'4' , b'5' ) => {
172+ let y = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
173+ let z = ( * s. get_unchecked ( i + 22 ) - b'0' ) as usize ;
174+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 2 )
175+ }
176+ ( b'0' , b'1' , b'4' , b'5' ) => {
177+ let y = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
178+ let z = ( * s. get_unchecked ( i + 22 ) - b'0' ) as usize ;
179+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 3 )
180+ }
181+ ( b'0' , b'4' , b'1' , b'5' ) => {
182+ let y = ( * s. get_unchecked ( i + 22 ) - b'0' ) as usize ;
183+ let z = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
184+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 4 )
185+ }
186+ ( b'4' , b'1' , b'0' , b'5' ) => {
187+ let y = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
188+ let z = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
189+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 5 )
190+ }
191+ ( b'4' , b'1' , b'5' , b'0' ) => {
192+ let y = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
193+ let z = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
194+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 6 )
195+ }
196+ ( b'4' , b'0' , b'1' , b'5' ) => {
197+ let y = ( * s. get_unchecked ( i + 22 ) - b'0' ) as usize ;
198+ let z = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
199+ * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 7 )
200+ }
201+ _ => unreachable_unchecked ( ) ,
202+ } ;
203+ a
204+ }
210205}
0 commit comments