晴耕雨読

working in the fields on fine days and reading books on rainy days

[Elixir] FizzBuzzを作成する

for 文による FizzBuzz

Elixir の for 文は do の内容の返り値をまとめてリストとして返します。 つまり、for 〜 end の後にパイプ演算子を繋げば、そのまま処理を続けることができます。

for n <- 1..20 do
  cond do
    rem(n, 3) == 0 and rem(n, 5) == 0 -> "FizzBuzz"
    rem(n, 3) == 0 -> "Fizz"
    rem(n, 5) == 0 -> "Buzz"
    true -> n
  end
end
|> IO.inspect
# => [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz",
#     11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz"]

Enum.map による FizzBuzz

FizzBuzz 処理の入力もパイプとして流し込めるようにしたい場合は、 次のように Range オブジェクトを Enum.map に流し込みます。

1..20
|> Enum.map(fn n ->
    cond do
      rem(n, 3) == 0 and rem(n, 5) == 0 -> "FizzBuzz"
      rem(n, 3) == 0 -> "Fizz"
      rem(n, 5) == 0 -> "Buzz"
      true -> n
    end
  end)
|> IO.inspect
# => [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz",
#     11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz"]

以上です。