それC
それPlaっていうのがあるらしいので、対抗してそれCでもできるよ、と言うのはどうかなぁと思いました。
Aさん: PKU1001は多倍長計算が必要なんですけどJavaでやる方法を教えて下さい!
Bさん: それCでもできるよ。
b[9999];x,f,l;char*r,*p=b,*q;main(i){for(;~scanf("%s%d", r=p+= 128,&i );puts(p)){l=5;for(q=p+5; *q==48 ;*q-- =0) l--;/**/ q=strchr(p,46);strcpy(q,q +1);for(f =(q -r- l)*i;--i;*q||q++,p=q)for(p+=strlen(p),q=p+128; *-- p;x ?*q=x+48,x=0:0,r++ )for(q+=l-1,/*q=*/ r+= l;* --r;x/=10)x+=(*p-48)*(*r-48)+(*q?*q-48:0),*q-- =x% 10+48 ;for(p+=strspn(r,"0");*q-48&&strlen(p)+f;) /*for (q=p;*q-48;*q--=0)l--;*/putchar(*p++);*p&&putchar(46);}}
Aさん: Cでのやり方を聞いてるんじゃないです!><
Aさんの主張はしごくもっともだと思います。あ、ちなみにこれ ('-') のつもりなんですが、なんかずれてそうだなまぁいいか。あとちゃんと PKU1001 に Accept されます。
あとオリジナルはこんなの。
b[9999]; char*r,*p=b,*q; x,f,l; main(i){ for(;~scanf("%s%d",r=p+=128,&i);puts(p)){ l=5; for(q=p+5;*q==48;*q--=0)l--; q=strchr(p,46); strcpy(q,q+1); for(f=(q-r-l)*i;--i;*q||q++,p=q) for(p+=strlen(p),q=p+128;*--p;x?*q=x+48,x=0:0,r++) for(q+=l-1,r+=l;*--r;x/=10) x+=(*p-48)*(*r-48)+(*q?*q-48:0), *q--=x%10+48; for(p+=strspn(r,"0");*q-48&&strlen(p)+f;)putchar(*p++); *p&&putchar(46); } }
マジメに縮める気が起きませんが、一応Cでは暫定一位になっておきました。
ちなみにこの手のコーディングでは uguu.org の作品集がすばらしすぎると思います。
特に miina.ml と karen.pl の Polyglot quine はすざまじいものがあります。miina.ml と karen.pl は両方とも OCaml と Perl のインタプリタで動くのですが、じゃあなんで拡張子ついてるかというと、 OCaml インタプリタで実行すると miina.ml が出力され、 Perl インタプリタで実行すると karen.pl が出力される、というなんともはや、な物体です。
いまどきの union
ふとイヤなコードを思いつきました
main(){ char a[4]; char b[0x3fffffff]; char c[0x3fffffff]; char d[0x3fffffff]; char e[0x3fffffff]; int f = 0; printf("%x %x %x %x\n", a[0],a[1],a[2],a[3]); f = 0x12345678; printf("%x %x %x %x\n", a[0],a[1],a[2],a[3]); return &f; }
実行結果。
i@u ~/test> ./a.out 0 0 0 0 78 56 34 12
GCC3 とか最適化ありとかだとうまくいかない…ですがどうでもいいです。