@@ -133,10 +133,7 @@ fn inner_part1(s: &[u8]) -> u64 {
133133
134134#[ aoc( day20, part2) ]
135135pub fn part2 ( s : & str ) -> u32 {
136- #[ expect( unused_unsafe) ]
137- unsafe {
138- inner_part2 ( s. as_bytes ( ) )
139- }
136+ unsafe { inner_part2 ( s. as_bytes ( ) ) }
140137}
141138
142139#[ derive( Debug ) ]
@@ -155,7 +152,7 @@ const QUADS_NEEDED: usize = 20usize.div_ceil(QUAD_SIZE);
155152unsafe fn inner_part2 ( s : & [ u8 ] ) -> u32 {
156153 let to_idx = |x, y| y as usize * SIZE1 + x as usize ;
157154
158- let start = memchr:: memchr ( b'S' , s) . unwrap ( ) ;
155+ let start = memchr:: memchr ( b'S' , s) . unwrap_unchecked ( ) ;
159156
160157 let mut lines = [ const { heapless:: Vec :: < Line , 1024 > :: new ( ) } ; 4 ] ;
161158 let mut quads =
@@ -185,22 +182,23 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
185182
186183 let qx = ( x / QUAD_SIZE as u8 ) as usize ;
187184 let qy = ( y / QUAD_SIZE as u8 ) as usize ;
188- quads[ d as usize ] [ qy * QUADS_SIZE + qx]
189- . push ( lines[ d as usize ] . len ( ) )
190- . unwrap ( ) ;
185+ quads
186+ . get_unchecked_mut ( d as usize )
187+ . get_unchecked_mut ( qy * QUADS_SIZE + qx)
188+ . push_unchecked ( lines. get_unchecked ( d as usize ) . len ( ) ) ;
191189
192190 let mut prev_qx = qx;
193191 let mut prev_qy = qy;
194192 while * s. get_unchecked ( to_idx ( x, y) ) != b'E' {
195193 let next = d. step ( to_idx ( x, y) ) ;
196194
197- if s [ next] == b'#' {
195+ if * s . get_unchecked ( next) == b'#' {
198196 cur_line. line_end = d. select_crosline ( x, y) ;
199- lines[ d as usize ] . push ( cur_line ) . unwrap ( ) ;
197+ lines. get_unchecked_mut ( d as usize ) . push_unchecked ( cur_line ) ;
200198
201199 for side in d. sides ( ) {
202200 let side_i = side. step ( to_idx ( x, y) ) ;
203- if s [ side_i] != b'#' {
201+ if * s . get_unchecked ( side_i) != b'#' {
204202 d = side;
205203 match d {
206204 Dir :: N => y -= 1 ,
@@ -221,9 +219,10 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
221219 } ;
222220 let qx = x as usize / QUAD_SIZE ;
223221 let qy = y as usize / QUAD_SIZE ;
224- quads[ d as usize ] [ qy * QUADS_SIZE + qx]
225- . push ( lines[ d as usize ] . len ( ) )
226- . unwrap ( ) ;
222+ quads
223+ . get_unchecked_mut ( d as usize )
224+ . get_unchecked_mut ( qy * QUADS_SIZE + qx)
225+ . push_unchecked ( lines. get_unchecked ( d as usize ) . len ( ) ) ;
227226 prev_qy = qy;
228227 prev_qx = qx;
229228 } else {
@@ -242,17 +241,18 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
242241
243242 if prev_qy != qy || prev_qx != qx {
244243 cur_line. line_end = pos_line_end;
245- lines[ d as usize ] . push ( cur_line ) . unwrap ( ) ;
244+ lines. get_unchecked_mut ( d as usize ) . push_unchecked ( cur_line ) ;
246245
247246 cur_line = Line {
248247 start_ns : ns,
249248 line_start : d. select_crosline ( x, y) ,
250249 line_offset : d. select_inline ( x, y) ,
251250 line_end : 0 ,
252251 } ;
253- quads[ d as usize ] [ qy * QUADS_SIZE + qx]
254- . push ( lines[ d as usize ] . len ( ) )
255- . unwrap ( ) ;
252+ quads
253+ . get_unchecked_mut ( d as usize )
254+ . get_unchecked_mut ( qy * QUADS_SIZE + qx)
255+ . push_unchecked ( lines. get_unchecked ( d as usize ) . len ( ) ) ;
256256 }
257257
258258 prev_qy = qy;
@@ -269,8 +269,11 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
269269 for qy in
270270 qy. saturating_sub ( QUADS_NEEDED ) ..qy. wrapping_add ( QUADS_NEEDED + 1 ) . min ( QUADS_SIZE )
271271 {
272- for line_i in & quads[ Dir :: N as usize ] [ qy * QUADS_SIZE + qx] {
273- let Some ( line) = lines[ Dir :: N as usize ] . get ( * line_i) else {
272+ for line_i in quads
273+ . get_unchecked ( Dir :: N as usize )
274+ . get_unchecked ( qy * QUADS_SIZE + qx)
275+ {
276+ let Some ( line) = lines. get_unchecked ( Dir :: N as usize ) . get ( * line_i) else {
274277 continue ;
275278 } ;
276279 let dist = x. abs_diff ( line. line_offset as i16 ) as i16 ;
@@ -295,15 +298,11 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
295298 sum += ( cheat_start - cheat_end) as u32 + 1 ;
296299 }
297300 }
298- }
299- }
300- for qx in qx. saturating_sub ( QUADS_NEEDED ) ..qx. wrapping_add ( QUADS_NEEDED + 1 ) . min ( QUADS_SIZE )
301- {
302- for qy in
303- qy. saturating_sub ( QUADS_NEEDED ) ..qy. wrapping_add ( QUADS_NEEDED + 1 ) . min ( QUADS_SIZE )
304- {
305- for line_i in & quads[ Dir :: E as usize ] [ qy * QUADS_SIZE + qx] {
306- let Some ( line) = lines[ Dir :: E as usize ] . get ( * line_i) else {
301+ for line_i in quads
302+ . get_unchecked ( Dir :: E as usize )
303+ . get_unchecked ( qy * QUADS_SIZE + qx)
304+ {
305+ let Some ( line) = lines. get_unchecked ( Dir :: E as usize ) . get ( * line_i) else {
307306 continue ;
308307 } ;
309308 let dist = y. abs_diff ( line. line_offset as i16 ) as i16 ;
@@ -328,15 +327,11 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
328327 sum += ( cheat_end - cheat_start) as u32 + 1 ;
329328 }
330329 }
331- }
332- }
333- for qx in qx. saturating_sub ( QUADS_NEEDED ) ..qx. wrapping_add ( QUADS_NEEDED + 1 ) . min ( QUADS_SIZE )
334- {
335- for qy in
336- qy. saturating_sub ( QUADS_NEEDED ) ..qy. wrapping_add ( QUADS_NEEDED + 1 ) . min ( QUADS_SIZE )
337- {
338- for line_i in & quads[ Dir :: S as usize ] [ qy * QUADS_SIZE + qx] {
339- let Some ( line) = lines[ Dir :: S as usize ] . get ( * line_i) else {
330+ for line_i in quads
331+ . get_unchecked ( Dir :: S as usize )
332+ . get_unchecked ( qy * QUADS_SIZE + qx)
333+ {
334+ let Some ( line) = lines. get_unchecked ( Dir :: S as usize ) . get ( * line_i) else {
340335 continue ;
341336 } ;
342337 let dist = x. abs_diff ( line. line_offset as i16 ) as i16 ;
@@ -361,15 +356,11 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
361356 sum += ( cheat_end - cheat_start) as u32 + 1 ;
362357 }
363358 }
364- }
365- }
366- for qx in qx. saturating_sub ( QUADS_NEEDED ) ..qx. wrapping_add ( QUADS_NEEDED + 1 ) . min ( QUADS_SIZE )
367- {
368- for qy in
369- qy. saturating_sub ( QUADS_NEEDED ) ..qy. wrapping_add ( QUADS_NEEDED + 1 ) . min ( QUADS_SIZE )
370- {
371- for line_i in & quads[ Dir :: W as usize ] [ qy * QUADS_SIZE + qx] {
372- let Some ( line) = lines[ Dir :: W as usize ] . get ( * line_i) else {
359+ for line_i in quads
360+ . get_unchecked ( Dir :: W as usize )
361+ . get_unchecked ( qy * QUADS_SIZE + qx)
362+ {
363+ let Some ( line) = lines. get_unchecked ( Dir :: W as usize ) . get ( * line_i) else {
373364 continue ;
374365 } ;
375366 let dist = y. abs_diff ( line. line_offset as i16 ) as i16 ;
0 commit comments