考えてみれば当たり前だけど(1..100)などの範囲は普通のリストじゃない
飽きもせずにFizzBuzzについて考えていたら、
普通の考えるように、カウントしていって特定の値の時に文字を使用するのではなくて、
最初に数字をリストに入れといてがあって、倍数のとこだけ文字列入れればいいんじゃね?って事を思いついた。
そういえば、前回FizzBuzzの最短コードを調べた時に、配列使った例もあたった気がするので、頭のどこかに引っかかってたのかな?
(ポインタとか使ってたのでほとんど読んでないですがw)
で、書いて実行してみたら例外発生!
def list = (1..100) for (i = 2; i < 100; i+=3) { // ここで例外発生 list[i] = "fizz" } for (i = 4; i < 100; i+=5) { if (list[i] instanceof Integer) { list[i] = "buzz" } else { list[i] += "buzz" } } println list.join("\n")
java.lang.UnsupportedOperationException
値の設定は許可してないよ!っとの事らしい。
あぁ、範囲は普通のリストじゃないね。
println((1..100).class)
class groovy.lang.IntRange
調べてみたら「groovy.lang.IntRange」らしい。
パフォーマンス考えると当然ですね。
ということで、ArrayListに変換して修正。
def list = (1..100) as ArrayList for (i = 2; i < 100; i+=3) { list[i] = "fizz" } for (i = 4; i < 100; i+=5) { if (list[i] instanceof Integer) { list[i] = "buzz" } else { list[i] += "buzz" } } println list.join("\n")
もっと面白いやり方ありそうだなぁ。。。