FizzBuzz

気がつくとFizzBuzz@Javaの記録が更新されていた。wiz さんが 97B を出している。以前は 102B がトップだったのだが、5B も縮められた。どうやっているんだろう。
抜かれてしまったので、102B を公開しよう。

class C{static{for(int i=0;i++<100;)System.out.println((i%3>0?i%5>0?i:"":"Fizz")+(i%5>0?"":"Buzz"));}}

まぁ、若干無駄っぽいところもあるが、Java の場合、変数宣言のコストが高いので、このようになっていた。

追記

hello worldも wiz さんによって更新されている。46B だ。以前の 51B は普通のコードだが、以下のようだった。

class C{static{System.out.print("Hello, world!");}}

ここから、5B 縮めるというのは、どういうことなのだろう。FizzBuzz も、hello world も縮め幅は同じ 5B。System.out.print() より短い出力方法があるとか?

08/11追記

data order@Java wizさんの解が公開になり、なぞが明らかになった。enum の Instance Initializer だった。

enum X{
    A,B,C;
    static{System.out.println("Static Initializer");}
    {System.out.println("Instance Initializer");}
}

とやると、

Instance Initializer
Instance Initializer
Instance Initializer
Static Initializer

と表示される。Java Language Specificationによると、

The body of an enum type may contain enum constants. An enum constant defines an instance of the enum type. An enum type has no instances other than those defined by its enum constants.

だそうだ。上の例で言うと、A,B,Cという3つの enum インスタンスが生成されるときに、それぞれの、Instance Initializer が実行される。#う〜ん、Static Initializer の実行されるタイミングがいまいち微妙だ。