Help us understand the problem. What is going on with this article?

Swiftで関数型FizzBuzz

More than 3 years have passed since last update.

Swift その2 の最後の 3 日が投稿されなかったので 3 連投です。

当初のアナウンスによると

カレンダーの25日間がすべて埋まっていることです。投稿を予定していた当日中に書けなかったとしても、カレンダーの最終日である12/25までに投稿されていれば条件を満たすものとします。

とあり、今から投稿しても条件を満たせるか未知数ですが、一応できることはやろうかと。

というわけで Swift で小ネタですが、 FizzBuzz を Swift で関数型っぽく書けば、次のように一つの式で書けます。

(1...100).map { switch ($0 % 3, $0 % 5) {
    case (0, 0): return "Fizz Buzz"
    case (0, _): return "Fizz"
    case (_, 0): return "Buzz"
    case (_, _): return "\($0)"
} }.forEach { print($0) }

実行結果は↓です。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
98
...
Fizz
Buzz

しかし、上記のような方法を含め、一般的な方法では本来無限に続くはずの FizzBuzz 列 の最初の方を切り出したものしか作れません。

ListK を使って遅延評価の力を用いれば、次のようにして無限 FizzBuzz リストを得ることができます。

import ListK

// 無限 FizzBuzz リスト
let fizzBuzz: List<String> = List<Int> { $0 + 1 }.map { i in
    switch (i % 3, i % 5) {
    case (0, 0): return "Fizz Buzz"
    case (0, _): return "Fizz"
    case (_, 0): return "Buzz"
    case (_, _): return "\(i)"
    }
}

$0 + 1 して一度 map しているのは、 0 からではなく 1 から始まるようにするためです。

なお、最初の 100 個の要素を取り出して表示するには次のようにします。

fizzBuzz.take(100).forEach { print($0) }
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away