[Elixir]愚直にズンドコキヨシ

こちらの「ズンドコキヨシ」を簡単に実装してみた。Streamとか、そういうのは使ってない。実際に処理するメソッド数は3つ。 Enum.take/2 のようなものは使っていない。


defmodule Znd do
@z "ズン"
@d "ドコ"
@k "キ・ヨ・シ"
def kiyoshi, do: [] |> kiy
defp kiy(zd) when zd == [@z, @z, @z, @z, @d], do: [zd|[@k]] |> Enum.join
defp kiy(zd) when length(zd) > 5, do: tl(zd) |> kiy
defp kiy(zd), do: [zd|[Enum.random([@z, @d])]] |> List.flatten |> kiy
end

実行

iex> c "zndc.exs"
iex> Znd.kiyoshi
"ズンズンズンズンドコキ・ヨ・シ"

Listの追加方法を先頭から追加する形に少し変更してみた。ついでにdropしてた所を出力してみた。ただ、少しに煩雑になったかな…


defmodule Znd do
@z "ズン"
@d "ドコ"
@k "キ・ヨ・シ"
def kiyoshi, do: [] |> kiy
defp kiy(zd) when zd == [@d, @z, @z, @z, @z], do: [@k|zd] |> Enum.reverse |> Enum.join
defp kiy(zd) when length(zd) > 5 do
{h, t} = zd |> Enum.split(5)
t |> List.to_string |> IO.puts
h |> kiy
end
defp kiy(zd), do: [Enum.random([@z, @d])|zd] |> kiy
end

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.