『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 から結果を取得。