@@ -35,21 +35,44 @@ fn part1_inner(s: &str) -> u32 {
3535 let mut perimiter = [ 0u16 ; 2048 ] ;
3636
3737 for i in 0 ..SIZE * SIZE1 {
38- let ( c, prev, up, prev_id, up_id) = read_values ( s, i, & merges, & id_map) ;
39-
40- update_values (
41- prev,
42- c,
43- up,
44- prev_id,
45- up_id,
46- & mut next_id,
47- & mut id_map,
48- i,
49- & mut area,
50- & mut perimiter,
51- & mut merges,
52- ) ;
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 = merges[ id_map. get ( i. wrapping_sub ( 1 ) ) . cloned ( ) . unwrap_or ( 0 ) as usize ] ;
42+ let up_id = merges[ id_map. get ( i. wrapping_sub ( SIZE1 ) ) . cloned ( ) . unwrap_or ( 0 ) as usize ] ;
43+
44+ if prev == c && c == up && prev_id == up_id {
45+ id_map[ i] = prev_id;
46+
47+ area[ prev_id as usize ] += 1 ;
48+ } else if prev == c && c == up {
49+ id_map[ i] = prev_id;
50+
51+ merges[ up_id as usize ] = prev_id;
52+
53+ area[ prev_id as usize ] += 1 ;
54+ } else if prev == c {
55+ id_map[ i] = prev_id;
56+
57+ area[ prev_id as usize ] += 1 ;
58+ perimiter[ prev_id as usize ] += 1 ;
59+ perimiter[ up_id as usize ] += 1 ;
60+ } else if up == c {
61+ id_map[ i] = up_id;
62+
63+ area[ up_id as usize ] += 1 ;
64+ perimiter[ prev_id as usize ] += 1 ;
65+ perimiter[ up_id as usize ] += 1 ;
66+ } else {
67+ id_map[ i] = next_id;
68+
69+ area[ next_id as usize ] += 1 ;
70+ perimiter[ next_id as usize ] += 2 ;
71+ perimiter[ prev_id as usize ] += 1 ;
72+ perimiter[ up_id as usize ] += 1 ;
73+
74+ next_id += 1
75+ }
5376 }
5477 for x in 0 ..SIZE {
5578 perimiter[ id_map[ ( SIZE - 1 ) * SIZE1 + x] as usize ] += 1 ;
@@ -102,69 +125,6 @@ fn part1_inner(s: &str) -> u32 {
102125 sum
103126}
104127
105- #[ inline( never) ]
106- fn update_values (
107- prev : u8 ,
108- c : u8 ,
109- up : u8 ,
110- prev_id : u16 ,
111- up_id : u16 ,
112- next_id : & mut u16 ,
113- id_map : & mut [ u16 ; SIZE * SIZE1 ] ,
114- i : usize ,
115- area : & mut [ u16 ; 2048 ] ,
116- perimiter : & mut [ u16 ; 2048 ] ,
117- merges : & mut [ u16 ; 2048 ] ,
118- ) {
119- if prev == c && c == up && prev_id == up_id {
120- id_map[ i] = prev_id;
121-
122- area[ prev_id as usize ] += 1 ;
123- } else if prev == c && c == up {
124- id_map[ i] = prev_id;
125-
126- merges[ up_id as usize ] = prev_id;
127-
128- area[ prev_id as usize ] += 1 ;
129- } else if prev == c {
130- id_map[ i] = prev_id;
131-
132- area[ prev_id as usize ] += 1 ;
133- perimiter[ prev_id as usize ] += 1 ;
134- perimiter[ up_id as usize ] += 1 ;
135- } else if up == c {
136- id_map[ i] = up_id;
137-
138- area[ up_id as usize ] += 1 ;
139- perimiter[ prev_id as usize ] += 1 ;
140- perimiter[ up_id as usize ] += 1 ;
141- } else {
142- id_map[ i] = * next_id;
143-
144- area[ * next_id as usize ] += 1 ;
145- perimiter[ * next_id as usize ] += 2 ;
146- perimiter[ prev_id as usize ] += 1 ;
147- perimiter[ up_id as usize ] += 1 ;
148-
149- * next_id += 1
150- }
151- }
152-
153- #[ inline( never) ]
154- fn read_values (
155- s : & [ u8 ] ,
156- i : usize ,
157- merges : & [ u16 ; 2048 ] ,
158- id_map : & [ u16 ; SIZE * SIZE1 ] ,
159- ) -> ( u8 , u8 , u8 , u16 , u16 ) {
160- let c = s. get ( i) . cloned ( ) . unwrap_or ( b'\n' ) ;
161- let prev = s. get ( i. wrapping_sub ( 1 ) ) . cloned ( ) . unwrap_or ( b'\n' ) ;
162- let up = s. get ( i. wrapping_sub ( SIZE1 ) ) . cloned ( ) . unwrap_or ( b'\n' ) ;
163- let prev_id = merges[ id_map. get ( i. wrapping_sub ( 1 ) ) . cloned ( ) . unwrap_or ( 0 ) as usize ] ;
164- let up_id = merges[ id_map. get ( i. wrapping_sub ( SIZE1 ) ) . cloned ( ) . unwrap_or ( 0 ) as usize ] ;
165- ( c, prev, up, prev_id, up_id)
166- }
167-
168128#[ aoc( day12, part2) ]
169129pub fn part2 ( s : & str ) -> u32 {
170130 #[ expect( unused_unsafe) ]
@@ -200,7 +160,13 @@ fn part2_inner(s: &str) -> u32 {
200160 let prev_id = merges[ id_map. get ( i. wrapping_sub ( 1 ) ) . cloned ( ) . unwrap_or ( 0 ) as usize ] ;
201161 let up_id = merges[ id_map. get ( i. wrapping_sub ( SIZE1 ) ) . cloned ( ) . unwrap_or ( 0 ) as usize ] ;
202162
203- if prev == c && c == up {
163+ if prev == c && c == up && prev_id == up_id {
164+ // ? A
165+ // A A
166+ id_map[ i] = prev_id;
167+
168+ area[ prev_id as usize ] += 1 ;
169+ } else if prev == c && c == up {
204170 // ? A
205171 // A A
206172 id_map[ i] = prev_id;
0 commit comments