diff options
Diffstat (limited to 'bench/life.bad')
-rw-r--r-- | bench/life.bad | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/bench/life.bad b/bench/life.bad new file mode 100644 index 0000000..4dcabff --- /dev/null +++ b/bench/life.bad | |||
@@ -0,0 +1,71 @@ | |||
1 | ; This board is 8 * 8 = 64 cells. | ||
2 | ; let n_cells = 64 | ||
3 | ; let board_a: int[64] | ||
4 | ; let board_b: int[64] | ||
5 | ; let stride = 8 | ||
6 | |||
7 | ; This board is 32 * 32 = 1024 cells. | ||
8 | let n_cells = 1024 | ||
9 | let board_a: int[1024] | ||
10 | let board_b: int[1024] | ||
11 | let stride = 32 | ||
12 | |||
13 | ; Storing pointers to the front/backbuffer to avoid copying the board over. | ||
14 | let front = board_a | ||
15 | let back = board_b | ||
16 | |||
17 | ; Initialize glider | ||
18 | set front[stride * 2 + 5] = 1 | ||
19 | set front[stride * 3 + 6] = 1 | ||
20 | set front[stride * 4 + 4] = 1 | ||
21 | set front[stride * 4 + 5] = 1 | ||
22 | set front[stride * 4 + 6] = 1 | ||
23 | |||
24 | fun print_board(board: @int): nil { | ||
25 | for let i = 0 , i < n_cells , set i += 1 { | ||
26 | if i % stride == 0 { | ||
27 | println("") | ||
28 | } | ||
29 | if board[i] == 1 print("■ ") | ||
30 | else print("· ") | ||
31 | } | ||
32 | println("") | ||
33 | } | ||
34 | |||
35 | fun update_board(): nil { | ||
36 | for let i = 0 , i < n_cells , set i += 1 { | ||
37 | let left = if i > 0 front[i - 1] else 0 | ||
38 | let right = if i < n_cells - 1 front[i + 1] else 0 | ||
39 | let top = if i >= stride front[i - stride] else 0 | ||
40 | let topleft = if i >= stride front[i - stride - 1] else 0 | ||
41 | let topright = if i >= stride front[i - stride + 1] else 0 | ||
42 | let bot = if i <= n_cells - stride front[i + stride] else 0 | ||
43 | let botleft = if i <= n_cells - stride front[i + stride - 1] else 0 | ||
44 | let botright = if i <= n_cells - stride front[i + stride + 1] else 0 | ||
45 | |||
46 | let neig = left | ||
47 | + right | ||
48 | + top | ||
49 | + bot | ||
50 | + topleft | ||
51 | + topright | ||
52 | + botleft | ||
53 | + botright | ||
54 | |||
55 | cond { | ||
56 | front[i] == 0 && neig == 3 = set back[i] = 1 | ||
57 | front[i] == 1 && (neig == 2 || neig == 3) = set back[i] = 1 | ||
58 | else = set back[i] = 0 | ||
59 | } | ||
60 | } | ||
61 | |||
62 | ; Swap boards. | ||
63 | let tmp = front | ||
64 | set front = back | ||
65 | set back = tmp | ||
66 | } | ||
67 | |||
68 | for let n_iter = 100 , n_iter > 0 , set n_iter -= 1 { | ||
69 | print_board(front) | ||
70 | update_board() | ||
71 | } | ||