『FizzBuzz(Nパターン)』 に挑戦

お題:FizzBuzz(Nパターン) - No Programming, No Life


fizz buzz without trial division · GitHub を Groovy に翻訳してみた。

@Grab(group='com.google.guava', module='guava', version='r09')
import com.google.common.base.Function
import static com.google.common.collect.Iterators.cycle
import static com.google.common.collect.Iterators.transform


transpose = { iterators ->
  [hasNext: { true }, next: { iterators*.next() }] as Iterator
}

expandToList = { pairs ->
  pairs.collect{ m, s -> cycle(['']*(m-1)+[s]) }
}

enumerate = { pairs ->
  transform(transpose(expandToList(pairs)), { it.join() } as Function)
}

pairs = { list ->
  final int N = list.size()
  [list[(0..<N).step(2)], list[(1..<N).step(2)]].transpose()
}

fizzBuzzN = { list ->
  int n = 0
  transform(enumerate(pairs(list)), { n++; it?:n } as Function)
}

fizzBuzzN([3,'Fizz',5,'Buzz',7,'Hoge']).take(100).each{ println it }

Guava の Iterators.transform を使って Iterator入れ子にし無限リスト風に扱っている。
最後に Groovy 1.8.1 で追加された take で Iterator から結果を取得。