LoginSignup
1
1

More than 5 years have passed since last update.

今さらだけどElixirで「進捗どうですか」

Last updated at Posted at 2016-04-26

概要

ついでだから「進捗どうですか」もやってみた。

実装

ほとんどズンドコキヨシ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
1
1
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
1
1