💨

KotlinのFizzBuzz問題(多分これが一番美しいと思います)

2022/07/11に公開
(1..100).forEach { i ->
  val str = when (Pair(i % 3 == 0, i % 5 == 0)) {
    Pair(false, false) -> i
    Pair(true, false) -> "Fizz"
    Pair(false, true) -> "Buzz"
    else -> "FizzBuzz"
  }
  println(str)
}

もしくは

(1..100).asSequence().map { i ->
  when (Pair(i % 3 == 0, i % 5 == 0)) {
    Pair(false, false) -> i
    Pair(true, false) -> "Fizz"
    Pair(false, true) -> "Buzz"
    else -> "FizzBuzz"
  }
}.forEach(::println)

asSequence()でLazy evaluationが可能となり、1要素毎にprintlnしてくれます。
もしasSequence()を付けずに実装してしまうと、(1..1000000000)のような巨大なループにした場合にEager evaluationな実装となってしまい、1000000000回mapのループを実装した後にまとめてprintlnしようとするためjava.lang.OutOfMemoryErrorとなってしまいます。

Discussion