···
fn generations(times: u32, mut world: Vec<u8>, size: usize, stuck: bool) -> Vec<u8> {
5
-
fn pos(x: usize, y: usize, size: usize) -> usize {
10
-
fn get_at(world: &Vec<u8>, size: usize, x: usize, y: usize) -> u8 {
11
-
// this is in known bounds
12
-
unsafe { *world.get_unchecked(pos(x, y, size)) }
4
+
let pos = |x, y| y * (size + 2) + x;
let mut new_world = vec![0_u8; (size + 2).pow(2)];
20
-
world[pos(1, 1, size)] = 1;
21
-
world[pos(size, 1, size)] = 1;
22
-
world[pos(1, size, size)] = 1;
23
-
world[pos(size, size, size)] = 1;
12
+
*world.get_unchecked_mut(pos(1, 1)) = 1;
13
+
*world.get_unchecked_mut(pos(size, 1)) = 1;
14
+
*world.get_unchecked_mut(pos(1, size)) = 1;
15
+
*world.get_unchecked_mut(pos(size, size)) = 1;
···
34
-
let was = get_at(&world, size, xo, yo) == 1;
35
-
let neighbours = get_at(&world, size, xm, ym)
36
-
+ get_at(&world, size, xo, ym)
37
-
+ get_at(&world, size, xp, ym)
38
-
+ get_at(&world, size, xm, yo)
39
-
+ get_at(&world, size, xp, yo)
40
-
+ get_at(&world, size, xm, yp)
41
-
+ get_at(&world, size, xo, yp)
42
-
+ get_at(&world, size, xp, yp);
43
-
new_world[pos(xo, yo, size)] = (neighbours == 3 || (neighbours == 2 && was)) as u8;
28
+
let was = *world.get_unchecked(pos(xo, yo)) == 1_u8;
29
+
let neighbours = world.get_unchecked(pos(xm, ym))
30
+
+ world.get_unchecked(pos(xo, ym))
31
+
+ world.get_unchecked(pos(xp, ym))
32
+
+ world.get_unchecked(pos(xm, yo))
33
+
+ world.get_unchecked(pos(xp, yo))
34
+
+ world.get_unchecked(pos(xm, yp))
35
+
+ world.get_unchecked(pos(xo, yp))
36
+
+ world.get_unchecked(pos(xp, yp));
37
+
*new_world.get_unchecked_mut(pos(xo, yo)) =
38
+
(neighbours == 3 || (neighbours == 2 && was)) as u8;
swap(&mut world, &mut new_world);
// i hate the duplication here :(
51
-
world[pos(1, 1, size)] = 1;
52
-
world[pos(size, 1, size)] = 1;
53
-
world[pos(1, size, size)] = 1;
54
-
world[pos(size, size, size)] = 1;
48
+
*world.get_unchecked_mut(pos(1, 1)) = 1;
49
+
*world.get_unchecked_mut(pos(size, 1)) = 1;
50
+
*world.get_unchecked_mut(pos(1, size)) = 1;
51
+
*world.get_unchecked_mut(pos(size, size)) = 1;