11use aoc_runner_derive:: aoc;
22
3- // Transforms b, g, r, u ,w to 0, 1, 4, 3, 5
3+ const ID_LUT : [ usize ; 127 ] = const {
4+ let mut lut = [ 0 ; 127 ] ;
5+
6+ lut[ b'b' as usize ] = 0 ;
7+ lut[ b'g' as usize ] = 1 ;
8+ lut[ b'r' as usize ] = 2 ;
9+ lut[ b'u' as usize ] = 3 ;
10+ lut[ b'w' as usize ] = 4 ;
11+
12+ lut
13+ } ;
14+
15+ // Transforms b, g, r, u ,w to 0, 1, 4, 3, 5 NOT
16+
17+ // Transforms b, g, r, u ,w to 0, 1, 2, 3, 4
418#[ inline( always) ]
519fn to_idx ( i : u8 ) -> usize {
6- let o: usize ;
7- unsafe {
8- std:: arch:: asm!(
9- "mov {o:e}, 19" ,
10- "pext {o:e}, {i:e}, {o:e}" ,
11- "add {o:r}, -2" ,
12- i = in( reg) i as u32 ,
13- o = out( reg) o,
14- options( pure, nomem, nostack)
15- ) ;
16- }
17- o
20+ unsafe { * ID_LUT . get_unchecked ( i as usize ) }
1821}
1922
2023#[ derive( Debug , Copy , Clone ) ]
@@ -64,8 +67,8 @@ pub fn part1(s: &str) -> u64 {
6467
6568// #[target_feature(enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt")]
6669fn inner_part1 ( s : & [ u8 ] ) -> u64 {
67- let mut nfa = heapless:: Vec :: < [ NfaTrans ; 6 ] , NFA_SIZE > :: new ( ) ;
68- nfa. push ( [ NfaTrans :: None ; 6 ] ) . unwrap ( ) ;
70+ let mut nfa = heapless:: Vec :: < [ NfaTrans ; 5 ] , NFA_SIZE > :: new ( ) ;
71+ nfa. push ( [ NfaTrans :: None ; 5 ] ) . unwrap ( ) ;
6972
7073 let mut i = 0 ;
7174 let mut nfa_node = 0 ;
@@ -85,7 +88,7 @@ fn inner_part1(s: &[u8]) -> u64 {
8588 let mut nfa_trans = nfa[ nfa_node] [ color] ;
8689 let next_nfa_node = nfa_trans. add_or_foolow ( || {
8790 let new_nfa_node = nfa. len ( ) ;
88- nfa. push ( [ NfaTrans :: None ; 6 ] ) . unwrap ( ) ;
91+ nfa. push ( [ NfaTrans :: None ; 5 ] ) . unwrap ( ) ;
8992 new_nfa_node
9093 } ) ;
9194 nfa[ nfa_node] [ color] = nfa_trans;
@@ -170,8 +173,8 @@ pub fn part2(s: &str) -> u64 {
170173
171174// #[target_feature(enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt")]
172175fn inner_part2 ( s : & [ u8 ] ) -> u64 {
173- let mut nfa = heapless:: Vec :: < [ NfaTrans ; 6 ] , NFA_SIZE > :: new ( ) ;
174- nfa. push ( [ NfaTrans :: None ; 6 ] ) . unwrap ( ) ;
176+ let mut nfa = heapless:: Vec :: < [ NfaTrans ; 5 ] , NFA_SIZE > :: new ( ) ;
177+ nfa. push ( [ NfaTrans :: None ; 5 ] ) . unwrap ( ) ;
175178
176179 let mut i = 0 ;
177180 let mut nfa_node = 0 ;
0 commit comments