考えてみれば当たり前だけど(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")

もっと面白いやり方ありそうだなぁ。。。