@@ -90,9 +90,9 @@ unsafe fn part1_inner(s: &str) -> u32 {
9090 let node_y = new_y + diff_y;
9191
9292 * antinodes. get_unchecked_mut ( node_y as usize ) |= if diff_x. is_positive ( ) {
93- 1 << new_x << diff_x
93+ 1 << new_x >> diff_x
9494 } else {
95- 1 << new_x >> -diff_x
95+ 1 << new_x << -diff_x
9696 } ;
9797 }
9898 }
@@ -120,78 +120,112 @@ unsafe fn part1_inner(s: &str) -> u32 {
120120}
121121
122122#[ aoc( day8, part2) ]
123- pub fn part2 ( s : & str ) -> u64 {
124- #[ expect( unused_unsafe) ]
125- unsafe {
126- part2_inner ( s)
127- }
123+ pub fn part2 ( s : & str ) -> u32 {
124+ unsafe { part2_inner ( s) }
128125}
129126
130- fn part2_inner ( s : & str ) -> u64 {
127+ unsafe fn part2_inner ( s : & str ) -> u32 {
128+ #[ cfg( not( test) ) ]
129+ const SIZE : i16 = 50 ;
130+ #[ cfg( test) ]
131+ const SIZE : i16 = 12 ;
132+
133+ const SIZE1 : i16 = SIZE + 1 ;
134+
131135 let s = s. as_bytes ( ) ;
132136
133- let mut masts: [ ArrayVec < [ i32 ; 4 ] > ; FREQ_RANGE ] =
134- [ ArrayVec :: from_array_empty ( [ 0 ; 4 ] ) ; FREQ_RANGE ] ;
137+ let mut masts: [ ArrayVec < [ ( i16 , i16 ) ; 3 ] > ; FREQ_RANGE ] =
138+ [ ArrayVec :: from_array_empty ( [ ( 0 , 0 ) ; 3 ] ) ; FREQ_RANGE ] ;
135139
136- let mut antinodes = [ false ; ( SIZE * SIZE ) as usize ] ;
137- let mut total_antinotedes = 0 ;
138- let mut set_node = |x, y| {
139- total_antinotedes += !antinodes[ ( y * SIZE + x) as usize ] as u64 ;
140- antinodes[ ( y * SIZE + x) as usize ] = true ;
141- } ;
140+ let mut antinodes = [ 0u64 ; SIZE as usize ] ;
142141
143142 for i in unsafe { OneInv :: new_unchecked ( b'.' ) . iter ( s) } {
144143 if s[ i] == b'\n' {
145144 continue ;
146145 }
147146 let f = s[ i] - b'0' ;
148- let i = i as i32 ;
147+ let i = i as i16 ;
149148
150149 let new_x = i % SIZE1 ;
151150 let new_y = i / SIZE1 ;
152- for mast_i in & masts[ f as usize ] {
153- let mast_x = mast_i % SIZE1 ;
154- let mast_y = mast_i / SIZE1 ;
155151
156- let o_diff_x = mast_x - new_x;
157- let o_diff_y = ( new_y - mast_y) . abs ( ) as i32 ;
152+ // numbers[masts[f as usize].len()] += 1;
153+
154+ for ( mast_y, mast_x) in masts. get_unchecked ( f as usize ) {
155+ let diff_x_o = mast_x - new_x;
156+ let diff_y_o = new_y - mast_y;
158157
159158 for k in 0 .. {
160- let diff_x = o_diff_x * k;
161- let diff_y = o_diff_y * k;
159+ let diff_x = diff_x_o * k;
160+ let diff_y = diff_y_o * k;
162161
163- let node_x = mast_x + diff_x;
164- if node_x >= 0 && node_x < SIZE && mast_y >= diff_y {
162+ if * mast_y >= diff_y {
165163 let node_y = mast_y - diff_y;
166- set_node ( node_x, node_y) ;
164+
165+ let field = if diff_x. is_positive ( ) {
166+ 1 << mast_x << diff_x
167+ } else {
168+ 1 << mast_x >> -diff_x
169+ } ;
170+ if field == 0 {
171+ break ;
172+ } else {
173+ * antinodes. get_unchecked_mut ( node_y as usize ) |= field;
174+ }
167175 } else {
168176 break ;
169177 }
170178 }
171179
172180 for k in 0 .. {
173- let diff_x = o_diff_x * k;
174- let diff_y = o_diff_y * k;
181+ let diff_x = diff_x_o * k;
182+ let diff_y = diff_y_o * k;
175183
176- let node_x = new_x - diff_x;
177- if node_x >= 0 && node_x < SIZE && new_y + diff_y < SIZE {
184+ if new_y + diff_y < SIZE {
178185 let node_y = new_y + diff_y;
179- set_node ( node_x, node_y) ;
186+
187+ let field = if diff_x. is_positive ( ) {
188+ 1 << new_x >> diff_x
189+ } else {
190+ 1 << new_x << -diff_x
191+ } ;
192+ if field == 0 {
193+ break ;
194+ } else {
195+ * antinodes. get_unchecked_mut ( node_y as usize ) |= field;
196+ }
180197 } else {
181198 break ;
182199 }
183200 }
184201 }
185202
186- masts[ f as usize ] . push ( i ) ;
203+ masts[ f as usize ] . try_push ( ( new_y , new_x ) ) ;
187204 }
205+ // for y in 0..SIZE {
206+ // for x in 0..SIZE {
207+ // print!(
208+ // "{}",
209+ // if antinodes[y as usize] & 1 << x != 0 {
210+ // '#'
211+ // } else {
212+ // s[(y * SIZE1 + x) as usize] as char
213+ // }
214+ // )
215+ // }
216+ // println!("");
217+ // }
188218
189- total_antinotedes
219+ antinodes
220+ . iter ( )
221+ . map ( |field| ( field & FIELD_SIZE ) . count_ones ( ) )
222+ . sum ( )
190223}
191224
192225#[ cfg( test) ]
193226mod tests {
194227 use super :: * ;
228+
195229 const EXAMPLE : & str = r"............
196230........0...
197231.....0......
0 commit comments