概要
ついでだから「進捗どうですか」もやってみた。
実装
ほとんどズンドコキヨシverと同じ。
違うのは、副作用的に生成過程を表示していたのを、すべて保持して最後に出力する形にしたところ。最後に文字数を表示する必要があったのでこのように実装した。
shintyoku.exs
defmodule Shintyoku do
def doudesuka do
{:ok, pid} = Shintyoku.start
Shintyoku.doudesuka(pid)
end
def doudesuka(pid) do
if Shintyoku.complete?(pid) do
num = Shintyoku.get(pid)
|> Enum.reduce(0, fn (x, acc) -> acc + String.length(x) end)
Shintyoku.display(pid)
IO.puts("???")
IO.puts("#{num + 3}文字で煽られました")
else
Shintyoku.add(pid)
Shintyoku.doudesuka(pid)
end
end
def start do
Agent.start_link(fn -> [] end)
end
def get(pid) do
Agent.get(pid, fn prev -> prev end)
end
def add(pid) do
Agent.update(pid, fn prev ->
[Shintyoku.random | prev]
end)
end
def complete?(pid) do
"進捗どうですか" == Shintyoku.get(pid)
|> Enum.take(3)
|> Enum.reverse
|> Enum.join
end
def display(pid) do
Shintyoku.get(pid)
|> Enum.reverse
|> Enum.map(&IO.write/1)
end
def random do
["進捗", "どう", "ですか"]
|> Enum.random
end
end
出力結果
iex(1)> Shintyoku.doudesuka
進捗進捗進捗進捗ですかですかですかどう進捗どうどう進捗ですか進捗どうですか???
40文字で煽られました
:ok
iex(2)> Shintyoku.doudesuka
どう進捗ですか進捗ですかですかどう進捗ですかですか進捗どうどうどうどうどう進捗進捗ですかですか進捗ですかどうどう進捗進捗進捗進捗ですかですかですかどうですかですか進捗進捗ですか進捗進捗進捗ですかですかどうですか進捗ですかですかですかですかですか進捗どうどうですかですか進捗どうどうどうですか進捗ですか進捗どうどうですかですかどうですか進捗ですか進捗ですか進捗どうどうですかどうどうですかどうどうですか進捗どうですか???
210文字で煽られました
:ok
iex(3)> Shintyoku.doudesuka
どうですかですか進捗進捗進捗進捗どう進捗ですかですかどうですか進捗進捗ですかどうですかどうどうですかですかどう進捗どう進捗どう進捗進捗ですかですかどうどうどうですかどうどう進捗進捗ですかどうどうどうどう進捗どうどうどうどうどう進捗ですか進捗ですかどうどうどうどう進捗ですかですかですかですかどうですかどう進捗ですか進捗進捗進捗進捗ですか進捗ですか進捗どうどうですか進捗ですかどうどうですかどうですか進捗進捗どうどうどうどうどうどうですか進捗進捗進捗ですかですかですかですか進捗ですか進捗進捗進捗進捗進捗ですかどう進捗進捗進捗ですかですかどう進捗ですか進捗進捗どうですか???
287文字で煽られました
:ok
iex(4)> Shintyoku.doudesuka
どうですかですか進捗進捗ですか進捗どうですか???
25文字で煽られました
:ok