はじめに
- Elixir 楽しんでいますか
-
@Nabetaniさんの「オフラインリアルタイムどう書く第三回の参考問題」をElixirでやってみました
- @obelisk68 さんの「野球のボールカウント(どう書く)」で問題の存在を知りました
準備
うまくいかなかったら
- 何事にも準備が肝心です
- ここが一番つまらないし、謎にハマってしまうことが多いのですが、がんばってください!
- うまくいかなかったら、思い切って僕の胸に飛び込んで来てほしい (by 長嶋茂雄 読売ジャイアンツ終身名誉監督)
-
elixirjp.slack.com slack workspaceかNervesJP workspaceに入ってきていただいて、
@torifukukaiou
へご質問ください - たとえ私が答えられなくても、マジみんな親切で優しい人が多いので、きっと解決できるでしょう
-
elixirjp.slack.com slack workspaceかNervesJP workspaceに入ってきていただいて、
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と呼ばれるものでテストできるんです
$ mix test
..............
Finished in 0.07 seconds
13 doctests, 1 test, 0 failures