Challenge: Roman numbers parser?

And You can do it with magic of meta programming:

defmodule RomanParser do  
  def parse(input), do: parse(input, 0)

  numerals = [
    {"M", 1000},
    {"CM", 900},
    {"D", 500},
    {"CD", 400},
    {"C", 100},
    {"XC", 90},
    {"L", 50},
    {"XL", 40},
    {"X", 10},
    {"IX", 9},
    {"V", 5},
    {"IV", 4},
    {"I", 1}
  ]

  for {roman, decimal} <- numerals do
    defp parse(unquote(roman) <> rest, total), do: parse(rest, total + unquote(decimal))
  end

  defp parse("", total), do: total
end

RomanParser.parse("MMMDXVI") #=> 3516
1 Like