SlideShare uma empresa Scribd logo
1 de 12
Baixar para ler offline
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

Mais conteúdo relacionado

Destaque

Summary of "Hacking", 0x351-0x354
Summary of "Hacking", 0x351-0x354Summary of "Hacking", 0x351-0x354
Summary of "Hacking", 0x351-0x354Taku Miyakawa
 
擬似乱数生成器の評価
擬似乱数生成器の評価擬似乱数生成器の評価
擬似乱数生成器の評価Taku Miyakawa
 
Java 7 invokedynamic の概要
Java 7 invokedynamic の概要Java 7 invokedynamic の概要
Java 7 invokedynamic の概要Taku Miyakawa
 
金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency APITaku Miyakawa
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月Taku Miyakawa
 

Destaque (7)

Summary of "Hacking", 0x351-0x354
Summary of "Hacking", 0x351-0x354Summary of "Hacking", 0x351-0x354
Summary of "Hacking", 0x351-0x354
 
擬似乱数生成器の評価
擬似乱数生成器の評価擬似乱数生成器の評価
擬似乱数生成器の評価
 
Hadoop jobbuilder
Hadoop jobbuilderHadoop jobbuilder
Hadoop jobbuilder
 
Java 7 invokedynamic の概要
Java 7 invokedynamic の概要Java 7 invokedynamic の概要
Java 7 invokedynamic の概要
 
金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
 

Semelhante a Java Quine Golf

ji-1. Java を使ってみる
ji-1. Java を使ってみるji-1. Java を使ってみる
ji-1. Java を使ってみるkunihikokaneko1
 
第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまでMugen Fujii
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Uehara Junji
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
pi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマーpi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマーkunihikokaneko1
 
PWA aruaru
PWA aruaruPWA aruaru
PWA aruarun_harada
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Toshio Ehara
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発Kentaro Ohkouchi
 
FEST-SwingでFestival!
FEST-SwingでFestival!FEST-SwingでFestival!
FEST-SwingでFestival!You Osaki
 
FEST-SwingでFestival!
FEST-SwingでFestival!FEST-SwingでFestival!
FEST-SwingでFestival!You Osaki
 
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3Tomoyuki Sato
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1Uehara Junji
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会Mugen Fujii
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2Masatoshi Tada
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話Hisateru Tanaka
 
Quineはじめました
QuineはじめましたQuineはじめました
Quineはじめましたsatos___jp
 

Semelhante a Java Quine Golf (20)

ji-1. Java を使ってみる
ji-1. Java を使ってみるji-1. Java を使ってみる
ji-1. Java を使ってみる
 
第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
pi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマーpi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマー
 
PWA aruaru
PWA aruaruPWA aruaru
PWA aruaru
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
FEST-SwingでFestival!
FEST-SwingでFestival!FEST-SwingでFestival!
FEST-SwingでFestival!
 
FEST-SwingでFestival!
FEST-SwingでFestival!FEST-SwingでFestival!
FEST-SwingでFestival!
 
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
競プロでGo!
競プロでGo!競プロでGo!
競プロでGo!
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
Quineはじめました
QuineはじめましたQuineはじめました
Quineはじめました
 

Java Quine Golf