LoginSignup
7
0

More than 3 years have passed since last update.

野球のボールカウント(どう書く)(Elixir)

Last updated at Posted at 2021-01-06

はじめに

準備

うまくいかなかったら

  • 何事にも準備が肝心です
  • ここが一番つまらないし、謎にハマってしまうことが多いのですが、がんばってください!
  • うまくいかなかったら、思い切って僕の胸に飛び込んで来てほしい (by 長嶋茂雄 読売ジャイアンツ終身名誉監督)
    • elixirjp.slack.com slack workspaceNervesJP workspaceに入ってきていただいて、@torifukukaiouへご質問ください
    • たとえ私が答えられなくても、マジみんな親切で優しい人が多いので、きっと解決できるでしょう:bangbang:

mix new

$ mix new ball_count
$ cd ball_count

ソースコードを書く

lib/ball_count.ex
defmodule BallCount do
  @doc """

  ## Examples

      iex> BallCount.solve("s")
      "010"

      iex> BallCount.solve("sss")
      "010,020,100"

      iex> BallCount.solve("bbbb")
      "001,002,003,000"

      iex> BallCount.solve("ssbbbb")
      "010,020,021,022,023,000"

      iex> BallCount.solve("ssbbbb")
      "010,020,021,022,023,000"

      iex> BallCount.solve("hsbhfhbh")
      "000,010,011,000,010,000,001,000"

      iex> BallCount.solve("psbpfpbp")
      "100,110,111,200,210,000,001,100"

      iex> BallCount.solve("ppp")
      "100,200,000"

      iex> BallCount.solve("ffffs")
      "010,020,020,020,100"

      iex> BallCount.solve("ssspfffs")
      "010,020,100,200,210,220,220,000"

      iex> BallCount.solve("bbbsfbppp")
      "001,002,003,013,023,000,100,200,000"

      iex> BallCount.solve("sssbbbbsbhsbppp")
      "010,020,100,101,102,103,100,110,111,100,110,111,200,000,100"

      iex> BallCount.solve("ssffpffssp")
      "010,020,020,020,100,110,120,200,210,000"
  """
  def solve(input) do
    String.codepoints(input)
    |> Enum.reduce([{0, 0, 0}], fn c, [head | _] = acc ->
      [do_solve(c, head) | acc]
    end)
    |> Enum.reverse()
    |> tl()
    |> Enum.map(&Tuple.to_list/1)
    |> Enum.map(&Enum.join/1)
    |> Enum.join(",")
  end

  defp do_solve("s", {2, 2, _}), do: {0, 0, 0}

  defp do_solve("s", {out, 2, _}), do: {out + 1, 0, 0}

  defp do_solve("s", {out, strike, ball}), do: {out, strike + 1, ball}

  defp do_solve("b", {out, _, 3}), do: {out, 0, 0}

  defp do_solve("b", {out, strike, ball}), do: {out, strike, ball + 1}

  defp do_solve("h", {out, _, _}), do: {out, 0, 0}

  defp do_solve("f", {out, 2, ball}), do: {out, 2, ball}

  defp do_solve("f", {out, strike, ball}), do: {out, strike + 1, ball}

  defp do_solve("p", {2, _, _}), do: {0, 0, 0}

  defp do_solve("p", {out, _, _}), do: {out + 1, 0, 0}
end

Doctests

  • ## Examplesの下にあるものは、Doctestsと呼ばれるものでテストできるんです :bangbang::bangbang::bangbang:
$ mix test
..............

Finished in 0.07 seconds
13 doctests, 1 test, 0 failures

Wrapping Up 🎍🎍🎍🎍🎍

  • Pipe operator |>Pattern matchingEnumモジュールのいろいろな関数、DoctestsーーElixirの良さがよくでるいい問題でした :bangbang:
  • みんなちがって みんないい(金子みすゞ)
    • みなさんもお好きなプログラミング言語で書いてみてください!
  • Enjoy Elixir :rocket::rocket::rocket:
7
0
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
7
0