RosettaCodeData/Task/One-dimensional-cellular-automata/C/one-dimensional-cellular-automata-2.c
Ingy döt Net b83f433714 tasks a-s
2013-04-10 23:57:08 -07:00

27 lines
514 B
C

#include <stdio.h>
char trans[] = "___#_##_";
int evolve(char c[], int len)
{
int i, diff = 0;
# define v(i) ((c[i] & 15) == 1)
# define each for (i = 0; i < len; i++)
each c[i] = (c[i] == '#');
each c[i] |= (trans[(v(i-1)*4 + v(i)*2 + v(i+1))] == '#') << 4;
each diff += (c[i] & 0xf) ^ (c[i] >> 4);
each c[i] = (c[i] >> 4) ? '#' : '_';
# undef each
# undef v
return diff;
}
int main()
{
char c[] = "_###_##_#_#_#_#__#__\n";
do { printf(c + 1); } while (evolve(c + 1, sizeof(c) - 3));
return 0;
}