+16
-16
2025/4/rust/src/main.rs
+16
-16
2025/4/rust/src/main.rs
···
1
use std::mem::swap;
2
3
-
fn generations(mut world: Vec<u8>, size: usize, part_2: bool) -> u32 {
4
let pos = |x, y| y * (size + 2) + x;
5
6
let sizep = size + 1;
7
8
-
let mut new_world = vec![0_u8; (size + 2).pow(2)];
9
10
let mut rolls = 0;
11
···
18
let xp = xo + 1;
19
20
unsafe {
21
-
let was = *world.get_unchecked(pos(xo, yo)) == 1;
22
-
let neighbours = world.get_unchecked(pos(xm, ym))
23
-
+ world.get_unchecked(pos(xo, ym))
24
-
+ world.get_unchecked(pos(xp, ym))
25
-
+ world.get_unchecked(pos(xm, yo))
26
-
+ world.get_unchecked(pos(xp, yo))
27
-
+ world.get_unchecked(pos(xm, yp))
28
-
+ world.get_unchecked(pos(xo, yp))
29
-
+ world.get_unchecked(pos(xp, yp));
30
-
*new_world.get_unchecked_mut(pos(xo, yo)) =
31
match (was, neighbours < 4) {
32
(true, true) => {
33
rolls += 1;
···
40
}
41
}
42
43
-
if !part_2 || world == new_world {
44
break;
45
}
46
47
-
swap(&mut world, &mut new_world);
48
}
49
rolls
50
}
···
65
.flatten()
66
.collect();
67
68
-
let part_1 = generations(input.clone(), size, false);
69
println!("Part 1: {}", part_1);
70
71
-
let part_2 = generations(input.clone(), size, true);
72
println!("Part 2: {}", part_2);
73
}
···
1
use std::mem::swap;
2
3
+
fn solve(mut warehouse: Vec<u8>, size: usize, part_2: bool) -> u32 {
4
let pos = |x, y| y * (size + 2) + x;
5
6
let sizep = size + 1;
7
8
+
let mut new_warehouse = vec![0_u8; (size + 2).pow(2)];
9
10
let mut rolls = 0;
11
···
18
let xp = xo + 1;
19
20
unsafe {
21
+
let was = *warehouse.get_unchecked(pos(xo, yo)) == 1;
22
+
let neighbours = warehouse.get_unchecked(pos(xm, ym))
23
+
+ warehouse.get_unchecked(pos(xo, ym))
24
+
+ warehouse.get_unchecked(pos(xp, ym))
25
+
+ warehouse.get_unchecked(pos(xm, yo))
26
+
+ warehouse.get_unchecked(pos(xp, yo))
27
+
+ warehouse.get_unchecked(pos(xm, yp))
28
+
+ warehouse.get_unchecked(pos(xo, yp))
29
+
+ warehouse.get_unchecked(pos(xp, yp));
30
+
*new_warehouse.get_unchecked_mut(pos(xo, yo)) =
31
match (was, neighbours < 4) {
32
(true, true) => {
33
rolls += 1;
···
40
}
41
}
42
43
+
if !part_2 || warehouse == new_warehouse {
44
break;
45
}
46
47
+
swap(&mut warehouse, &mut new_warehouse);
48
}
49
rolls
50
}
···
65
.flatten()
66
.collect();
67
68
+
let part_1 = solve(input.clone(), size, false);
69
println!("Part 1: {}", part_1);
70
71
+
let part_2 = solve(input.clone(), size, true);
72
println!("Part 2: {}", part_2);
73
}