@@ -30,20 +30,12 @@ pub fn part1(s: &str) -> &'static str {
3030 let x = ( * s. get_unchecked ( i + 6 ) - b'0' ) as u64 ;
3131
3232 let o1 = * s. get_unchecked ( i + 12 ) ;
33- let o2 = * s. get_unchecked ( i + 16 ) ;
3433 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 ( ) ,
34+
35+ let y = match ( o1, o3) {
36+ ( b'1' , _) => * s. get_unchecked ( i + 14 ) - b'0' ,
37+ ( _, b'1' ) => * s. get_unchecked ( i + 22 ) - b'0' ,
38+ _ => * s. get_unchecked ( i + 18 ) - b'0' ,
4739 } as u64 ;
4840
4941 let result_ptr = ( & raw mut RESULT ) . cast :: < u8 > ( ) ;
@@ -153,47 +145,45 @@ pub fn part2(s: &str) -> u64 {
153145 let x = ( * s. get_unchecked ( i + 6 ) - b'0' ) as usize ;
154146
155147 let o1 = * s. get_unchecked ( i + 12 ) ;
156- let o2 = * s. get_unchecked ( i + 16 ) ;
157148 let o3 = * s. get_unchecked ( i + 20 ) ;
158- let o4 = * s. get_unchecked ( i + 24 ) ;
159149
160- let a = match ( o1, o2 , o3 , o4 ) {
161- ( b'1' , b'4' , b'0' , b'5 ') => {
150+ let a = match ( o1, o3 ) {
151+ ( b'1' , b'0 ' ) => {
162152 let y = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
163153 let z = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
164154 * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 0 )
165155 }
166- ( b'1' , b'4' , b'5' , b'0 ') => {
156+ ( b'1' , b'5 ' ) => {
167157 let y = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
168158 let z = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
169159 * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 1 )
170160 }
171- ( b'1' , b'0' , b'4' , b'5 ') => {
161+ ( b'1' , b'4 ' ) => {
172162 let y = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
173163 let z = ( * s. get_unchecked ( i + 22 ) - b'0' ) as usize ;
174164 * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 2 )
175165 }
176- ( b'0' , b'1' , b'4' , b'5 ') => {
166+ ( b'0' , b'4 ' ) => {
177167 let y = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
178168 let z = ( * s. get_unchecked ( i + 22 ) - b'0' ) as usize ;
179169 * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 3 )
180170 }
181- ( b'0' , b'4' , b'1' , b'5 ') => {
171+ ( b'0' , b'1 ' ) => {
182172 let y = ( * s. get_unchecked ( i + 22 ) - b'0' ) as usize ;
183173 let z = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
184174 * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 4 )
185175 }
186- ( b'4' , b'1' , b'0' , b'5 ') => {
176+ ( b'4' , b'0 ' ) => {
187177 let y = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
188178 let z = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
189179 * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 5 )
190180 }
191- ( b'4' , b'1' , b'5' , b'0 ') => {
181+ ( b'4' , b'5 ' ) => {
192182 let y = ( * s. get_unchecked ( i + 18 ) - b'0' ) as usize ;
193183 let z = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
194184 * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 6 )
195185 }
196- ( b'4' , b'0' , b'1' , b'5 ') => {
186+ ( b'4' , b'1 ' ) => {
197187 let y = ( * s. get_unchecked ( i + 22 ) - b'0' ) as usize ;
198188 let z = ( * s. get_unchecked ( i + 14 ) - b'0' ) as usize ;
199189 * LUT . get_unchecked ( x * 512 + y * 64 + z * 8 + 7 )
@@ -203,3 +193,34 @@ pub fn part2(s: &str) -> u64 {
203193 a
204194 }
205195}
196+
197+ #[ cfg( test) ]
198+ mod test {
199+ use super :: * ;
200+
201+ #[ test]
202+ fn test1 ( ) {
203+ let s = r"Register A: 45483412
204+ Register B: 0
205+ Register C: 0
206+
207+ Program: 2,4,1,3,7,5,0,3,4,1,1,5,5,5,3,0
208+ " ;
209+
210+ assert_eq ! ( part1( s) , "1,5,0,5,2,0,1,3,5" ) ;
211+ assert_eq ! ( part2( s) , 236581108670061 ) ;
212+ }
213+
214+ #[ test]
215+ fn test2 ( ) {
216+ let s = r"Register A: 64751475
217+ Register B: 0
218+ Register C: 0
219+
220+ Program: 2,4,1,2,7,5,4,5,1,3,5,5,0,3,3,0
221+ " ;
222+
223+ assert_eq ! ( part1( s) , "3,1,4,3,1,7,1,6,3" ) ;
224+ assert_eq ! ( part2( s) , 37221270076916 ) ;
225+ }
226+ }
0 commit comments