#include #include #include #include // stack table: 0 ROT,1 TUCK,2 OVER,3 DUP,4 EMIT,5 NIP,6 SWAP,7 DROP // arith words: 0 + 1 - 2 * 3 XOR 4 AND 5 OR 6 MAX 7 MIN 8 LSH 9 RSH static uint8_t P[2][1024]; static int PL[2]; static uint8_t X[2][32]; static int XL[2]; static int run(int k,int *perm){ uint64_t s[1024]; int sp=0, o=0; for(int i=0;i=XL[k] || (uint8_t)s[sp]!=X[k][o]) return 0; o++; break; case 5: if(sp<2)return 0; s[sp-2]=s[sp-1]; sp--; break; case 6: if(sp<2)return 0; {uint64_t t=s[sp-1]; s[sp-1]=s[sp-2]; s[sp-2]=t;} break; case 7: if(sp<1)return 0; sp--; break; } } else if(b>=0x10 && b<=0x19){ if(sp<2) return 0; uint64_t c=s[--sp], a=s[sp-1], r; switch(perm[b-0x10]){ case 0:r=a+c;break; case 1:r=a-c;break; case 2:r=a*c;break; case 3:r=a^c;break; case 4:r=a&c;break; case 5:r=a|c;break; case 6:r=a>c?a:c;break; case 7:r=a>c:0;break; } s[sp-1]=r; } else s[sp++]=b; } return o==XL[k]; } static int perm[10], used[10]; static long cnt=0; static void rec(int d){ if(d==10){ if(run(0,perm)&&run(1,perm)){ cnt++; for(int i=0;i<10;i++)printf("%d ",perm[i]); printf("\n"); } return; } for(int v=0;v<10;v++) if(!used[v]){used[v]=1;perm[d]=v;rec(d+1);used[v]=0;} } static void load(int k,const char*f,const char*hex){ FILE*fp=fopen(f,"rb"); PL[k]=fread(P[k],1,1024,fp); fclose(fp); XL[k]=0; for(const char*h=hex;*h;h+=2) {unsigned v; sscanf(h,"%2x",&v); X[k][XL[k]++]=v;} } int main(){ load(0,"files/universal_translator/samples/sample_03.bin","1837393923"); load(1,"files/universal_translator/samples/sample_04.bin","3B3311083E100140080008"); rec(0); fprintf(stderr,"%ld sols\n",cnt); }