34 lines
757 B
Elixir
34 lines
757 B
Elixir
|
defmodule RomanNumerals do
|
||
|
@doc """
|
||
|
Convert the number to a roman number.
|
||
|
"""
|
||
|
@romans %{
|
||
|
1 => ["I", "X", "C", "M"],
|
||
|
2 => ["II", "XX", "CC", "MM"],
|
||
|
3 => ["III", "XXX", "CCC", "MMM"],
|
||
|
4 => ["IV", "XL", "CD"],
|
||
|
5 => ["V", "L", "D"],
|
||
|
6 => ["VI", "LX", "DC"],
|
||
|
7 => ["VII", "LXX", "DCC"],
|
||
|
8 => ["VIII", "LXXX", "DCCC"],
|
||
|
9 => ["IX", "XC", "CM"]
|
||
|
}
|
||
|
|
||
|
@spec numeral(pos_integer) :: String.t()
|
||
|
def numeral(number) do
|
||
|
number
|
||
|
|> Integer.digits()
|
||
|
|> Enum.reverse()
|
||
|
|> Enum.with_index(&to_roman_digit/2)
|
||
|
|> Enum.reverse()
|
||
|
|> Enum.join()
|
||
|
end
|
||
|
|
||
|
defp to_roman_digit(0, _index), do: ""
|
||
|
defp to_roman_digit(digit, index) do
|
||
|
@romans
|
||
|
|> Map.fetch!(digit)
|
||
|
|> Enum.at(index)
|
||
|
end
|
||
|
end
|