#include <iostream>
#include <stdio.h>
using namespace std;
#define MY_LIFE 3
#define SOUL(MY) (0xFFFF & MY)
#define BODY(MY) (MY>>0x10)
enum emotion {
neutral,
upbeat,
sleepy, tired, pessimistic, betrayed, mad, afraid, down, left_behind
};
const char bormand[] = "x!( \"@\"!, #(&!$ $\\&!$ %('!$ &T&! 'T& $ !, %0&!$ $X&!$ #$&!$ )$& $ ";
const int p_x = 15;
const int p_y = 10;
unsigned int podushka[p_x * p_y];
unsigned int embrace(const char* a, int i) {
unsigned int x = 0;
for(int j = 0; j<3; ++j)
x += (a[i+j]-0x20)<<(j*6);
return x;
}
void make_love(int x, int y) {
unsigned int my = podushka[x + p_x*y];
int my_soul = SOUL(my);
if (my_soul >= sizeof(bormand) - 3)
return;
int my_happiness = embrace(bormand, my_soul);
int dx = 0;
int dy = 0;
switch(my_happiness & 0xFF) {
case upbeat:
podushka[x + y*p_x] = my_soul + MY_LIFE + ((my_happiness & 0xFFFF00)<<8);
break;
case sleepy:
dx = -1; goto sleep;
case tired:
dx = -1; dy = -1; goto sleep;
case left_behind:
dx = -1; dy = 1; goto sleep;
case mad:
dx = 1; goto sleep;
case betrayed:
dx = 1; dy = -1; goto sleep;
case afraid:
dx = 1; dy = 1; goto sleep;
case pessimistic:
dy = -1; goto sleep;
case down:
dy = 1; goto sleep;
sleep:podushka[(x+dx)%p_x + (y+dy)%p_y*p_x] = BODY(my) ? my - 0x10000 : my_soul + MY_LIFE;
podushka[x + p_x*y] = my_happiness>>8;
break;
default:
return;
}
}
int main(int argc, const char * argv[]) {
//cout<<"Bormand: \"" << bormand << "\"\n";
podushka[8+p_x*9] = 1;
// Test
//print2();
for (int t = 0; t<20; ++t) {
for (int i = 0; i<p_x*p_y; ++i)
make_love(i%p_x, i/p_x);
//cout << "step: "<<t<<endl;
//print2();
}
for (int j = 0; j<p_y; ++j) {
for (int i = 0; i<p_x; ++i) {
auto c = podushka[i+p_x*j];
putchar((c>0x20 && c <0x7e)?(char)c:' ');
}
cout<<endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkaW8uaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgTVlfTElGRSAzCgojZGVmaW5lIFNPVUwoTVkpICgweEZGRkYgJiBNWSkKI2RlZmluZSBCT0RZKE1ZKSAoTVk+PjB4MTApCgplbnVtIGVtb3Rpb24gewogICAgbmV1dHJhbCwKICAgIHVwYmVhdCwKICAgIHNsZWVweSwgdGlyZWQsIHBlc3NpbWlzdGljLCBiZXRyYXllZCwgbWFkLCBhZnJhaWQsIGRvd24sIGxlZnRfYmVoaW5kCn07Cgpjb25zdCBjaGFyIGJvcm1hbmRbXSA9ICJ4ISggXCJAXCIhLCAjKCYhJCAkXFwmISQgJSgnISQgJlQmISAgJ1QmICQgISwgJTAmISQgJFgmISQgIyQmISQgKSQmICQgIjsKCmNvbnN0IGludCBwX3ggPSAxNTsKY29uc3QgaW50IHBfeSA9IDEwOwoKdW5zaWduZWQgaW50IHBvZHVzaGthW3BfeCAqIHBfeV07Cgp1bnNpZ25lZCBpbnQgZW1icmFjZShjb25zdCBjaGFyKiBhLCBpbnQgaSkgewogICAgdW5zaWduZWQgaW50IHggPSAwOwogICAgZm9yKGludCBqID0gMDsgajwzOyArK2opCiAgICAgICAgeCArPSAoYVtpK2pdLTB4MjApPDwoaio2KTsKICAgIHJldHVybiB4Owp9Cgp2b2lkIG1ha2VfbG92ZShpbnQgeCwgaW50IHkpIHsKICAgIHVuc2lnbmVkIGludCBteSA9IHBvZHVzaGthW3ggKyBwX3gqeV07CiAgICBpbnQgbXlfc291bCA9IFNPVUwobXkpOwogICAgaWYgKG15X3NvdWwgPj0gc2l6ZW9mKGJvcm1hbmQpIC0gMykKICAgICAgICByZXR1cm47CiAgICBpbnQgbXlfaGFwcGluZXNzID0gZW1icmFjZShib3JtYW5kLCBteV9zb3VsKTsKICAgIGludCBkeCA9IDA7CiAgICBpbnQgZHkgPSAwOwogICAgc3dpdGNoKG15X2hhcHBpbmVzcyAmIDB4RkYpIHsKICAgICAgICBjYXNlIHVwYmVhdDoKICAgICAgICAgICAgcG9kdXNoa2FbeCArIHkqcF94XSA9IG15X3NvdWwgKyBNWV9MSUZFICsgKChteV9oYXBwaW5lc3MgJiAweEZGRkYwMCk8PDgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIHNsZWVweToKICAgICAgICAgICAgZHggPSAtMTsgZ290byBzbGVlcDsKICAgICAgICBjYXNlIHRpcmVkOgogICAgICAgICAgICBkeCA9IC0xOyBkeSA9IC0xOyBnb3RvIHNsZWVwOwogICAgICAgIGNhc2UgbGVmdF9iZWhpbmQ6CiAgICAgICAgICAgIGR4ID0gLTE7IGR5ID0gMTsgZ290byBzbGVlcDsKICAgICAgICBjYXNlIG1hZDoKICAgICAgICAgICAgZHggPSAxOyBnb3RvIHNsZWVwOwogICAgICAgIGNhc2UgYmV0cmF5ZWQ6CiAgICAgICAgICAgIGR4ID0gMTsgZHkgPSAtMTsgZ290byBzbGVlcDsKICAgICAgICBjYXNlIGFmcmFpZDoKICAgICAgICAgICAgZHggPSAxOyBkeSA9IDE7IGdvdG8gc2xlZXA7CiAgICAgICAgY2FzZSBwZXNzaW1pc3RpYzoKICAgICAgICAgICAgZHkgPSAtMTsgZ290byBzbGVlcDsKICAgICAgICBjYXNlIGRvd246CiAgICAgICAgICAgIGR5ID0gMTsgZ290byBzbGVlcDsKICAgICAgc2xlZXA6cG9kdXNoa2FbKHgrZHgpJXBfeCArICh5K2R5KSVwX3kqcF94XSA9IEJPRFkobXkpID8gbXkgLSAweDEwMDAwIDogbXlfc291bCArIE1ZX0xJRkU7CiAgICAgICAgICAgIHBvZHVzaGthW3ggKyBwX3gqeV0gPSBteV9oYXBwaW5lc3M+Pjg7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybjsKICAgIH0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2W10pIHsKICAgIC8vY291dDw8IkJvcm1hbmQ6IFwiIiA8PCBib3JtYW5kIDw8ICJcIlxuIjsKICAgIHBvZHVzaGthWzgrcF94KjldID0gMTsKICAgIC8vIFRlc3QKICAgIC8vcHJpbnQyKCk7CiAgICBmb3IgKGludCB0ID0gMDsgdDwyMDsgKyt0KSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8cF94KnBfeTsgKytpKQogICAgICAgICAgICBtYWtlX2xvdmUoaSVwX3gsIGkvcF94KTsKICAgICAgICAvL2NvdXQgPDwgInN0ZXA6ICI8PHQ8PGVuZGw7CiAgICAgICAgLy9wcmludDIoKTsKICAgIH0KICAgIGZvciAoaW50IGogPSAwOyBqPHBfeTsgKytqKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8cF94OyArK2kpIHsKICAgICAgICAgICAgYXV0byBjID0gcG9kdXNoa2FbaStwX3gqal07CiAgICAgICAgICAgIHB1dGNoYXIoKGM+MHgyMCAmJiBjIDwweDdlKT8oY2hhciljOicgJyk7CiAgICAgICAgfQogICAgICAgIGNvdXQ8PGVuZGw7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==