こちらの「ズンドコキヨシ」を簡単に実装してみた。Streamとか、そういうのは使ってない。実際に処理するメソッド数は3つ。 Enum.take/2 のようなものは使っていない。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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してた所を出力してみた。ただ、少しに煩雑になったかな…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |