複数の人の中から抽選で1人を選ぶプログラムをElixirで作りました。
もっと具体的に言うと、数名でイクラを通販したんですが、おまけでカニが1杯ついてきたのでElixirの勉強がてら抽選プログラムを作成して決めてしまおうということで作りました。
環境
- Mac OSX 10.15.2
- IEx 1.9.1 (compiled with Erlang/OTP 22)
プログラム
参加者の名前でリストを作り、ランダムで1つ取り出すのを複数回実行し、取り出された名前が何回あったのかをカウントします。
名前をもっとも多く取り出された人がカニをゲットできることとしました。
defmodule Kani do
def lottery(list, count) do
gets(list, count)
|> Enum.reduce(%{}, fn (name, acc) -> Map.update(acc, name, 1, &(&1 + 1)) end)
|> Enum.sort()
end
defp get_random(list) do
list
|> Enum.random()
end
defp gets(list, count) do
lists = for _i <- count do
get_random(list)
end
lists
end
end
実行結果(例)
iex
iex> list = ["A", "B", "C", "D", "E"]
["A", "B", "C", "D", "E"]
iex> Kani.lottery(list, 1..10_000)
[
{"A", 1979},
{"B", 1928},
{"C", 2033},
{"D", 2038}, ←カニはDさんがゲット!
{"E", 2022}
]
まとめ
公平な抽選をした結果、ケンカすることなく @32hero さんがカニをゲットしました。
本当のところ、Task
とかAgent
を使ったりmapの値でソートしたかったんですが時間切れになったのでもう少しブラッシュアップしていきたいなぁと感じています。