#include <cstring> // For memset
struct Automata1D
{
Automata1D(unsigned int _rule = 22, unsigned int _width = 80)
: mRule(_rule)
, mWidth(_width)
, mGeneration(0)
{
mValues[0] = new char[mWidth];
mValues[1] = new char[mWidth];
memset(mValues[0], 0, mWidth);
memset(mValues[1], 0, mWidth);
}
~Automata1D()
{
delete mValues[1];
delete mValues[0];
}
void evolve()
{
int lastGeneration = mGeneration % 2;
int thisGeneration = ++mGeneration % 2;
for (unsigned int i = 0; i < mWidth; ++i) {
int leftVal = (mValues[lastGeneration][((i - 1) + mWidth) % mWidth] != 0) ? 1 : 0;
int rightVal = (mValues[lastGeneration][((i + 1) + mWidth) % mWidth] != 0) ? 1 : 0;
unsigned int asStateComparison = 4 * leftVal
+ 1 * rightVal;
for (int j = 0; j < 5; ++j) {
if (asStateComparison == j) {
mValues[thisGeneration][i] = ((mRule & (1 << j)) != 0) ? 1 : 0;
break;
}
}
// Finally, print.
}
}
const unsigned int mRule;
const unsigned int mWidth;
int mGeneration;
char* mValues[2];
};
int main(int argc, char* argv[])
{
Automata1D test;
test.evolve();
}
I2luY2x1ZGUgPGNzdHJpbmc+IC8vIEZvciBtZW1zZXQKCnN0cnVjdCBBdXRvbWF0YTFEIAp7CiAgICBBdXRvbWF0YTFEKHVuc2lnbmVkIGludCBfcnVsZSA9IDIyLCB1bnNpZ25lZCBpbnQgX3dpZHRoID0gODApCiAgICA6IG1SdWxlKF9ydWxlKQogICAgLCBtV2lkdGgoX3dpZHRoKQogICAgLCBtR2VuZXJhdGlvbigwKQogICAgewogICAgICAgIG1WYWx1ZXNbMF0gPSBuZXcgY2hhclttV2lkdGhdOwogICAgICAgIG1WYWx1ZXNbMV0gPSBuZXcgY2hhclttV2lkdGhdOwoKICAgICAgICBtZW1zZXQobVZhbHVlc1swXSwgMCwgbVdpZHRoKTsKICAgICAgICBtZW1zZXQobVZhbHVlc1sxXSwgMCwgbVdpZHRoKTsgICAgICAgIAogICAgfQoKICAgIH5BdXRvbWF0YTFEKCkKICAgIHsKICAgICAgICBkZWxldGUgbVZhbHVlc1sxXTsKICAgICAgICBkZWxldGUgbVZhbHVlc1swXTsKICAgIH0KCiAgICB2b2lkIGV2b2x2ZSgpCiAgICB7CiAgICAgICAgaW50IGxhc3RHZW5lcmF0aW9uID0gICBtR2VuZXJhdGlvbiAlIDI7CiAgICAgICAgaW50IHRoaXNHZW5lcmF0aW9uID0gKyttR2VuZXJhdGlvbiAlIDI7CgogICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbVdpZHRoOyArK2kpIHsKICAgICAgICAgICAgaW50IGxlZnRWYWwgID0gKG1WYWx1ZXNbbGFzdEdlbmVyYXRpb25dWygoaSAtIDEpICsgbVdpZHRoKSAlIG1XaWR0aF0gIT0gMCkgPyAxIDogMDsKICAgICAgICAgICAgaW50IHJpZ2h0VmFsID0gKG1WYWx1ZXNbbGFzdEdlbmVyYXRpb25dWygoaSArIDEpICsgbVdpZHRoKSAlIG1XaWR0aF0gIT0gMCkgPyAxIDogMDsKCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBhc1N0YXRlQ29tcGFyaXNvbiA9IDQgKiBsZWZ0VmFsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxICogcmlnaHRWYWw7CgogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgewogICAgICAgICAgICAgICAgaWYgKGFzU3RhdGVDb21wYXJpc29uID09IGopIHsgCiAgICAgICAgICAgICAgICAgICAgbVZhbHVlc1t0aGlzR2VuZXJhdGlvbl1baV0gPSAoKG1SdWxlICYgKDEgPDwgaikpICE9IDApID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmluYWxseSwgcHJpbnQuICAgICAgICAgICAgCiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IHVuc2lnbmVkIGludCBtUnVsZTsKICAgIGNvbnN0IHVuc2lnbmVkIGludCBtV2lkdGg7CiAgICBpbnQgbUdlbmVyYXRpb247CiAgICBjaGFyKiBtVmFsdWVzWzJdOwp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewogICAgQXV0b21hdGExRCB0ZXN0OwogICAgdGVzdC5ldm9sdmUoKTsKICAgIAp9