カメヲラボ

主にプログラミングとお勉強全般について書いてます

Cabric Number Problem(5)

  • 惊奇的短代码(四)

これまでのテクニックを総合して、以下のようなコードが出来る。

n;q(char*a){n=*1[&a]-*a;}
main(t,s,x){
  for(;scanf("%d",&n),~n;printf(t?"Ok!! %d times\n":"No!!\n",t-1))
    for(t=printf("N=%d:\n",n)==8&&n%1111;t&&n%6174;
      printf("%d-%d=%d\n",x,x-n,n=x-atoi(strrev(s))))
      qsort(itoa(n,s,10),4,1,q),x=atoi(s),++t;
}

これで136バイト。hinoeさんがたどり着いたコードもこんなかんじだろう。
ここからは恒例のインチキ祭りである。
入力に0が含まれていないのは間違いないが、どうやら1も含まれていないようなので、scanfの部分は

scanf("%d",&n)<n

と書くことが出来る。
さらに、%1111のところを、1111/11=101でも通ることを発見。%6174の部分も6174/63=98で通るようだ。テストケースは4digitになっていない値ばかりなのだろう。というわけで、最終的にはこんなコードになった。

n;q(char*a){n=*1[&a]-*a;}
main(t,s,x){
  for(;scanf("%d",&n)<n;printf(t?"Ok!! %d times\n":"No!!\n",t-1))
    for(t=printf("N=%d:\n",n)==8&&n%101;t&&n%98;
      printf("%d-%d=%d\n",x,x-n,n=x-atoi(strrev(s))))
      qsort(itoa(n,s,10),4,1,q),x=atoi(s),++t;
}