23 lines
609 B
Plaintext
23 lines
609 B
Plaintext
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
|
|
|
|
Enum.each(['MCMXC', 'MMVIII', 'MDCLXVI', 'IIIID'], fn clist ->
|
|
IO.puts "#{clist}\t: #{Roman_numeral.decode(clist)}"
|
|
end)
|