QizzRuzzをKotlinでJava臭くない解き方をしてみた

QizzRuzzとは

ただのFizzBuzzに飽きたので考えてみた改変型FizzBuzz。
終了条件が、「"FizzBuzz"と100回出力されるまで繰り返す」に変更され、「いかなる形でも終了回数をハードコードしてはいけない」という制限が付きます。 詳細はこちら

実装

とりあえずコード

fun main(args: Array<String>) {
    (1..Int.MAX_VALUE).asSequence()
            .filterNot {
                (it % 3 == 0 && it % 5 != 0).apply {
                    if (this) println("Fizz")
                }
            }
            .filterNot {
                (it % 3 != 0 && it % 5 == 0).apply {
                    if (this) println("Buzz")
                }
            }
            .filterNot {
                (it % 3 != 0 && it % 5 != 0).apply {
                    if (this) println(it)
                }
            }
            .take(100)
            .forEach { _ ->
                println("FizzBuzz")
            }
}

解説

SequenceはC#でいうLINQみたいなものです。
コレクションの操作を遅延評価で、各要素にたいして順に行います。
最初の3つのfilterNot

  • 3の倍数で5の倍数でない → "Fizz"を出力
  • 5の倍数で3の倍数でない → "Buzz"を出力
  • 3の倍数でも5の倍数でもない → その数値を出力

し、各項目をfilterで除外します。
つまり、最後に残るのは"FizzBuzz"を出力すべき15の倍数のみ。
take(100)を挟むことで、ここに到達した項目(つまり15の倍数)が100個になった時点で、それ以降の項目の処理は行われず、無視され、終了します。
必要最低限の処理しかしないSequenceマジ神

カウンタ変数なんてダサいものはなく
コード全体が1つのメソッドチェーンのみ
改行消せばワンライナーにもなる

自画自賛ですがなかなかいい出来だと思ってます