Skip to content

Commit 15a123b

Browse files
committed
Use bitmap in part 1
1 parent 485f30c commit 15a123b

File tree

1 file changed

+30
-47
lines changed

1 file changed

+30
-47
lines changed

src/day10.rs

Lines changed: 30 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,73 +12,56 @@ pub fn part1(s: &str) -> u32 {
1212
unsafe fn part1_inner(s: &str) -> u32 {
1313
let s = s.as_bytes();
1414

15-
let mut maps = [[0u64; MAX_SIZE + 2]; 9];
16-
17-
let mut zeros = [(0, 0); MAX_SIZE * MAX_SIZE / 9];
18-
let mut zeros_i = 0;
15+
let mut positions = [(0u16, [0u16; MAX_SIZE * MAX_SIZE / 9]); 9];
16+
let mut first_map = [0u128; BIG_SIZE];
17+
let mut zero_pos = 0;
1918

2019
let mut y = 0;
2120
let mut x = 0;
22-
let mut size = 0;
2321
for i in 0..s.len() {
2422
let c = s[i];
2523
if c == b'\n' {
26-
size = x;
2724
y += 1;
2825
x = 0;
2926
continue;
3027
}
3128

32-
let layer = c - b'0';
29+
let layer = (c - b'0') as usize;
3330
if layer == 0 {
34-
zeros[zeros_i] = (x, y);
35-
zeros_i += 1;
31+
first_map[y * MAX_SIZE + x + MAX_SIZE] = 1 << zero_pos;
32+
zero_pos += 1;
33+
zero_pos %= 128;
3634
} else {
37-
maps[layer as usize - 1][y + 1] |= 1 << x;
35+
let len = positions[layer - 1].0 as usize;
36+
positions[layer - 1].1[len] = (y * MAX_SIZE + x + MAX_SIZE) as u16;
37+
positions[layer - 1].0 += 1;
3838
}
3939
x += 1;
4040
}
4141

42-
let mut next = &mut [0u64; MAX_SIZE + 2];
43-
let mut current = &mut [0u64; MAX_SIZE + 2];
44-
4542
let mut sum = 0;
46-
for (x, y) in &zeros[..zeros_i] {
47-
current[*y + 1] |= 1 << *x;
48-
for layer in 0..9 {
49-
// for yp1 in 1..size + 1 {
50-
// for x in 0..size {
51-
// let c = if current[yp1] & (1 << x) != 0 {
52-
// '#'
53-
// } else {
54-
// s[(yp1 - 1) * (size + 1) + x] as char
55-
// };
56-
// print!("{c}");
57-
// }
58-
// println!("");
59-
// }
60-
// println!("");
61-
62-
for yp1 in 1..size + 1 {
63-
let to_left = (current[yp1] << 1) & maps[layer][yp1];
64-
let to_right = (current[yp1] >> 1) & maps[layer][yp1];
65-
let to_down = current[yp1 - 1] & maps[layer][yp1];
66-
let to_up = current[yp1 + 1] & maps[layer][yp1];
67-
68-
let to_left_and_right = to_left | to_right;
69-
let to_left_down_and_right = to_left_and_right | to_down;
70-
71-
next[yp1] = to_left_down_and_right | to_up;
72-
}
73-
74-
std::mem::swap(&mut current, &mut next);
75-
next.fill(0);
76-
}
7743

78-
for yp1 in 1..size + 1 {
79-
sum += current[yp1].count_ones();
44+
let mut next = &mut [0u128; BIG_SIZE];
45+
let mut current = &mut first_map;
46+
47+
for layer in 0..8 {
48+
let (len, positions) = positions[layer];
49+
50+
for i in &positions[..len as usize] {
51+
let i = *i as usize;
52+
next[i] =
53+
current[i - 1] | current[i + 1] | current[i + MAX_SIZE] | current[i - MAX_SIZE];
8054
}
81-
current.fill(0);
55+
56+
std::mem::swap(&mut current, &mut next);
57+
next.fill(0);
58+
}
59+
60+
let (len9, positions9) = positions[8];
61+
for i in &positions9[..len9 as usize] {
62+
let i = *i as usize;
63+
sum += (current[i - 1] | current[i + 1] | current[i + MAX_SIZE] | current[i - MAX_SIZE])
64+
.count_ones();
8265
}
8366

8467
sum

0 commit comments

Comments
 (0)