#include"lib.h" fc fi, fo; int mot[1000000], code[1000], mot2[1000000]; int i, j, s, k, size, x, nb, mnb, pos, a_o, a_i, lim; char mode[20]; int ok(){ if(mnb < nb) {printf("nb=%d", mnb = nb); date("");} for(k = 0; k < size; k++) if(mot[k+(nb-2)*size] > mot[k+(nb-1)*size]) break; else if(mot[k+(nb-2)*size] < mot[k+(nb-1)*size]){ i -= size; return 0;}//*/ for(*code = x = 0; ;) if(!fi(code, x)){ ici: while(code[x] == nb-1) if(!x--) return 1; code[x]++; }else{ s = nb-1-code[x];//optimized version //s = code[x];//old version for(k = 0; k < size; k++){ mot2[pos = k+x*size] = mot[k+s*size]; if(x && !fo(mot2, pos)) return 0; } if(x == lim-1) goto ici; else code[++x] = 0; } } int other(){ if(i >= size) for(k = i-i%size; k <= i; k++) if(mot[k] < mot[k-size]) break; else if(mot[k] > mot[k-size]){ i -= i%size+1; return 0; }//*/ for(k = 0; k <= i%size; k++) mot2[size+k] = mot[i-i%size+k]; for(k = 0; k < i/size-1; k++){ for(j = 0; j < size; j++) mot2[j] = mot[k*size+j]; if(!fo(mot2, size+i%size)) return 0; } return 1; } int A(){ for(i = 0; i < size; i++) mot[i] = 0; mnb = nb = 0; printf("%s size=%d lim=%d", mode, size, lim); date(""); for(*mot = i = 0; ;) if(!fo(mot, i) || !other()){ here: while(mot[i] == a_o-1) if(!--i) return 1; //if(nb && i < 3) return 1;//optimisation au cas par cas mot[i]++; }else if((!((i+1)%size)) && ((nb = (i+1)/size) > 1)) if(!ok()) goto here; else if(nb == a_i) break; else goto there; else there: mot[++i] = 0; for(x = 0; x < a_i; x++, printf("\n")) for(k = 0; k < size; k++) printf("%d", mot[k+x*size]); printf("OK %s size=%d lim=%d", mode, size, lim); date(""); return 0; } void usage(){ printf("Usage: gen fo [size [lim]]\n"); exit(0); } int main(int ac, char **av){ if(ac < 2) usage(); sprintf(mode, "%s", av[1]); if(!strcmp(mode, "aabaacbaab")) { a_i = 3; fi = rt3; a_o = 2; fo = aabaacbaab; }//size = 8 else if(!strcmp(mode, "aabaccb")) { a_i = 3; fi = rt3; a_o = 2; fo = aabaccb; }//size = 24 else if(!strcmp(mode, "aabba")) { a_i = 3; fi = rt3; a_o = 2; fo = aabba; }//size = 21 else if(!strcmp(mode, "aabbcabba")) { a_i = 3; fi = rt3; a_o = 2; fo = aabbcabba; }//size = else if(!strcmp(mode, "aabbcac")) { a_i = 3; fi = rt3; a_o = 2; fo = aabbcac; }//size = 86 else if(!strcmp(mode, "aabbcbc")) { a_i = 3; fi = rt3; a_o = 2; fo = aabbcbc; }//size = 34 else if(!strcmp(mode, "aabbcc")) { a_i = 3; fi = rt3; a_o = 2; fo = aabbcc; }//size = 52 else if(!strcmp(mode, "aabcbc")) { a_i = 3; fi = rt3; a_o = 2; fo = aabcbc; }//size = 46 else if(!strcmp(mode, "aabccab")) { a_i = 3; fi = rt3; a_o = 2; fo = aabccab; }//size = 34 else if(!strcmp(mode, "aabccba")) { a_i = 3; fi = rt3; a_o = 2; fo = aabccba; }//size = 56 else if(!strcmp(mode, "abaab")) { a_i = 3; fi = rt3; a_o = 2; fo = abaab; }//size = 10 else if(!strcmp(mode, "abaacbc")) { a_i = 4; fi = rt4; a_o = 2; fo = abaacbc; }//size = 17 else if(!strcmp(mode, "abaaccb")) { a_i = 3; fi = rt3; a_o = 2; fo = abaaccb; }//size = 74 else if(!strcmp(mode, "abacacb")) { a_i = 3; fi = rt3; a_o = 2; fo = abacacb; }//size = 12 else if(!strcmp(mode, "abacbc")) //{ a_i = 6; fi = rt5; a_o = 2; fo = abacbc; }//size = 29 { a_i = 4; fi = rt4; a_o = 2; fo = abacbc; }//size = 29 else if(!strcmp(mode, "abaccab")) { a_i = 3; fi = rt3; a_o = 2; fo = abaccab; }//size = 33 else if(!strcmp(mode, "abaccba")) { a_i = 3; fi = rt3; a_o = 2; fo = abaccba; }//size = 14 else if(!strcmp(mode, "abbacca")) { a_i = 3; fi = rt3; a_o = 2; fo = abbacca; }//size = 28 else if(!strcmp(mode, "abbaccb")) { a_i = 3; fi = rt3; a_o = 2; fo = abbaccb; }//size = 42 else if(!strcmp(mode, "abbcacb")) { a_i = 4; fi = rt4; a_o = 2; fo = abbcacb; }//size = 16 else if(!strcmp(mode, "abbcbac")) { a_i = 4; fi = rt4; a_o = 2; fo = abbcbac; }//size = 14 else if(!strcmp(mode, "abbcbca")) { a_i = 3; fi = rt3; a_o = 2; fo = abbcbca; }//size = 22 else if(!strcmp(mode, "abbccab")) { a_i = 3; fi = rt3; a_o = 2; fo = abbccab; }//size = 20 else if(!strcmp(mode, "abcaacb")) { a_i = 3; fi = rt3; a_o = 2; fo = abcaacb; }//size = 24 else if(!strcmp(mode, "abcacab")) { a_i = 3; fi = rt3; a_o = 2; fo = abcacab; }//size = 10 else if(!strcmp(mode, "abcacb")) { a_i = 6; fi = rt5; a_o = 2; fo = abcacb; }//size = 810 else if(!strcmp(mode, "abcbbac")) { a_i = 4; fi = rt4; a_o = 2; fo = abcbbac; }//size = 18 else if(!strcmp(mode, "fs")) { a_i = 3; fi = rt3; a_o = 2; fo = fs; }//size = 50 else if(!strcmp(mode, "sim3")) { a_i = 3; fi = rt3; a_o = 2; fo = sim3; }//size = 8 else if(!strcmp(mode, "sim4")) { a_i = 3; fi = rt3; a_o = 2; fo = sim4; }//size = 103 else if(!strcmp(mode, "sim7")) { a_i = 3; fi = rt3; a_o = 2; fo = sim7; }//size = 30 else if(!strcmp(mode, "grt23")) { a_i = 4; fi = rt4; a_o = 2; fo = grt23; }//size > 600 else if(!strcmp(mode, "grt24")) { a_i = 4; fi = rt4; a_o = 2; fo = grt24; }//size = 19 else if(!strcmp(mode, "grt25")) // { a_i = 5; fi = rt5; a_o = 2; fo = grt25; }//size > 40 { a_i = 4; fi = rt4; a_o = 2; fo = grt25; }//size > 40 else if(!strcmp(mode, "grt32")) { a_i = 4; fi = rt4; a_o = 3; fo = grt32; }//size = 3 else if(!strcmp(mode, "grt33")) { a_i = 5; fi = rt5; a_o = 3; fo = grt33; }//size = 14 else if(!strcmp(mode, "grt42")) { a_i = 6; fi = rt6; a_o = 4; fo = grt42; }//size > 30 else if(!strcmp(mode, "rt3p")) { a_i = 5; fi = rt4; a_o = 3; fo = rt3p; }//size = 59 else if(!strcmp(mode, "rt4")) { a_i = 4; fi = rt4; a_o = 4; fo = var; }//size else if(!strcmp(mode, "rt4p")) { a_i = 6; fi = rt5; a_o = 4; fo = rt4; }//size = 132 else if(!strcmp(mode, "rt5")) { a_i = 5; fi = rt5; a_o = 5; fo = rt5; }//size else if(!strcmp(mode, "rt5p")) { a_i = 7; fi = rt6; a_o = 5; fo = rt5; }//size else if(!strcmp(mode, "4to3")) { a_i = 4; fi = sqf; a_o = 3; fo = sqf; lim = 3; }//size else if(!strcmp(mode, "5to3")) { a_i = 5; fi = sqf; a_o = 3; fo = sqf; lim = 3; }//size else if(!strcmp(mode, "6to3")) { a_i = 6; fi = sqf; a_o = 3; fo = sqf; lim = 3; }//size else if(!strcmp(mode, "7to3")) { a_i = 7; fi = sqf; a_o = 3; fo = sqf; lim = 3; }//size else usage(); size = ac > 2 ? atoi(av[2]) : 1; lim = ac > 3 ? atoi(av[3]) : 20; printf("mode=%s a_i=%d a_o=%d\n", mode, a_i, a_o); for(; A() && size < 1000; size++); }