Skip to content

Commit d28780e

Browse files
committed
Go back to best version
1 parent 6ea7923 commit d28780e

File tree

1 file changed

+45
-79
lines changed

1 file changed

+45
-79
lines changed

src/day12.rs

Lines changed: 45 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
169129
pub 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

Comments
 (0)