-
Notifications
You must be signed in to change notification settings - Fork 0
/
conway_sweetjs.js
127 lines (107 loc) · 2.89 KB
/
conway_sweetjs.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
var COLS = 177;
var ROWS = 60;
macro GET2D {
rule { ( $obj:expr, $y:expr, $x:expr ) } => { $obj[($y*COLS) + $x] }
}
macro SET2D {
rule { ( $obj:expr, $y:expr, $x:expr, $val:expr ) } => { $obj[($y*COLS) + $x] = $val }
}
var update_ghost = function(grid, ghost_grid) {
/*
A virtual grid that includes wrapped edges, so that we don't have to
do funky modulo arithmetic.
*/
var n, x, y;
/* Copy bottom of grid to top of ghost_grid */
for(n=0; n < COLS; n++) {
SET2D(ghost_grid, 0, n+1, GET2D(grid, ROWS-1, n));
}
/* Copy top of grid to bottom of ghost_grid */
for(n=0; n < COLS; n++) {
SET2D(ghost_grid, ROWS+2-1, n+1, GET2D(grid, 0, n));
}
/* Copy the rest of grid to ghost_grid */
for(y=0; y < ROWS; y++) {
for(x=0; x < COLS; x++) {
SET2D(ghost_grid, y+1, x+1, GET2D(grid, y, x));
}
}
/* Wrap ghost_grid left and right columns */
for(y=0; y < ROWS+2; y++) {
SET2D(ghost_grid, y, 0, GET2D(ghost_grid, y, COLS+2-2));
SET2D(ghost_grid, y, COLS+2-1, GET2D(ghost_grid, y, 1));
}
}
var count_neighbors = function(x, y, ghost_grid) {
return (
GET2D(ghost_grid, (y-1)+1, (x-1)+1) + GET2D(ghost_grid, (y-1)+1, (x)+1) + GET2D(ghost_grid, (y-1)+1, (x+1)+1) +
GET2D(ghost_grid, (y )+1, (x-1)+1) + GET2D(ghost_grid, (y )+1, (x+1)+1) +
GET2D(ghost_grid, (y+1)+1, (x-1)+1) + GET2D(ghost_grid, (y+1)+1, (x)+1) + GET2D(ghost_grid, (y+1)+1, (x+1)+1));
}
var out = new Buffer((COLS+1)*ROWS);
var pretty_print = function(grid) {
var x, y;
var out_i = 0;
for(y=0; y <= ROWS-1; y++) {
for(x=0; x <= COLS-1; x++) {
if(GET2D(grid, y, x) == 0) {
out[out_i] = 32; // " "
out_i += 1;
} else {
out[out_i] = 35; // "#"
out_i += 1;
}
}
out[out_i] = 10; // "\n"
out_i += 1;
}
process.stdout.write(out);
}
var next_gen = function(grid, ghost_grid) {
var neighbors, x, y;
for(y=0; y < ROWS; y++) {
for(x=0; x < COLS; x++) {
neighbors = count_neighbors(x, y, ghost_grid);
//printf("N %d, ", neighbors);
if(neighbors < 2 || neighbors > 3) {
SET2D(grid, y, x, 0);
} else if(neighbors == 3) {
SET2D(grid, y, x, 1);
}
}
}
update_ghost(grid, ghost_grid);
}
var make_grid = function(width, height) {
return Array(width * height);
}
var run_once = function() {
var grid = make_grid(COLS, ROWS);
var ghost_grid = make_grid(COLS + 2, ROWS + 2);
var x;
var y;
/* Generate a random grid */
for(y=0; y < ROWS; y++) {
for(x=0; x < COLS; x++) {
SET2D(grid, y, x, Math.floor(Math.random() * 2));
}
}
pretty_print(grid);
update_ghost(grid, ghost_grid);
var iterations = 10000;
while(iterations--) {
process.stdout.write("\n\n\n");
pretty_print(grid);
//nanosleep(&wait, NULL);
next_gen(grid, ghost_grid);
}
}
var main = function() {
run_once();
process.stderr.write("Warmed up.\n");
var start = Date.now();
run_once()
var end = Date.now();
process.stderr.write("Ran in " + (end - start) + "ms\n");
}
main();