#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <io.h>
#define ROWS 50
#define COLS 80
// The total number of generations is really double this number.
int generations = 1000;
int civ1[ROWS+2][COLS+2], civ2[ROWS+2][COLS+2];
CHAR_INFO disp[ROWS][COLS];
HANDLE console;
COORD size = { COLS, ROWS };
COORD src = { 0, 0};
SMALL_RECT dest = { 0, 0, COLS, ROWS };
void ClrScrn(char attrib) {
COORD pos = { 0, 0};
DWORD written;
unsigned size;
size = ROWS * COLS;
FillConsoleOutputCharacter(console, ' ', size, pos, &written);
FillConsoleOutputAttribute(console, attrib, size, pos, &written);
SetConsoleCursorPosition(console, pos);
}
void fill_edges(int civ1[ROWS+2][COLS+2]) {
int i, j;
for (i=1; i<=ROWS; ++i) {
civ1[i][0] = civ1[i][COLS];
civ1[i][COLS+1] = civ1[i][1];
}
for (j=1; j<=COLS; ++j) {
civ1[0][j] = civ1[ROWS][j];
civ1[ROWS+1][j] = civ1[1][j];
}
civ1[0][0] = civ1[ROWS][COLS];
civ1[ROWS+1][COLS+1] = civ1[1][1];
civ1[0][COLS+1] = civ1[ROWS][1];
civ1[ROWS+1][0] = civ1[1][COLS];
}
void update_generation(int old_gen[ROWS+2][COLS+2],
int new_gen[ROWS+2][COLS+2])
{
int i, j, count;
for (i = 1; i <= ROWS; ++i)
{
for (j = 1; j <= COLS; ++j)
{
count = old_gen[i - 1][j - 1] +
old_gen[i - 1][j] +
old_gen[i - 1][j + 1] +
old_gen[i][j - 1] +
old_gen[i][j + 1] +
old_gen[i + 1][j - 1] +
old_gen[i + 1][j] +
old_gen[i + 1][j + 1];
switch(count)
{
case 2:
new_gen[i][j] = old_gen[i][j];
break;
case 3:
new_gen[i][j] = 1;
disp[i-1][j-1].Char.AsciiChar = '*';
break;
default:
new_gen[i][j] = 0;
disp[i-1][j-1].Char.AsciiChar = ' ';
break;
}
}
}
WriteConsoleOutput(console, (CHAR_INFO *)disp, size, src, &dest);
fill_edges(new_gen);
}
void initialize(void)
{
int i, j;
ClrScrn(0x71);
for (i = 1; i <= ROWS; ++i)
{
for (j = 1; j <= COLS; ++j)
{
civ1
[i
][j
] = (int)(((__int64
)rand()*2)/RAND_MAX
); disp[i-1][j-1].Char.AsciiChar = civ1[i][j] ? '*' : ' ';
disp[i-1][j-1].Attributes = 0x71;
}
}
WriteConsoleOutput(console, (CHAR_INFO *)disp, size, src, &dest);
fill_edges(civ1);
}
int main(int argc, char **argv) {
int i;
if ( argc != 1)
generations
= atoi(argv
[1]);
console = GetStdHandle(STD_OUTPUT_HANDLE);
initialize();
for (i = 0; i <generations; ++i)
{
update_generation(civ1, civ2);
update_generation(civ2, civ1);
}
return EXIT_SUCCESS;
}
I2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxjb25pby5oPgojaW5jbHVkZSA8aW8uaD4KCiNkZWZpbmUgICAgIFJPV1MgICAgICAgIDUwCiNkZWZpbmUgICAgIENPTFMgICAgICAgIDgwCgovLyBUaGUgdG90YWwgbnVtYmVyIG9mIGdlbmVyYXRpb25zIGlzIHJlYWxseSBkb3VibGUgdGhpcyBudW1iZXIuCmludCBnZW5lcmF0aW9ucyA9IDEwMDA7CgppbnQgY2l2MVtST1dTKzJdW0NPTFMrMl0sIGNpdjJbUk9XUysyXVtDT0xTKzJdOwoKQ0hBUl9JTkZPIGRpc3BbUk9XU11bQ09MU107CkhBTkRMRSBjb25zb2xlOwpDT09SRCBzaXplID0geyBDT0xTLCBST1dTIH07CkNPT1JEIHNyYyA9IHsgMCwgMH07ClNNQUxMX1JFQ1QgIGRlc3QgPSB7IDAsIDAsIENPTFMsIFJPV1MgfTsKCnZvaWQgQ2xyU2NybihjaGFyIGF0dHJpYikgewogICAgQ09PUkQgcG9zID0geyAwLCAwfTsKICAgIERXT1JEIHdyaXR0ZW47CiAgICB1bnNpZ25lZCBzaXplOwogICAgCiAgICBzaXplID0gUk9XUyAqIENPTFM7CiAgICAKICAgIEZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyKGNvbnNvbGUsICcgJywgc2l6ZSwgcG9zLCAmd3JpdHRlbik7CiAgICBGaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZShjb25zb2xlLCBhdHRyaWIsIHNpemUsIHBvcywgJndyaXR0ZW4pOwogICAgU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGNvbnNvbGUsIHBvcyk7Cn0KCnZvaWQgZmlsbF9lZGdlcyhpbnQgY2l2MVtST1dTKzJdW0NPTFMrMl0pIHsKICAgIGludCBpLCBqOwogICAgCiAgICBmb3IgKGk9MTsgaTw9Uk9XUzsgKytpKSB7CiAgICAgICAgY2l2MVtpXVswXSA9IGNpdjFbaV1bQ09MU107CiAgICAgICAgY2l2MVtpXVtDT0xTKzFdID0gY2l2MVtpXVsxXTsKICAgIH0KICAgIGZvciAoaj0xOyBqPD1DT0xTOyArK2opIHsKICAgICAgICBjaXYxWzBdW2pdID0gY2l2MVtST1dTXVtqXTsKICAgICAgICBjaXYxW1JPV1MrMV1bal0gPSBjaXYxWzFdW2pdOwogICAgfQogICAgY2l2MVswXVswXSA9IGNpdjFbUk9XU11bQ09MU107CiAgICBjaXYxW1JPV1MrMV1bQ09MUysxXSA9IGNpdjFbMV1bMV07CiAgICBjaXYxWzBdW0NPTFMrMV0gPSBjaXYxW1JPV1NdWzFdOwogICAgY2l2MVtST1dTKzFdWzBdID0gY2l2MVsxXVtDT0xTXTsKfQoKdm9pZCB1cGRhdGVfZ2VuZXJhdGlvbihpbnQgb2xkX2dlbltST1dTKzJdW0NPTFMrMl0sIAogICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfZ2VuW1JPV1MrMl1bQ09MUysyXSkKewogICAgaW50IGksIGosIGNvdW50OwogICAgCiAgICBmb3IgKGkgPSAxOyBpIDw9IFJPV1M7ICsraSkKICAgIHsKICAgICAgICBmb3IgKGogPSAxOyBqIDw9IENPTFM7ICsraikKICAgICAgICB7CiAgICAgICAgICAgIGNvdW50ID0gb2xkX2dlbltpIC0gMV1baiAtIDFdICsKICAgICAgICAgICAgICAgIG9sZF9nZW5baSAtIDFdW2pdICsKICAgICAgICAgICAgICAgIG9sZF9nZW5baSAtIDFdW2ogKyAxXSArCiAgICAgICAgICAgICAgICBvbGRfZ2VuW2ldW2ogLSAxXSArCiAgICAgICAgICAgICAgICBvbGRfZ2VuW2ldW2ogKyAxXSArCiAgICAgICAgICAgICAgICBvbGRfZ2VuW2kgKyAxXVtqIC0gMV0gKwogICAgICAgICAgICAgICAgb2xkX2dlbltpICsgMV1bal0gKwogICAgICAgICAgICAgICAgb2xkX2dlbltpICsgMV1baiArIDFdOwogICAgICAgICAgICAKICAgICAgICAgICAgc3dpdGNoKGNvdW50KSAKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBuZXdfZ2VuW2ldW2pdID0gb2xkX2dlbltpXVtqXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIG5ld19nZW5baV1bal0gPSAxOwogICAgICAgICAgICAgICAgZGlzcFtpLTFdW2otMV0uQ2hhci5Bc2NpaUNoYXIgPSAnKic7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIG5ld19nZW5baV1bal0gPSAwOwogICAgICAgICAgICAgICAgZGlzcFtpLTFdW2otMV0uQ2hhci5Bc2NpaUNoYXIgPSAnICc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFdyaXRlQ29uc29sZU91dHB1dChjb25zb2xlLCAoQ0hBUl9JTkZPICopZGlzcCwgc2l6ZSwgc3JjLCAmZGVzdCk7CiAgICBmaWxsX2VkZ2VzKG5ld19nZW4pOwp9Cgp2b2lkIGluaXRpYWxpemUodm9pZCkKewogICAgaW50IGksIGo7CiAgICAKICAgIENsclNjcm4oMHg3MSk7CiAgICBzcmFuZCgoKHVuc2lnbmVkIGludCl0aW1lKE5VTEwpKXwxKTsKICAgIAogICAgZm9yIChpID0gMTsgaSA8PSBST1dTOyArK2kpCiAgICB7CiAgICAgICAgZm9yIChqID0gMTsgaiA8PSBDT0xTOyArK2opCiAgICAgICAgewogICAgICAgICAgICBjaXYxW2ldW2pdID0gKGludCkoKChfX2ludDY0KXJhbmQoKSoyKS9SQU5EX01BWCk7CiAgICAgICAgICAgIGRpc3BbaS0xXVtqLTFdLkNoYXIuQXNjaWlDaGFyID0gY2l2MVtpXVtqXSA/ICcqJyA6ICcgJzsKICAgICAgICAgICAgZGlzcFtpLTFdW2otMV0uQXR0cmlidXRlcyA9IDB4NzE7CiAgICAgICAgfQogICAgfQogICAgV3JpdGVDb25zb2xlT3V0cHV0KGNvbnNvbGUsIChDSEFSX0lORk8gKilkaXNwLCBzaXplLCBzcmMsICZkZXN0KTsKICAgIGZpbGxfZWRnZXMoY2l2MSk7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewogICAgCiAgICBpbnQgaTsKICAgIAogICAgaWYgKCBhcmdjICE9IDEpCiAgICAgICAgZ2VuZXJhdGlvbnMgPSBhdG9pKGFyZ3ZbMV0pOwogICAgCiAgICBjb25zb2xlID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKICAgIGluaXRpYWxpemUoKTsKICAgIGZvciAoaSA9IDA7IGkgPGdlbmVyYXRpb25zOyArK2kpCiAgICB7CiAgICAgICAgdXBkYXRlX2dlbmVyYXRpb24oY2l2MSwgY2l2Mik7CiAgICAgICAgdXBkYXRlX2dlbmVyYXRpb24oY2l2MiwgY2l2MSk7CiAgICB9CiAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwp9Cg==