#include #include #include #define siez 19*19 #define rules 108 struct fractal_info { unsigned short rule_num; unsigned short size;/*whole size */ unsigned short block_size; unsigned short block_num; unsigned short rule2; unsigned short rule3; } pixel; char rule[rules][35]={0}; int rule_3to9[rules][10]={0};/*0-8:rule[n]s 9: hashtag num*/ char input[4*4+3]={0};/*3x3*/ char ip_bf[81][4*4+3]={0};/*at most 18 blocks*/ char result[siez]={0}; void ro_fl(int,int,int); int parse_result(struct fractal_info *); int match_rule(struct fractal_info *); int match_ruleEX(struct fractal_info * , int *); int reconstruct(struct fractal_info *); int print_result(struct fractal_info *); int print_rule(int); int print_ip_bf(struct fractal_info *); void update_rule(struct fractal_info *); int static_hashtag(void); void print_rule_3to9(int); long int recur_sum(int,int); int main(void) { FILE * fp; int c,rn,rnn; /*-------------open file-----------------*/ if((fp=fopen("Day21.txt","r"))==NULL) printf("file open failed"); /*--------load rules into array------------*/ rnn=0;/*child subscript*/ rn=0;/*parent subscript*/ while((c=fgetc(fp))!=EOF)/*each line is one rule*/ { if(c!=0xd) {rule[rn][rnn++]=c;} else { fgetc(fp);/*0xa*/ rn++;/*new rule*/ rnn=0; } } rn++; pixel.rule_num=rn; pixel.rule2=0; pixel.rule3=6; fclose(fp); /*----------update rule 0-5--------------------*/ /* pixel.block_num=1; pixel.block_size=2; pixel.size=3; update_rule(&pixel); */ /*0-5 can not be updated*/ /*----------update rule 6-107--------------------*/ pixel.block_num=1; pixel.block_size=3; pixel.size=4; update_rule(&pixel); /*------------check updated rules------------------*/ /* for(rnn=0;rnnsize; int line=n+1; if(!(n%2)) { fip->block_size=2; s=(fip->size)/2;/*single side block num*/ fip->block_num=s*s; for(a=0;ablock_size=3; s=n/3; fip->block_num=s*s; for(a=0;ablock_size); print_ip_bf(fip); return 0; } int match_rule(struct fractal_info * fip) { int a,b,c,r,blocks,rn,rnn,n; blocks=fip->block_num; rn=fip->rule_num; r=fip->block_size; n=r+1;/*2=>3 3=>4*/ for(a=0;arule2; rn=fip->rule3; } else if(r==3) { rnn=fip->rule3; } for(;rnnblock_size=n; break; } } } print_ip_bf(fip); return 0; } int match_ruleEX(struct fractal_info * fip, int * rp) { /*record rule_3to9*/ parse_result(&pixel);/*result -> ip_bf*/ int a,b,c,rnn; for(a=0;a<9;a++) { b=0; for(rnn=6;rnn<108;rnn++) { memcpy(input,ip_bf[a],11); for(c=0;c<8;c++) { if(!(memcmp(rule[rnn],input,11))) { printf("ip_bf[%u] match ",a); print_rule(rnn); *rp=rnn; rp++; b=1; break; } else ro_fl(3,a,c); } if(b) break; } } return 0; } int reconstruct(struct fractal_info * fip)/*ip_bf into result one line*/ { fip->size=sqrt(fip->block_num) * fip->block_size; int blocks=fip->block_num; int side_num=sqrt(blocks); int offset,line,step; int a,b,c,e; if(fip->block_size==3) { offset=e=0; for(a=0;asize+1; } a++; step=step+3; } result[offset+(fip->size)]='/'; result[offset+(fip->size)*2+1]='/'; if(asize)*3+2]='/'; offset=offset+(fip->size)*3+3; } } else if(fip->block_size==4) { offset=e=0; for(a=0;asize+1; } a++; step=step+4; } result[offset+(fip->size)]='/'; result[offset+(fip->size)*2+1]='/'; result[offset+(fip->size)*3+2]='/'; if(asize)*4+3]='/'; offset=offset+(fip->size)*4+4; } } else if(fip->block_size==2) { offset=0; for(a=0;a<4;)/*4 blocks*/ { step=0; for(b=0;b<2;b++)/*1 line 2 block*/ { line=e=0; for(c=0;c<2;c++)/*1 block 2 line*/ { result[offset+step+line+0]=ip_bf[a][e++]; result[offset+step+line+1]=ip_bf[a][e++]; e++;/*jump over '/' in block*/ line+=5;/*next line*/ } a++; step+=2; } result[offset+4]='/'; if(a<4) result[offset+9]='/'; offset+=10; } } print_result(fip); return 0; } void update_rule(struct fractal_info * fip) { /* rule -> result result -parsed-> ip_bf ip_bf -change-> new ip_bf new ip_bf -reconstruct-> result result -> rule */ int a,b,c,d,ri,ro,rs,re,cs,ce,rnn,n; ri=fip->block_size;/*rule input*/ ro=fip->size;/*rule output*/ if(ri==2)/*0-5*/ { cs=0;ce=6;/*update scale*/ rs=6;re=108;/*match scale*/ } else if(ri==3)/*6-107*/ { cs=6;ce=108; rs=0;re=6; } int offset,len; offset=ri*ri+(ri-1)+4;/*rule output offset*/ len=ro; len=len*len+(len-1);/*output length*/ for(rnn=cs;rnn result*/ fip->size=ro; parse_result(fip);/*result -> ip_bf*/ n=fip->block_size;/*ip_bf length*/ for(a=0;ablock_num;a++)/*ip_bf s*/ { d=0; for(b=rs;bsize; cn=n*n+n-1;/*charters sum*/ printf("result\n"); for(a=0;ablock_num; int len=fip->block_size; len=len*len+(len-1); int a,b; printf("ip_bf\n"); for(a=0;a1*/ { for(a=0;a<9;a++) s+=recur_sum(rule_3to9[r][a],n-1); } return s; }