読者です 読者をやめる 読者になる 読者になる

The Game of Life

http://d.hatena.ne.jp/giveup/20080505

もう少し練ってみた。

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>

#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))

void l(_Bool mas[2][10][10],int o,int n) {
  for(int x=0;x<10;x++)
    for(int c,y=0;c=0,y<10;mas[n][x][y]=c==3||(c==4&&mas[o][x][y]),y++)
      for(int xx=MAX(x-1,0);xx<=MIN(x+1,9);xx++)
        for(int yy=MAX(y-1,0);yy<=MIN(y+1,9);yy++)
          c+=mas[o][xx][yy];
}

void p(_Bool (*o)[10],int step) {
  printf("\x1b\x5b\x32\x4a\x1b\x5b\x48%d step\n",step);
  for(int x=0;x<10;x++,putchar('\n'))
    for(int y=0;y<10;y++)
      putchar("-O"[o[x][y]]);
}

int main(void) {
  _Bool mas[2][10][10] = {
    {
      {0,1,0,0,1,0,0,1,0,0},
      {0,0,1,0,0,0,1,1,0,0},
      {0,1,1,1,0,0,0,1,1,0},
      {0,1,0,0,0,1,1,0,1,0},
      {0,0,0,1,1,0,0,0,0,0},
      {0,1,1,1,0,0,0,0,1,1},
      {0,0,1,0,1,0,0,1,0,0},
      {1,1,1,0,0,0,1,0,1,0},
      {0,0,0,0,1,0,0,0,0,1},
      {0,0,1,1,1,0,0,1,0,0},
    },
  };

  for(int i=0,o=0,n=1;i<100&&memcmp(mas[0],mas[1],100*sizeof(_Bool));i++,n^=o^=n^=o) {
    l(mas,o,n);
    p(mas[o],i);
    usleep(100000);
  }
  return 0;
}