Groovyで「モルダー、あなた疲れてるのよ」に対処する

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

こちらを拝見して、「そういえばGroovyでもそういった案件があったような」気がしました。

Ruby でモルダー、あなた疲れてるのよを出力する方法

Pythonでモルダー案件

そこで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もよく分からないので勉強になりました

注釈