@@ -5,9 +5,6 @@ use aoc_runner_derive::aoc;
55#[ aoc( day24, part1) ]
66pub fn part1 ( s : & str ) -> u64 {
77 let s = s. as_bytes ( ) ;
8- part1_inner ( s) ;
9- part1_inner ( s) ;
10- part1_inner ( s) ;
118 part1_inner ( s)
129
1310 // println!("digraph G {{");
@@ -97,26 +94,24 @@ impl Gate {
9794 if self . out_1 == 0 {
9895 self . out_1 = out;
9996 } else {
100- // debug_assert!(self.out_2 == 0);
97+ debug_assert ! ( self . out_2 == 0 ) ;
10198 self . out_2 = out;
10299 }
103100 }
104101}
105102
106- #[ inline( always) ]
107- fn part1_inner ( s : & [ u8 ] ) -> u64 {
108- static mut GATES : [ Gate ; 26 * 26 * 26 + 46 ] = [ Gate {
109- inp_1 : false ,
110- out_1 : 0 ,
111- out_2 : 0 ,
112- state : State :: Empty ,
113- } ; 26 * 26 * 26 + 46 ] ;
103+ pub fn part1_inner ( s : & [ u8 ] ) -> u64 {
104+ let mut gates_map = [ 0u16 ; 26 * 26 * 26 ] ;
114105
115- let gates = unsafe { & mut * ( & raw mut GATES ) } ;
116- for g in gates. iter_mut ( ) {
117- g. out_1 = 0 ;
118- g. state = State :: Empty ;
119- }
106+ let mut gates = heapless:: Vec :: < Gate , 512 > :: from_slice (
107+ & [ Gate {
108+ inp_1 : false ,
109+ out_1 : 0 ,
110+ out_2 : 0 ,
111+ state : State :: Empty ,
112+ } ; 46 ] ,
113+ )
114+ . unwrap ( ) ;
120115
121116 let mut stack = heapless:: Vec :: < ( u16 , bool ) , 2048 > :: new ( ) ;
122117
@@ -133,11 +128,25 @@ fn part1_inner(s: &[u8]) -> u64 {
133128 let this = if * s. get_unchecked ( i + len + 12 ) == b'z' {
134129 ( s. get_unchecked ( i + len + 13 ) - b'0' ) as u16 * 10
135130 + ( s. get_unchecked ( i + len + 14 ) - b'0' ) as u16
136- + 26 * 26 * 26
137131 } else {
138- ( s. get_unchecked ( i + len + 12 ) - b'a' ) as u16 * 26 * 26
132+ let this = ( s. get_unchecked ( i + len + 12 ) - b'a' ) as u16 * 26 * 26
139133 + ( s. get_unchecked ( i + len + 13 ) - b'a' ) as u16 * 26
140- + ( s. get_unchecked ( i + len + 14 ) - b'a' ) as u16
134+ + ( s. get_unchecked ( i + len + 14 ) - b'a' ) as u16 ;
135+
136+ let real_this = * gates_map. get_unchecked ( this as usize ) ;
137+ if real_this == 0 {
138+ let i = gates. len ( ) as u16 ;
139+ gates. push_unchecked ( Gate {
140+ inp_1 : false ,
141+ out_1 : 0 ,
142+ out_2 : 0 ,
143+ state : State :: Empty ,
144+ } ) ;
145+ * gates_map. get_unchecked_mut ( this as usize ) = i;
146+ i
147+ } else {
148+ real_this
149+ }
141150 } ;
142151
143152 if * s. get_unchecked ( i) == b'x' {
@@ -172,6 +181,34 @@ fn part1_inner(s: &[u8]) -> u64 {
172181 let from2 = ( s. get_unchecked ( i + len + 5 ) - b'a' ) as u16 * 26 * 26
173182 + ( s. get_unchecked ( i + len + 6 ) - b'a' ) as u16 * 26
174183 + ( s. get_unchecked ( i + len + 7 ) - b'a' ) as u16 ;
184+ let real_from1 = * gates_map. get_unchecked ( from1 as usize ) ;
185+ let from1 = if real_from1 == 0 {
186+ let i = gates. len ( ) as u16 ;
187+ gates. push_unchecked ( Gate {
188+ inp_1 : false ,
189+ out_1 : 0 ,
190+ out_2 : 0 ,
191+ state : State :: Empty ,
192+ } ) ;
193+ * gates_map. get_unchecked_mut ( from1 as usize ) = i;
194+ i
195+ } else {
196+ real_from1
197+ } ;
198+ let real_from2 = * gates_map. get_unchecked ( from2 as usize ) ;
199+ let from2 = if real_from2 == 0 {
200+ let i = gates. len ( ) as u16 ;
201+ gates. push_unchecked ( Gate {
202+ inp_1 : false ,
203+ out_1 : 0 ,
204+ out_2 : 0 ,
205+ state : State :: Empty ,
206+ } ) ;
207+ * gates_map. get_unchecked_mut ( from2 as usize ) = i;
208+ i
209+ } else {
210+ real_from2
211+ } ;
175212
176213 gates. get_unchecked_mut ( from1 as usize ) . add_out ( this) ;
177214 gates. get_unchecked_mut ( from2 as usize ) . add_out ( this) ;
@@ -191,8 +228,7 @@ fn part1_inner(s: &[u8]) -> u64 {
191228 _ => unreachable_unchecked ( ) ,
192229 } ;
193230
194- if g > 26 * 26 * 26 {
195- let g = g - 26 * 26 * 26 ;
231+ if g < 46 {
196232 zs |= ( out as u64 ) << g;
197233 } else {
198234 let out_1 = gate. out_1 ;
@@ -237,8 +273,7 @@ pub fn part2(s: &str) -> &'static str {
237273
238274const ZSTART : u16 = 26 * 26 * 26 ;
239275
240- #[ inline( always) ]
241- fn part2_inner ( s : & [ u8 ] ) -> & ' static str {
276+ pub fn part2_inner ( s : & [ u8 ] ) -> & ' static str {
242277 #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
243278 enum State {
244279 Or ,
0 commit comments