Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <time.h>
- #define MAX_METH 6
- #define STR_NTR 10
- int ascii_char_num(char q[], int l) {
- //printf("ascii_char_num(char q[],int l==%d)\n",l);
- int n[l];
- int i;
- int b;
- int r=0;
- for (i=0;i<l;i++) {
- if (q[i]=='\0') {
- //printf("NULL at %d\n",i);
- b=i;
- break;
- }
- }
- for (i=0;i<l;i++) {
- n[i]=(int)q[i];
- //printf("n[%d](%d)=q[i](%c)\n",i,n[i],q[i]);
- }
- for (i=0;i<b;i++) {
- if (n[i]>=48 && n[i]<58) {
- //printf("Entered Digit.\n");
- r=r*10+(n[i]-48);
- }
- else {
- //printf("Entered %c\n",q[i]);
- //getchar();
- return -1;
- }
- }
- //getchar();
- return r;
- }
- float floor_1(float a) {
- //printf("floor_1(float %.2f)\n",a);
- int b=a;
- return (float) b;
- }
- void disp_line(int xsize, int ctr, int t){
- int i;
- //int l1=(int)floor_1((float)xsize/2);
- //int l2=xsize%2;
- for (i=0;i<(xsize-2+t);i++) {
- printf("-");
- }
- printf("%.4X",ctr);
- for (i=0;i<(xsize-2+t);i++) {
- printf("-");
- }
- printf("\n");
- }
- void disp_grid(int *g, int type, int y, int x, char c1, char c2, int ctr) {
- //printf("disp_grid(int g[])\n");
- srand(time(NULL));
- int i1,i2;
- char c3;
- disp_line(x,ctr,type);
- switch (type) {
- case 0: {
- for (i1=0;i1<y;i1++) {
- for (i2=0;i2<x;i2++) {
- printf("%d ",g[i1*x+i2]);
- }
- printf("\n");
- }
- break;
- }
- case 1: {
- for (i1=0;i1<y;i1++) {
- printf("|");
- for (i2=0;i2<x;i2++) {
- if (g[i1*x+i2]==0) {
- printf("%c ",c1);
- }
- else if (g[i1*x+i2]==1) {
- printf("%c ",c2);
- }
- else {
- printf("error disp_grid 2[i1 i2][%d %d]=%d\n",i1,i2,g[i1*x+i2]);
- }
- }
- printf("|\n");
- }
- break;
- }
- case 2: {
- for (i1=0;i1<y;i1++) {
- for (i2=0;i2<x;i2++) {
- if (g[i1*x+i2]==1) {
- printf("%.3d ",i1*x+i2);
- }
- else {
- printf(" ");
- }
- }
- printf("\n");
- }
- break;
- }
- case 3: {
- c3=(char)(rand()%93+33);
- for (i1=0;i1<y;i1++) {
- for (i2=0;i2<x;i2++) {
- if (g[i1*x+i2]==0) {
- printf(" ");
- }
- else if (g[i1*x+i2]==1) {
- printf("%c ",c3);
- }
- else {
- printf("error disp_grid 2[i1 i2][%d %d]=%d\n",i1,i2,g[i1*x+i2]);
- }
- }
- printf("\n");
- }
- break;
- }
- case 4: {
- for (i1=0;i1<y;i1++) {
- for (i2=0;i2<x;i2++) {
- if (g[i1*x+i2]==0) {
- printf(" ");
- }
- else if (g[i1*x+i2]==1) {
- c3=(char)(rand()%93+33);
- printf("%c ",c3);
- }
- else {
- printf("error disp_grid 2[i1 i2][%d %d]=%d\n",i1,i2,g[i1*x+i2]);
- }
- }
- printf("\n");
- }
- break;
- }
- default: {
- printf("error switch: %d disp_grid\n",type);
- break;
- }
- }
- //printf("\n");
- }
- void n_locate(int *m, int y, int x, int type, int magn, int ysize, int xsize){
- /*
- 0 E
- 1 N
- 2 S
- 3 W
- 4 NE
- 5 NW
- 6 SW
- 7 SE
- 8 ENE
- 9 NNE
- 10 NNW
- 11 WNW
- 12 WSW
- 13 SSW
- 14 SSE
- 15 ESE
- */
- int yalt=ysize-magn;
- int xalt=xsize-magn;
- if (magn<0 || type>3) {
- printf("error n_locate type:%d magnitude:%d\n",type,magn);
- return;
- }
- while (yalt<0) {
- yalt=yalt+ysize;
- }
- while (xalt<0) {
- xalt=xalt+xsize;
- }
- /*
- 2 5 3 5 1 5 3 5 2
- 5 2 4 4 1 4 4 2 5
- 3 4 2 3 1 3 2 4 3
- 5 4 3 2 1 2 3 4 5
- 1 1 1 1 0 1 1 1 1
- 5 4 3 2 1 2 3 4 5
- 3 4 2 3 1 3 2 4 3
- 5 2 4 4 1 4 4 2 5
- 2 5 3 5 1 5 3 5 2
- 2_4 5_1 3_2 5_1 1_4 5_1 3_2 5_1 2_4
- 5_1 2_3 4_1 4_1 1_3 4_1 4_1 2_3 5_1
- 3_2 4_1 2_2 3_1 1_2 3_1 2_2 4_1 3_2
- 5_1 4_1 3_1 2_1 1_1 2_1 3_1 4_1 5_1
- 1_4 1_3 1_2 1_1 0_0 1_1 1_2 1_3 1_4
- 5_1 4_1 3_1 2_1 1_1 2_1 3_1 4_1 5_1
- 3_2 4_1 2_2 3_1 1_2 3_1 2_2 4_1 3_2
- 5_1 2_3 4_1 4_1 1_3 4_1 4_1 2_3 5_1
- 2_4 5_1 3_2 5_1 1_4 5_1 3_2 5_1 2_4
- 4 1 2 1 4 1 2 1 4
- 1 3 1 1 3 1 1 3 1
- 2 1 2 1 2 1 2 1 2
- 1 1 1 1 1 1 1 1 1
- 4 3 2 1 0 1 2 3 4
- 1 1 1 1 1 1 1 1 1
- 2 1 2 1 2 1 2 1 2
- 1 3 1 1 3 1 1 3 1
- 4 1 2 1 4 1 2 1 4
- */
- switch (type) {
- case 0: {
- m[0]=y*xsize+x;
- printf("NULL\n");
- break;
- }
- case 1: {
- m[0]=y*xsize+(x+magn)%xsize;
- m[1]=((y+magn)%ysize)*xsize+x;
- m[2]=y*xsize+(x+xalt)%xsize;
- m[3]=((y+yalt)%ysize)*xsize+x;
- break;
- }
- case 2: {
- m[0]=((y+1*magn)%ysize)*xsize+(x+1*magn)%xsize;
- m[1]=((y+1*magn)%ysize)*xsize+(x+1*xalt)%xsize;
- m[2]=((y+1*yalt)%ysize)*xsize+(x+1*xalt)%xsize;
- m[3]=((y+1*yalt)%ysize)*xsize+(x+1*magn)%xsize;
- break;
- }
- case 3: {
- m[0]=((y+1*magn)%ysize)*xsize+(x+2*magn)%xsize;//2 right, 1 up
- m[1]=((y+2*magn)%ysize)*xsize+(x+1*magn)%xsize;//2 up, 1 right
- m[2]=((y+2*magn)%ysize)*xsize+(x+1*xalt)%xsize;//2 up, 1 left
- m[3]=((y+1*magn)%ysize)*xsize+(x+2*xalt)%xsize;//2 left, 1 up
- m[4]=((y+1*yalt)%ysize)*xsize+(x+2*xalt)%xsize;//2 left, 1 down
- m[5]=((y+2*yalt)%ysize)*xsize+(x+1*xalt)%xsize;//2 down, 1 left (to go)
- m[6]=((y+2*yalt)%ysize)*xsize+(x+1*magn)%xsize;//2 down, 1 right
- m[7]=((y+1*yalt)%ysize)*xsize+(x+2*magn)%xsize;//2 right, 1 down
- break;
- }
- case 4: {
- printf("THIS IS SUICIDE\n");
- m[0]=((y+1*magn)%ysize)*xsize+(x+3*magn)%xsize;//3 right, 1 up
- m[1]=((y+2*magn)%ysize)*xsize+(x+3*magn)%xsize;//3 right, 2 up
- m[2]=((y+3*magn)%ysize)*xsize+(x+2*magn)%xsize;//3 up, 2 right
- m[3]=((y+3*magn)%ysize)*xsize+(x+1*magn)%xsize;//3 up, 1 right
- m[4]=((y+3*magn)%ysize)*xsize+(x+1*xalt)%xsize;//3 up, 1 left
- m[5]=((y+3*magn)%ysize)*xsize+(x+3*xalt)%xsize;//3 up, 2 left
- m[6]=((y+2*magn)%ysize)*xsize+(x+3*xalt)%xsize;//3 left, 2 up
- m[7]=((y+1*magn)%ysize)*xsize+(x+3*xalt)%xsize;//3 left, 1 up
- m[8]=((y+1*yalt)%ysize)*xsize+(x+3*xalt)%xsize;//3 left, 1 down
- m[9]=((y+2*yalt)%ysize)*xsize+(x+3*xalt)%xsize;//3 left, 2 down
- m[10]=((y+3*yalt)%ysize)*xsize+(x+2*xalt)%xsize;//3 down, 2 left (to go)
- m[11]=((y+3*yalt)%ysize)*xsize+(x+1*xalt)%xsize;//3 down, 1 left (to go)
- m[12]=((y+3*yalt)%ysize)*xsize+(x+1*magn)%xsize;//3 down, 1 right
- m[13]=((y+3*yalt)%ysize)*xsize+(x+2*magn)%xsize;//3 down, 2 right
- m[14]=((y+2*yalt)%ysize)*xsize+(x+3*magn)%xsize;//3 right, 2 down
- m[15]=((y+1*yalt)%ysize)*xsize+(x+3*magn)%xsize;//3 right, 1 down
- break;
- }
- case 5: {
- printf("ULTRA UBER SUICIDE\n");
- m[0]=((y+1*magn)%ysize)*xsize+(x+3*magn)%xsize;//5 right, 1 up
- m[1]=((y+2*magn)%ysize)*xsize+(x+3*magn)%xsize;//5 right, 4 up
- m[2]=((y+3*magn)%ysize)*xsize+(x+2*magn)%xsize;//5 up, 4 right
- m[3]=((y+3*magn)%ysize)*xsize+(x+1*magn)%xsize;//5 up, 1 right
- m[4]=((y+3*magn)%ysize)*xsize+(x+1*xalt)%xsize;//5 up, 1 left
- m[5]=((y+3*magn)%ysize)*xsize+(x+3*xalt)%xsize;//5 up, 4 left
- m[6]=((y+2*magn)%ysize)*xsize+(x+3*xalt)%xsize;//5 left, 4 up
- m[7]=((y+1*magn)%ysize)*xsize+(x+3*xalt)%xsize;//5 left, 1 up
- m[8]=((y+1*yalt)%ysize)*xsize+(x+3*xalt)%xsize;//5 left, 1 down
- m[9]=((y+2*yalt)%ysize)*xsize+(x+3*xalt)%xsize;//5 left, 4 down
- m[10]=((y+3*yalt)%ysize)*xsize+(x+2*xalt)%xsize;//5 down, 4 left (to go)
- m[11]=((y+3*yalt)%ysize)*xsize+(x+1*xalt)%xsize;//5 down, 1 left (to go)
- m[12]=((y+3*yalt)%ysize)*xsize+(x+1*magn)%xsize;//5 down, 1 right
- m[13]=((y+3*yalt)%ysize)*xsize+(x+2*magn)%xsize;//5 down, 4 right
- m[14]=((y+2*yalt)%ysize)*xsize+(x+3*magn)%xsize;//5 right, 4 down
- m[15]=((y+1*yalt)%ysize)*xsize+(x+3*magn)%xsize;//5 right, 1 down
- break;
- }
- default: {
- printf("type=%d?!?1 ARE YOU NUTS1?!!???!?!1111111111111\n",type);
- break;
- }
- }
- }
- int meth0(int g[], int y, int x, int xs, int ys) {
- int m[4], v[4];
- int i;
- int sum=0;
- n_locate(m,y,x,1,1,ys,xs);
- for (i=0;i<4;i++) {
- v[i]=g[m[i]];
- }
- for (i=0;i<4;i++) {
- sum=sum+v[i];
- }
- if (sum==0||sum==4) {
- return 0;
- }
- else {
- return 1;
- }
- }
- int meth1(int g[], int y, int x, int ys, int xs) {
- int m[4], v[4];
- int i;
- int sum=0;
- n_locate(m,y,x,1,1,ys,xs);
- for (i=0;i<4;i++) {
- v[i]=g[m[i]];
- }
- for (i=0;i<4;i++) {
- sum=sum+v[i];
- }
- if (sum>1 && sum<4) {
- return 1;
- }
- else {
- return 0;
- }
- }
- int meth2(int g[], int y, int x, int ys, int xs) {
- int m[4], v[4];//east0 north1 west2 south3
- int i;
- int sum=0;
- n_locate(m,y,x,1,1,ys,xs);
- for (i=0;i<4;i++) {
- v[i]=g[m[i]];
- }
- for (i=0;i<4;i++) {
- sum=sum+v[i];
- }
- return sum%2;
- }
- int meth3(int g[], int y, int x, int ys, int xs, int ctr) {
- int m1[4],m2[4];
- int v[8];
- int i;
- int c;
- c=ctr%4;
- n_locate(m1,y,x,1,1,ys,xs);
- n_locate(m2,y,x,2,1,ys,xs);
- for (i=0;i<4;i++) {
- v[i*2]=g[m1[i]];
- v[i*2+1]=g[m2[i]];
- }
- if ((v[c]+v[4+c]==1)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- int meth4(int g[], int y, int x, int ys, int xs, int ctr) {
- int m1[4],m2[4];
- int v[8];
- int i;
- int c;
- c=ctr%4+2*(int)floor_1((float)(ctr%4)/2);
- if ((c!=0)&&(c!=1)&&(c!=4)&&(c!=5)) {
- printf("error c meth4 c=%d\n",c);
- }
- /*
- switch (ctr%4) {
- case 0:{
- c=0;
- break;
- }
- case 1:{
- c=1;
- break;
- }
- case 2:{
- c=4;
- break;
- }
- case 3:{
- c=5;
- break;
- }
- default:{
- printf("error meth4switch\n");
- c=0;
- break;
- }
- }
- */
- n_locate(m1,y,x,1,1,ys,xs);
- n_locate(m2,y,x,2,1,ys,xs);
- for (i=0;i<4;i++) {
- v[i]=g[m1[i]];
- v[i+4]=g[m2[i]];
- }
- if ((v[c]+v[2+c]==1)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- int meth5(int g[], int y, int x, int ys, int xs, int ctr , int o) {
- //meth5 has capabilities of meth3&4 as well as more compatibility
- int m1[4],m2[4];
- int v[8];
- int i;
- n_locate(m1,y,x,1,1,ys,xs);
- n_locate(m2,y,x,2,1,ys,xs);
- for (i=0;i<4;i++) {
- v[i*2]=g[m1[i]];
- v[i*2+1]=g[m2[i]];
- }
- if ((v[ctr%8]+v[(o+ctr)%8]==1)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- int meth6(int g[], int y, int x, int ys, int xs) {
- int m1[4],m2[4];
- int v[8];
- int i;
- int sum=0;
- n_locate(m1,y,x,1,1,ys,xs);
- n_locate(m2,y,x,2,1,ys,xs);
- for (i=0;i<4;i++) {
- v[i]=g[m1[i]];
- v[i+4]=g[m2[i]];
- }
- for (i=0;i<4;i++) {
- sum=sum+2*v[i]+v[i+4];
- }
- if (sum>=4 && sum<=5) {
- return 1;
- }
- return 0;
- }
- void step(int *g,int meth, int ysize, int xsize, int counter) {
- //printf("step(int *g)\n");
- int i1,i2;
- int g_f[xsize*ysize];
- switch (meth) {
- case 0: {
- for (i1=0;i1<ysize;i1++) {
- for (i2=0;i2<xsize;i2++) {
- g_f[i1*xsize+i2]=meth0(g,i1,i2,ysize,xsize);
- }
- }
- break;
- }
- case 1: {
- for (i1=0;i1<ysize;i1++) {
- for (i2=0;i2<xsize;i2++) {
- g_f[i1*xsize+i2]=meth1(g,i1,i2,ysize,xsize);
- }
- }
- break;
- }
- case 2: {
- for (i1=0;i1<ysize;i1++) {
- for (i2=0;i2<xsize;i2++) {
- g_f[i1*xsize+i2]=meth2(g,i1,i2,ysize,xsize);
- }
- }
- break;
- }
- case 3: {
- for (i1=0;i1<ysize;i1++) {
- for (i2=0;i2<xsize;i2++) {
- g_f[i1*xsize+i2]=meth3(g,i1,i2,ysize,xsize,counter);
- }
- }
- break;
- }
- case 4: {
- for (i1=0;i1<ysize;i1++) {
- for (i2=0;i2<xsize;i2++) {
- g_f[i1*xsize+i2]=meth4(g,i1,i2,ysize,xsize,counter);
- }
- }
- break;
- }
- case 5: {
- for (i1=0;i1<ysize;i1++) {
- for (i2=0;i2<xsize;i2++) {
- g_f[i1*xsize+i2]=meth5(g,i1,i2,ysize,xsize,counter,2);
- }
- }
- break;
- }
- case 6: {
- for (i1=0;i1<ysize;i1++) {
- for (i2=0;i2<xsize;i2++) {
- g_f[i1*xsize+i2]=meth6(g,i1,i2,ysize,xsize);
- }
- }
- break;
- }
- default:
- printf("bad entry number, kill now\n");
- break;
- }
- for (i1=0;i1<ysize;i1++) {
- for (i2=0;i2<xsize;i2++) {
- g[i1*xsize+i2]=g_f[i1*xsize+i2];
- }
- }
- }
- void zero_grid(int *g,int ysize,int xsize) {
- //printf("zero_grid(int *g)\n");
- int i1,i2;
- for (i1=0;i1<ysize;i1++) {
- for (i2=0;i2<xsize;i2++) {
- g[i1*xsize+i2]=0;
- }
- }
- }
- int* load_file (int *ysize,int *xsize,int sw1){
- int i1,i2;
- int *g;
- FILE *f;
- f=fopen("/Developer/XCode_Debugs/Cell_Auto/grid.txt","r");
- fscanf(f,"%d %d",xsize,ysize);
- switch (sw1) {
- case 0: {
- fclose (f);
- break;
- }
- case 1: {
- g=(int*)malloc(sizeof(int)*(*ysize * *xsize));
- for(i1=0;i1<*ysize;i1++){
- for(i2=0;i2<*xsize;i2++){
- fscanf (f,"%d",&g[i1* *xsize+i2]);
- }
- }
- fclose (f);
- return g;
- break;
- }
- default: {
- printf("switch error load_file\n");
- fclose (f);
- break;
- }
- }
- return 0;
- }
- void write_file(int g[], int y, int x){
- int i1,i2;
- FILE *f;
- f=fopen("/Developer/XCode_Debugs/Cell_Auto/grid.txt","w");
- fprintf(f,"%d %d \n",x,y);
- for (i1=0;i1<y;i1++) {
- for (i2=0;i2<x;i2++) {
- fprintf(f,"%d ",g[i1*x+i2]);
- }
- fprintf(f,"\n");
- }
- fclose (f);
- }
- void init_str(char *s,int l){
- //printf("init_str(char *s,int l)\n");
- int i;
- for (i=0;i<l;i++) {
- s[i]=0;
- }
- }
- int ques1(){
- //printf("ques1()\n");
- char ans[STR_NTR];
- int b;
- while (1) {
- printf("Continue entering switches? (1) yes (2) no: ");
- scanf("%s",ans);
- b=ascii_char_num(ans,STR_NTR);
- if (b<1 || b>2) {
- printf("what? ");
- }
- else {return 2-b;}
- }
- }
- int ques2(int max_mth) {
- int mth;
- char entry[STR_NTR];
- do {
- printf("Select Method 0 - %d: ",max_mth);
- scanf("%s",entry);
- mth=ascii_char_num(entry,STR_NTR);
- if (mth>max_mth || mth<0) {
- printf("what? ");
- }
- } while (mth>max_mth || mth<0);
- return mth;
- }
- int* init_grid(int *ys,int *xs,int *f,int sw1) {
- //printf("init_grid(int *g)\n");
- char s0[STR_NTR], s1[STR_NTR];
- int b1=0;
- int d1;
- int *g;
- //int xs1,ys1;
- init_str(s0,STR_NTR);
- init_str(s1,STR_NTR);
- switch (sw1) {
- case 0: {
- while (1) {
- printf("(1) Load file or (2) manual: ");
- scanf("%s",s0);
- *f=ascii_char_num(s0,STR_NTR);
- if (*f==1) {
- load_file(ys,xs,0);
- break;
- }
- else if (*f==2) {
- printf("Please enter dimensions: X Y ");
- scanf("%d %d",xs,ys);
- break;
- }
- else {
- printf("what? ");
- }
- }
- return 0;
- break;
- }
- case 1:{
- while (1) {
- if (*f==1) {
- g=load_file(ys,xs,1);
- break;
- }
- else if (*f==2) {
- printf("Now creating blank matrix\n");
- g=(int*)malloc(sizeof (int)*((*xs)*(*ys)));
- break;
- }
- else {
- printf("error switch 2\n ");
- break;
- }
- }
- do {
- disp_grid(g,0,*ys,*xs,' ','X',0);
- printf("Pick your starting switches\n");
- scanf("%s",s1);
- d1=ascii_char_num(s1,STR_NTR);
- if (d1<0 || d1>=*xs* *ys) {
- b1=1-ques1();
- }
- else {
- g[d1]=(g[d1]+1)%2;
- }
- }
- while (b1==0);
- init_str(s0,STR_NTR);
- printf("Save Grid: (1) yes (2) no: ");
- getchar();
- scanf("%c",s0);
- if (ascii_char_num(s0,STR_NTR)==1) {
- write_file(g,*ys,*xs);
- }
- return g;
- break;
- }
- default:
- break;
- }
- printf("error init_grid\n");
- return 0;
- }
- int main (int argc, const char * argv[]) {
- int *grid;
- //char entry[STR_NTR];
- int method=2;
- int c=0;
- int ysize,xsize;
- int file_f;
- init_grid(&ysize,&xsize,&file_f,0);
- grid=(int*)malloc(sizeof (int)*((ysize)*(xsize)));
- grid=init_grid(&ysize,&xsize,&file_f,1);
- //disp_grid(grid,0,ysize,xsize,' ','X');
- method=ques2(MAX_METH);
- getchar();
- //for (i1=0;i1<16;i1++) {
- while (1) {
- disp_grid(grid,1,ysize,xsize,' ','*',c);
- getchar();
- //sleep(1);
- step(grid,method,ysize,xsize,c);
- c++;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment