はじめに
こちらを拝見して、「そういえばGroovyでもそういった案件があったような」気がしました。
そこでGroovyのことをもっと勉強するために挑戦してみることにしました。
本題
コード
def mulder() {
def msg = "モルダー あなた 疲れてる のよ".split(" ") as List
def list = []
Collections.shuffle(msg) // voidを返すメソッドなのでチェーンしてない…
def l = daru(msg).flatten()
l.add(2, "、") // voidを返すメソッドなのでチェーンしてない…
l.join('')
}
ArrayList daru(ArrayList it) {
def wlist = []
it.collate(2).each { ws ->
def lw = []
ws.each { w ->
w.collect().collate((int)Math.ceil(w.size()/2.0)).each {
lw << it.join('')
}
}
wlist << kururi(lw)
}
wlist
}
ArrayList kururi(ArrayList lw){
(new Random().nextInt(2) == 0 ? [lw[2],lw[1],lw[0],lw[3]] : lw).flatten()
}
for(int i = 1; ;i++){
def m = mulder()
println "$i: $m"
if(m == "モルダー、あなた疲れてるのよ"){
System.exit(i)
}
}
実行結果例
1: モルダー、あなたのてる疲れよ
2: あなよ、のた疲れダーモルてる
3: 疲れダー、モルてるあなたのよ
4: 疲れてる、モルダーあなよのた
5: モルよ、のダーあなた疲れてる
6: モルた、あなダーのよ疲れてる
7: モルダー、疲れてるのたあなよ
8: あなた、疲れてるモルよのダー
9: 疲れてる、モルダーあなたのよ
10: モルた、あなダーのよ疲れてる
11: 疲れた、あなてるのダーモルよ
12: あなてる、疲れたモルダーのよ
13: のよ、モルダー疲れてるあなた
14: あなた、のよ疲れダーモルてる
15: モルダー、あなた疲れよのてる
16: モルダー、あなたのてる疲れよ
17: モルダー、疲れてるのよあなた
18: モルよ、のダー疲れてるあなた
19: あなよ、のた疲れてるモルダー
20: モルダー、あなた疲れてるのよ
終わりに
書いてみて気になったことがいくつかありました。
- Javaのお力添えをいただく必要が結構あります
- クロージャをもっと使ってやりたかったけど長くなったのできっと勉強不足
- 文字列をsplitするとString[]になるのでListに変換するのがカッコ悪い
- とりあえずvoidなメソッドがつらい、チェーンしたいときには何か書かないと…
- 配列のシャッフルは「Collections.shuffle」、リストは返してこない
- rubyのeach_sliceはGroovyでは「collate」、リストを返してくれる
- 整数の割り算で「Integer.intdiv」メソッドがあるけど切り上げはしない
- rubyのtapを実現するならちょこっと書かないといけない、けどできる1
- Kernel#loopみたいのがないのでforループで書いた、もっといい方法があるような気が
rubyもpythonもgroovyもよく分からないので勉強になりました
注釈
-
Groovy equivalent of Ruby's Object#tap http://stackoverflow.com/questions/17961088/groovy-equivalent-of-rubys-objecttap ↩