この頃はやりの FizzBuzz

anarchy golf の FizzBuzz の話です。
はてなブックマーク - yshlのブックマーク / 2007年5月8日 に書いた

echo '#include<stdio.h>\nint n;int main(){for(;++n<101;)printf("%.d%s%s\\n",n%3*n%5?n:0,n%3?"":"Fizz",n%5?"":"Buzz");return 0;}'|gcc -Wall -x c -;./a.out

は(ゴルフ的に)余計なものを除くと

n;main(){
    for(;++n<101;)
        printf("%.d%s%s\n",n%3*n%5?n:0,n%3?"":"Fizz",n%5?"":"Buzz");
}

の 84 byte で、現在の C の 1 位の 73 byte より 11 byte も多い訳です。これを(ふぃづばづ - Cozy Ozy を参考にしないで)どうにか縮めたいのですが、剰余 4 回が多いような気がするので減らしてみます。

n;main(){
    for(;++n<101;)
        printf(n%3?"\n%s":"\nFizz%s",n%5?"":"Buzz")-1||printf("%d",n);
}

剰余 2 回で 86 byte。長くなってしまった。あと、最初に余計な改行がついてしまうので不合格。で、何故か目的が剰余を減らす方向にすりかわってこんなものを書いてしまう。

main(n){
    goto A;
    while(n<101){
        printf("%d\nFizz\n",n);n+=2;
        printf("%d\n",n++);
        printf("%d\nFizzBuzz\n",n);n+=2;
A:
        printf("%d\n",n++);
        printf("%d\nFizz\n",n);n+=2;
        printf("%d\nBuzz\nFizz\n",n);n+=3;
        printf("%d\n",n++);
        printf("%d\nFizz\nBuzz\n",n);n+=3;
    }
}

ちなみに 245 byte。*1
あと PostScript の 1 位の 51 byte にようやく追いついたのですが、Statistics が違うのが気になります。私のは

1 1 100{dup 5 mod 0 eq 1 index 3 mod 0 eq{(Fizz)print/ exch}if{/Buzz}if =}for

をバイナリ化したものです。また差をつけられました。

*1:もちろん n;main(i,j){for(j=1;++n<101;i=i-2?i+1:0,j=j-4?j+1:0)printf("%.d%s%s\n",i*j?n:0,i?"":"Fizz",j?"":"Buzz");} などとした方が短い