diff options
Diffstat (limited to 'tests/performance/09_gameoflife-p61glidergun.sy')
| -rw-r--r-- | tests/performance/09_gameoflife-p61glidergun.sy | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/tests/performance/09_gameoflife-p61glidergun.sy b/tests/performance/09_gameoflife-p61glidergun.sy new file mode 100644 index 0000000..9a6c96f --- /dev/null +++ b/tests/performance/09_gameoflife-p61glidergun.sy @@ -0,0 +1,112 @@ +int sheet1[500][500] = {}; +int sheet2[500][500] = {}; +int active = 1; +int width; +int height; +int steps; + +void read_map() { + width = getint(); + height = getint(); + // width <= 498, height <= 498 + steps = getint(); + getch(); + + int i = 1; + int j = 1; + + while (j <= height) { + i = 1; + while (i <= width) { + int get = getch(); + if (get == 35) { + sheet1[j][i] = 1; + } else { + sheet1[j][i] = 0; + } + i = i + 1; + } + // line feed + getch(); + j = j + 1; + } +} + +void put_map() { + int i = 1; + int j = 1; + + while (j <= height) { + i = 1; + while (i <= width) { + if (sheet1[j][i] == 1) { + putch(35); + } else { + putch(46); + } + i = i + 1; + } + // line feed + putch(10); + j = j + 1; + } +} + +void swap12() { + int i = 1; + int j = 1; + + while (j <= height) { + i = 1; + while (i <= width) { + sheet1[j][i] = sheet2[j][i]; + i = i + 1; + } + j = j + 1; + } +} + +void step(int source[][500], int target[][500]) { + int i = 1; + int j = 1; + + while (j <= height) { + i = 1; + while (i <= width) { + int alive_count = source[j - 1][i - 1] + source[j - 1][i] + + source[j - 1][i + 1] + source[j][i - 1] + + source[j][i + 1] + source[j + 1][i - 1] + + source[j + 1][i] + source[j + 1][i + 1]; + if (source[j][i] == 1 && alive_count == 2 ) { + target[j][i] = 1; + } else if (alive_count == 3) { + target[j][i] = 1; + } else { + target[j][i] = 0; + } + i = i + 1; + } + j = j + 1; + } +} + +int main() { + read_map(); + starttime(); + while (steps > 0) { + if (active == 1) { + step(sheet1, sheet2); + active = 2; + } else { + step(sheet2, sheet1); + active = 1; + } + steps = steps - 1; + } + stoptime(); + if (active == 2) { + swap12(); + } + put_map(); + return 0; +} |
