2023-07-01 11:58:00 -04:00
|
|
|
defmodule Roman_numeral do
|
|
|
|
|
def decode([]), do: 0
|
|
|
|
|
def decode([x]), do: to_value(x)
|
|
|
|
|
def decode([h1, h2 | rest]) do
|
|
|
|
|
case {to_value(h1), to_value(h2)} do
|
|
|
|
|
{v1, v2} when v1 < v2 -> v2 - v1 + decode(rest)
|
|
|
|
|
{v1, _} -> v1 + decode([h2 | rest])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
defp to_value(?M), do: 1000
|
|
|
|
|
defp to_value(?D), do: 500
|
|
|
|
|
defp to_value(?C), do: 100
|
|
|
|
|
defp to_value(?L), do: 50
|
|
|
|
|
defp to_value(?X), do: 10
|
|
|
|
|
defp to_value(?V), do: 5
|
|
|
|
|
defp to_value(?I), do: 1
|
|
|
|
|
end
|
|
|
|
|
|
2026-02-01 16:33:20 -08:00
|
|
|
Enum.each(["MCMXC", "MMVIII", "MDCLXVI", "IIIID"], fn clist ->
|
|
|
|
|
IO.puts "#{clist}\t: #{Roman_numeral.decode(to_charlist(clist))}"
|
2023-07-01 11:58:00 -04:00
|
|
|
end)
|