それ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 は両方とも OCamlPerlインタプリタで動くのですが、じゃあなんで拡張子ついてるかというと、 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 とか最適化ありとかだとうまくいかない…ですがどうでもいいです。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h