FizzBuzzをGroovyで書いてみた

明日は楽しみにしていたJGGUGなので、復習の意味を込めてGroovyでFizzBuzzを書いてみた。

ちなみにFizzBuzzとはこんな感じ。

1 から順に数を数えていく。但し、その数が 3 で割り切れるならば数字の代わりに Fizz と、5 で割り切れるなら Buzz と言うゲーム。3 でも 5 でも割り切れる場合は、FizzBuzz の順に言う。

http://d.hatena.ne.jp/keyword/FizzBuzz

ここで有名になったのかな?

どうしてプログラマに・・・プログラムが書けないのか?
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

とりあえず2分位で書ければプログラマとして合格らしいので、何も考えずに書いてみた。

def f = "fizz"
def b = "buzz"

for (i in 1..100) {
  if (i % (3*5) == 0) {
    println f+b
  } else if (i % 3 == 0) {
    println f
  } else if (i % 5 == 0) {
    println b
  } else {
    println i
  }
}

まぁ、何もひねりがなくそのままですw
流石に2分以内にかけたはず。

きっとGroovyっぽく書いてるのがあるはずと、探してみたらfumokmmさんの答えを発見。
うわぁ。。。Groovyっぽい!!
っというか、switchってリスト受け付けるんだ!

刺激受けまくりだったので、switch使う練習として「%」を使わないで書いてみました。
(なんでcollect使わなかったんだろうw)

def f = "fizz"
def b = "buzz"

def count1 = 0
def count2 = 0
(1..100).each{ x ->
    count1++
    count2++
    switch ([count1 == 3, count2 == 5]) {
      case{it[0]&&it[1]} : str= f+b;count1=0;count2=0; break
      case{it[0]} : str=f;count1=0; break
      case{it[1]} : str=b;count2=0; break
      default : str=x
    }
    println str
}

面白かったのがcaseの中括弧内のitはswitchの結果で、
コロンの後のitはクロージャーのitになるということ。(上のコードだと変数「x」としていますけど)

後、caseの中括弧はクロージャーなんでなんでも書けるってこと。
switchやりたい放題じゃないですか。。。

しかし、breakが不恰好ですよね。
でも、if並べるのも。。。
というか、カウンター使うのもどうなんですかね?
いい案浮かんだら書き直したいですね。
(その時にはcollectとか使ってw)

ちなみに、最短は55文字らしいです。
こういう変態コードに憧れてGroovyの勉強始めたので、いつかこういうの書いてみたいですね。
まぁ、"「*」ってなんだっけ?"とか思ってる時点でまだまだですがw

参考↓
No Programming, No Life
http://d.hatena.ne.jp/fumokmm/20101018/1287415075

FizzBuzz最短コード(GolfScript, Groovy)
http://d.hatena.ne.jp/y_tag/20110125/fizzbuzz

第17回 G*ワークショップ
http://kokucheese.com/event/index/13874/