java quine golf
TRANSCRIPT
Java Quine Golf
@miyakawa_taku (宮川 拓)
2013-05-13 LT at JJUG CCC 2013 Spring
なにそれ
• Quine
– 「自分と同じプログラム」を出力するプログラム
• Golf
–プログラムを短く書くゲーム
• Java Quine Golf
– 「自分と同じプログラム」を出力する Java プログラムを短く書くゲーム
1
Q. 何の役に立つのか?
2
A. たのしめる
3
Q1.
素直な実装
4
class Q{public static void main(String[]a){String
s="class Q{public static void main(String[]a){String
s=%c%s%1$c;System.out.printf(s,34,s);}}";System.out.p
rintf(s,34,s);}}
$ java Q
class Q{public static void main(String[]a){String
s="class Q{public static void main(String[]a){String
s=%c%s%1$c;System.out.printf(s,34,s);}}";System.out.p
rintf(s,34,s);}}
172 バイト
改善のアイディア
• main メソッドを使いたくない
– 「public static void main(String[] s)」で 35 バイト
–文字列中にも登場するから、これだけで 70 バイト
• main の前に処理したい
5
Q2.
main に代って static イニシャライザ
6
class Q{static{String s="class Q{static{String
s=%c%s%1$c;System.out.printf(s,34,s);System.exit(0);}
}";System.out.printf(s,34,s);System.exit(0);}}
146 バイト
Q3.
enum 定数のイニシャライザ
7
enum Q{C;{String s="enum Q{C;{String
s=%c%s%1$c;System.out.printf(s,34,s);System.exit(0);}
}";System.out.printf(s,34,s);System.exit(0);}}
136 バイト
つぶやけた
8
Java 7
• Oracle Java 7 の実装では Q2 と Q3 が動かなくなった
9
$ java Q
エラー: メイン・メソッドがクラスQで見つかりません。次のようにメイン・メソッドを定義してください。 public static void main(String[] args)
なんでだ
• 起動の際、クラスのメンバを初期化する前に、 main メソッドが存在するかどうか確かめるようになったため
• こっちの方が正しい動きらしい
10
くっそー
11