@@ -19,7 +19,7 @@ pub fn part1(s: &str) -> u32 {
1919fn part1_inner ( s : & str ) -> u32 {
2020 let s = s. as_bytes ( ) ;
2121
22- let mut id_map = [ 0u16 ; SIZE1 * SIZE1 ] ;
22+ let mut id_map = [ 0u16 ; SIZE * SIZE1 ] ;
2323 let mut next_id = 1 ;
2424
2525 let mut merges = const {
@@ -35,36 +35,40 @@ fn part1_inner(s: &str) -> u32 {
3535 let mut perimiter = [ 0u16 ; 2048 ] ;
3636
3737 for i in 0 ..SIZE * SIZE1 {
38- let c = s. get ( i) . cloned ( ) . unwrap_or ( b'\n' ) ;
39- let prev = s. get ( i. wrapping_sub ( 1 ) ) . cloned ( ) . unwrap_or ( b'\n' ) ;
40- let up = s. get ( i. wrapping_sub ( SIZE1 ) ) . cloned ( ) . unwrap_or ( b'\n' ) ;
41- let prev_id = unsafe { merges[ * id_map. get_unchecked ( i + SIZE1 - 1 ) as usize ] } ;
42- let up_id = unsafe { merges[ * id_map. get_unchecked ( i) as usize ] } ;
38+ let c = unsafe { * s. get_unchecked ( i) } ;
39+ let prev = unsafe { * s. get_unchecked ( i. wrapping_sub ( 1 ) . min ( SIZE * SIZE1 - 1 ) ) } ;
40+ let up = unsafe { * s. get_unchecked ( i. wrapping_sub ( SIZE1 ) . min ( SIZE * SIZE1 - 1 ) ) } ;
41+ let prev_id = unsafe {
42+ merges[ * id_map. get_unchecked ( i. wrapping_sub ( 1 ) . min ( SIZE * SIZE1 - 1 ) ) as usize ]
43+ } ;
44+ let up_id = unsafe {
45+ merges[ * id_map. get_unchecked ( i. wrapping_sub ( SIZE1 ) . min ( SIZE * SIZE1 - 1 ) ) as usize ]
46+ } ;
4347
4448 if prev == c && c == up && prev_id == up_id {
45- id_map[ i + SIZE1 ] = prev_id;
49+ id_map[ i] = prev_id;
4650
4751 area[ prev_id as usize ] += 1 ;
4852 } else if prev == c && c == up {
49- id_map[ i + SIZE1 ] = prev_id;
53+ id_map[ i] = prev_id;
5054
5155 merges[ up_id as usize ] = prev_id;
5256
5357 area[ prev_id as usize ] += 1 ;
5458 } else if prev == c {
55- id_map[ i + SIZE1 ] = prev_id;
59+ id_map[ i] = prev_id;
5660
5761 area[ prev_id as usize ] += 1 ;
5862 perimiter[ prev_id as usize ] += 1 ;
5963 perimiter[ up_id as usize ] += 1 ;
6064 } else if up == c {
61- id_map[ i + SIZE1 ] = up_id;
65+ id_map[ i] = up_id;
6266
6367 area[ up_id as usize ] += 1 ;
6468 perimiter[ prev_id as usize ] += 1 ;
6569 perimiter[ up_id as usize ] += 1 ;
6670 } else {
67- id_map[ i + SIZE1 ] = next_id;
71+ id_map[ i] = next_id;
6872
6973 area[ next_id as usize ] += 1 ;
7074 perimiter[ next_id as usize ] += 2 ;
@@ -75,7 +79,7 @@ fn part1_inner(s: &str) -> u32 {
7579 }
7680 }
7781 for x in 0 ..SIZE {
78- perimiter[ id_map[ SIZE * SIZE1 + x] as usize ] += 1 ;
82+ perimiter[ id_map[ ( SIZE - 1 ) * SIZE1 + x] as usize ] += 1 ;
7983 }
8084
8185 // for id in 0..next_id {
0 commit comments