java quine golf

12
Java Quine Golf @miyakawa_taku (宮川 ) 2013-05-13 LT at JJUG CCC 2013 Spring

Upload: taku-miyakawa

Post on 28-May-2015

520 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Java Quine Golf

Java Quine Golf

@miyakawa_taku (宮川 拓)

2013-05-13 LT at JJUG CCC 2013 Spring

Page 2: Java Quine Golf

なにそれ

• Quine

– 「自分と同じプログラム」を出力するプログラム

• Golf

–プログラムを短く書くゲーム

• Java Quine Golf

– 「自分と同じプログラム」を出力する Java プログラムを短く書くゲーム

1

Page 3: Java Quine Golf

Q. 何の役に立つのか?

2

Page 4: Java Quine Golf

A. たのしめる

3

Page 5: Java Quine Golf

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 バイト

Page 6: Java Quine Golf

改善のアイディア

• main メソッドを使いたくない

– 「public static void main(String[] s)」で 35 バイト

–文字列中にも登場するから、これだけで 70 バイト

• main の前に処理したい

5

Page 7: Java Quine Golf

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 バイト

Page 8: Java Quine Golf

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 バイト

Page 9: Java Quine Golf

つぶやけた

8

Page 10: Java Quine Golf

Java 7

• Oracle Java 7 の実装では Q2 と Q3 が動かなくなった

9

$ java Q

エラー: メイン・メソッドがクラスQで見つかりません。次のようにメイン・メソッドを定義してください。 public static void main(String[] args)

Page 11: Java Quine Golf

なんでだ

• 起動の際、クラスのメンバを初期化する前に、 main メソッドが存在するかどうか確かめるようになったため

• こっちの方が正しい動きらしい

10

Page 12: Java Quine Golf

くっそー

11