mirror of
https://github.com/Xevion/exercism.git
synced 2025-12-08 14:07:01 -06:00
40 lines
689 B
Elixir
40 lines
689 B
Elixir
defmodule RomanNumerals do
|
|
@values %{
|
|
"I" => 1,
|
|
"IV" => 4,
|
|
"V" => 5,
|
|
"IX" => 9,
|
|
"X" => 10,
|
|
"XL" => 40,
|
|
"L" => 50,
|
|
"XC" => 90,
|
|
"C" => 100,
|
|
"CD" => 400,
|
|
"D" => 500,
|
|
"CM" => 900,
|
|
"M" => 1000
|
|
}
|
|
|
|
@doc """
|
|
Convert the number to a roman number.
|
|
"""
|
|
@spec numeral(pos_integer) :: String.t()
|
|
def numeral(number) do
|
|
number
|
|
|> Stream.unfold(fn
|
|
0 -> nil
|
|
n -> get_max(n)
|
|
end)
|
|
|> Enum.join()
|
|
end
|
|
|
|
defp get_max(n) do
|
|
numeral =
|
|
Map.keys(@values)
|
|
|> Enum.filter(&(Map.get(@values, &1) <= n))
|
|
|> Enum.max_by(&Map.get(@values, &1))
|
|
|
|
{numeral, n - Map.get(@values, numeral)}
|
|
end
|
|
end
|