home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 246_01 / cycle22.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-10-29  |  4.8 KB  |  237 lines

  1.  
  2.  
  3.  
  4. /* CYCLE22.C                     */
  5. /* program to analyze the cycles of a cellular   */
  6. /* automaton and report all the periodic states. */
  7. /* [Harold V. McIntosh, 21 May 1987]         */
  8.  
  9. # include <stdio.h>
  10.  
  11. # define KK     2            /* number of states/cell    */
  12. # define NS      6            /* number of distinct sums    */
  13. # define NW    24            /* pause after so many lines    */
  14.  
  15. int  arr1[16], arr2[16];
  16. unsigned int arry[16384];
  17. int  binrule[KK][KK][KK][KK][KK], rule[NS];
  18. int  cy, cp, mc, nc, nl;
  19.  
  20. main() {
  21. int  i;
  22.  
  23. printf("Rule number:\n\n");
  24. printf("0....1\n");
  25. for (i=0; i<NS; i++) rule[i]=kbdin()-'0';
  26. printf("\n");
  27.  
  28. totobin();
  29.  
  30. nc=0;
  31. nl=0;
  32.  
  33. printf("Cycles of length 4"); kwait(0);
  34.  mc=7;
  35.  cy=4;
  36.  cp=16;
  37.  pass1();
  38.  pass2();
  39.  pass4();
  40.  
  41. printf("Cycles of length 5"); kwait(0);
  42.  mc=6;
  43.  cy=5;
  44.  cp=32;
  45.  pass1();
  46.  pass2();
  47.  pass4();
  48.  
  49. printf("Cycles of length 6"); kwait(0);
  50.  mc=5;
  51.  cy=6;
  52.  cp=64;
  53.  pass1();
  54.  pass2();
  55.  pass4();
  56.  
  57. printf("Cycles of length 7"); kwait(0);
  58.  mc=4;
  59.  cy=7;
  60.  cp=128;
  61.  pass1();
  62.  pass2();
  63.  pass4();
  64.  
  65. printf("Cycles of length 8"); kwait(0);
  66.  mc=4;
  67.  cy=8;
  68.  cp=256;
  69.  pass1();
  70.  pass2();
  71.  pass4();
  72.  
  73. printf("Cycles of length 9"); kwait(0);
  74.  mc=3;
  75.  cy=9;
  76.  cp=512;
  77.  pass1();
  78.  pass2();
  79.  pass4();
  80.  
  81. printf("Cycles of length 10"); kwait(0);
  82.  mc=3;
  83.  cy=10;
  84.  cp=1024;
  85.  pass1();
  86.  pass2();
  87.  pass4();
  88.  
  89. printf("Cycles of length 11"); kwait(0);
  90.  mc=3;
  91.  cy=11;
  92.  cp=2048;
  93.  pass1();
  94.  pass2();
  95.  pass4();
  96.  
  97. printf("Cycles of length 12"); kwait(0);
  98.  mc=2;
  99.  cy=12;
  100.  cp=4096;
  101.  pass1();
  102.  pass2();
  103.  pass4();
  104.  
  105. printf("Cycles of length 13"); kwait(0);
  106.  mc=2;
  107.  cy=13;
  108.  cp=8192;
  109.  pass1();
  110.  pass2();
  111.  pass4();
  112.  
  113. printf("Cycles of length 14"); kwait(0);
  114.  mc=2;
  115.  cy=14;
  116.  cp=16384;
  117.  pass1();
  118.  pass2();
  119.  pass4();
  120.  
  121. } /* end main */
  122.  
  123. /* Pass 1 makes arry[i] equal to the successor of i */
  124.  
  125. pass1() {int i, j, x;
  126.   printf(" Pass1\015");
  127.   for (j=0; j<cp; j++) {
  128.     x=j; for (i=0; i<cy; i++) {arr1[cy-i-1]=x%KK; x/=KK;};
  129.     evolve(cy);
  130.     x=0; for (i=0; i<cy; i++) x=KK*x+arr2[i]; arry[j]=x;
  131.   }; }
  132.  
  133. /* calculate one generation of evolution in a ring of length n */
  134.  
  135. evolve(n) int n; {
  136. int i;
  137.   arr2[0]=binrule[arr1[n-2]][arr1[n-1]][arr1[0]][arr1[1]][arr1[2]];
  138.   arr2[1]=binrule[arr1[n-1]][arr1[0]][arr1[1]][arr1[2]][arr1[3]];
  139.   for (i=2; i<n-2; i++) arr2[i]=binrule[arr1[i-2]][arr1[i-1]][arr1[i]][arr1[i+1]][arr1[i+2]];
  140.   arr2[n-1]=binrule[arr1[n-3]][arr1[n-2]][arr1[n-1]][arr1[0]][arr1[1]];
  141.   arr2[n-2]=binrule[arr1[n-4]][arr1[n-3]][arr1[n-2]][arr1[n-1]][arr1[0]];
  142. }
  143.  
  144. /* Pass 2 flags all links with an incoming arrow */
  145.  
  146. pass2() {int j, m, x;
  147. printf(" Pass2\015");
  148. do {
  149. m=0;
  150. for (j=0; j<cp; j++) arry[j]|=0x8000;
  151. for (j=0; j<cp; j++) {x=arry[j];
  152.  if (x!=0xFFFF) arry[x&0x7FFF]&=0x7FFF;};
  153. for (j=0; j<cp; j++) {
  154.  if ((arry[j]>0x7FFF) && (arry[j]!=0xFFFF)) {arry[j]=0xFFFF; m=1;};};
  155.  } while (m!=0);
  156. }
  157.  
  158. /* pass4 - print loops which remain */
  159.  
  160. pass4() {
  161. int j, x, y, m;
  162. printf(" pass4 \015");
  163. for (j=0; j<cp; j++) {
  164.  x=j; y=arry[j]; arry[j]=0xFFFF; m=0;
  165.  while (y!=0xFFFF) {prf(x,y); x=y; y=arry[x]; arry[x]=0xFFFF; m=1;};
  166.  if (m==1) kwait(0);
  167.  };
  168. }
  169.  
  170. /* change totalistic rule to general rule */
  171.  
  172. totobin() {
  173. int i0, i1, i2, i3, i4;
  174. for (i0=0; i0<KK; i0++) {
  175. for (i1=0; i1<KK; i1++) {
  176. for (i2=0; i2<KK; i2++) {
  177. for (i3=0; i3<KK; i3++) {
  178. for (i4=0; i4<KK; i4++) {
  179. binrule[i0][i1][i2][i3][i4]=rule[i0+i1+i2+i3+i4];
  180. };};};};};
  181. }
  182.  
  183. /* print the link */
  184.  
  185. prf(j,x) int j, x; {int i, y;
  186.   kwait(1);
  187.   y=j; for (i=0; i<cy; i++) {arr1[i]=y%KK; y/=KK;};
  188.   for (i=0; i<cy; i++) printf("%1d",arr1[i]);
  189.   printf("-");
  190.   y=x; for (i=0; i<cy; i++) {arr1[i]=y%KK; y/=KK;};
  191.   for (i=0; i<cy; i++) printf("%1d",arr1[i]);
  192.   printf("  ");
  193. }
  194.  
  195. /* print arry - for diagnostic purposes */
  196. pall() {int j;
  197. for (j=0; j<cp; j++) printf("%4d",arry[j]);
  198. }
  199.  
  200. /* print cycle - for diagnostic purposes */
  201. pcy() {int j;
  202. for (j=0; j<cy; j++) printf("%1d",arr2[j]);
  203. }
  204.  
  205. /* limit j to interval (i,k) */
  206. int lim(i,j,k) int i, j, k;
  207.     {if (i>=j) return i; if (k<=j) return k; return j;}
  208.  
  209. /* keyboard status */
  210. kbdst() {return bdos(11)&0xFF;}
  211.  
  212. /* direct keyboard input, no echo */
  213. kbdin() {int c;
  214. if ((c=bdos(7)&0xFF)=='\0') c=(bdos(7)&0xFF)|0x80;
  215. videoputc(c,1);
  216. return c;}
  217.  
  218. /* pause at the end of a full screen */
  219. /* kwait(0) - <cr><lf> and count it  */
  220. /* kwait(1) - count columns          */
  221.  
  222. kwait(i) int i; {
  223. switch (i) {
  224.   case 0: printf("\n"); nc=0; nl++; break;
  225.   case 1: if (nc==mc) {printf("&\n"); nc=1; nl++;} else nc++; break;
  226.   default: break;};
  227. if (nl==NW) {
  228.   nl=0;
  229.   printf(" press any key to continue\015");
  230.   while (kbdst()) {};
  231.   kbdin();
  232.   printf("-                         \n");
  233.   };
  234. }
  235.  
  236. /* end */
  237.