4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【#FizzBuzz】Elixirで”1から100までの数字を数えて3の倍数と3の付く数字のときにだけアホになる”というのを書いてみる

Last updated at Posted at 2020-05-30

はじめに

$ elixir -v
Erlang/OTP 23 [erts-11.0.2] [source] [64-bit] [smp:72:2] [ds:72:2:10] [async-threads:1] [hipe]

Elixir 1.10.3 (compiled with Erlang/OTP 23)

ハイライト

nabeatsu.ex
defmodule Nabeatsu do
  def fizz_buzz(n) when rem(n, 3) == 0, do: do_joke(n)
  def fizz_buzz(n), do: do_fizz_buzz(n, String.contains?("#{n}", "3"))
  defp do_fizz_buzz(n, true), do: do_joke(n)
  defp do_fizz_buzz(n, false), do: "#{n}"
  defp do_joke(n), do: "#{n} : ٩( ᐛ )و"
end
  • Nabeatsu.fizz_buzz/1がキモです
  • nが3で割り切れる場合には、do_jokeを実行しています
  • nが3で割り切れない場合には、do_fizz_buzzを呼び出して、3が含まれれいるかどうかで返す結果を変えています

0. 準備

  • まずはElixirをインストールしましょう
  • Windowsの方は
    • 公式 のインストーラーがあります
  • macOSの方は
  • Linuxの方は、asdf-vmがよいとおもいます(ふだんあまり使っていないのでよくわかっていません)

1. プロジェクト作成(mix new)

$ mix new playground
  • playground はプロジェクト名です
  • お好きな名前でかまいません

2. ソースコードを書く

nabeatsu.ex
defmodule Nabeatsu do
  @moduledoc false

  @doc ~S"""
  世界のナベアツ
  Would you please see https://ja.wikipedia.org/wiki/%E6%A1%82%E4%B8%89%E5%BA%A6 ?

  ## Examples

      iex> Nabeatsu.fizz_buzz(1)
      "1"
      iex> Nabeatsu.fizz_buzz(3)
      "3 : ٩(  )و"
      iex> Nabeatsu.fizz_buzz(13)
      "13 : ٩(  )و"
      iex> Nabeatsu.fizz_buzz(30)
      "30 : ٩(  )و"
      iex> Nabeatsu.fizz_buzz(100)
      "100"

  """
  def fizz_buzz(n) when rem(n, 3) == 0, do: do_joke(n)
  def fizz_buzz(n), do: do_fizz_buzz(n, String.contains?("#{n}", "3"))
  defp do_fizz_buzz(n, true), do: do_joke(n)
  defp do_fizz_buzz(n, false), do: "#{n}"
  defp do_joke(n), do: "#{n} : ٩( ᐛ )و"
end
  • Nabeatsu.fizz_buzz/1 という関数を定義しています
    • /1は引数の数です
  • Nabeatsu.fizz_buzz(3)のように呼び出します
  • Doctestsで、Nabeatsu.fizz_buzz/1関数のテストを書いています

3. テストを実行する

playground_test.exs
defmodule PlaygroundTest do
  use ExUnit.Case
  doctest Playground
  doctest Nabeatsu # 追加
$ mix test
  • playgroundフォルダ(mix.exsがあるところ)で実行してください
nabeatsu.ex
  ## Examples

      iex> Nabeatsu.fizz_buzz(1)
      "3"
  • たとえば上記のように書きかえるとテストが失敗します
  • ちゃんとテストが実行されていることを確かめたら正しい結果に戻しておきましょう

4. 1から100までの数字を数えて3の倍数と3の付く数字のときにだけアホになる

  • テストでNabeatsu.fizz_buzz/1関数に自信がもてました
  • run関数を追加しました
    • max \\ 100 はmaxの指定がない場合に100になるという意味です
    • Default arguments
  • ソースコード全体を掲載しておきます
nabeatsu.ex
defmodule Nabeatsu do
  @moduledoc false

  def run(max \\ 100) do
    1..max
    |> Enum.map(&fizz_buzz/1)
    |> Enum.each(&IO.puts/1)
  end

  @doc ~S"""
  世界のナベアツ
  Would you please see https://ja.wikipedia.org/wiki/%E6%A1%82%E4%B8%89%E5%BA%A6 ?

  ## Examples

      iex> Nabeatsu.fizz_buzz(1)
      "1"
      iex> Nabeatsu.fizz_buzz(3)
      "3 : ٩(  )و"
      iex> Nabeatsu.fizz_buzz(13)
      "13 : ٩(  )و"
      iex> Nabeatsu.fizz_buzz(30)
      "30 : ٩(  )و"
      iex> Nabeatsu.fizz_buzz(100)
      "100"

  """
  def fizz_buzz(n) when rem(n, 3) == 0, do: do_joke(n)
  def fizz_buzz(n), do: do_fizz_buzz(n, String.contains?("#{n}", "3"))
  defp do_fizz_buzz(n, true), do: do_joke(n)
  defp do_fizz_buzz(n, false), do: "#{n}"
  defp do_joke(n), do: "#{n} : ٩( ᐛ )و"
end
$ iex -S mix

iex> Nabeatsu.run
1
2
3 : ٩(  )و
4
5
6 : ٩(  )و
7
8
9 : ٩(  )و
10
11
12 : ٩(  )و
13 : ٩(  )و
14
15 : ٩(  )و
16
17
18 : ٩(  )و
19
20
21 : ٩(  )و
22
23 : ٩(  )و
24 : ٩(  )و
25
26
27 : ٩(  )و
28
29
30 : ٩(  )و
31 : ٩(  )و
32 : ٩(  )و
33 : ٩(  )و
34 : ٩(  )و
35 : ٩(  )و
36 : ٩(  )و
37 : ٩(  )و
38 : ٩(  )و
39 : ٩(  )و
40
41
42 : ٩(  )و
43 : ٩(  )و
44
45 : ٩(  )و
46
47
48 : ٩(  )و
49
50
51 : ٩(  )و
52
53 : ٩(  )و
54 : ٩(  )و
55
56
57 : ٩(  )و
58
59
60 : ٩(  )و
61
62
63 : ٩(  )و
64
65
66 : ٩(  )و
67
68
69 : ٩(  )و
70
71
72 : ٩(  )و
73 : ٩(  )و
74
75 : ٩(  )و
76
77
78 : ٩(  )و
79
80
81 : ٩(  )و
82
83 : ٩(  )و
84 : ٩(  )و
85
86
87 : ٩(  )و
88
89
90 : ٩(  )و
91
92
93 : ٩(  )و
94
95
96 : ٩(  )و
97
98
99 : ٩(  )و
100
:ok
  • iexはSystem.haltで終わらせましょう

Wrapping Up

  • Enjoy!!!
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?