Instantly share code, notes, and snippets.

Embed
What would you like to do?
defmodule Roman do
@numerals %{1 => "I",
5 => "V",
10 => "X",
50 => "L",
100 => "C",
500 => "D",
1000 => "M"}
def numerals(number) do
Integer.digits(number)
|> Enum.reverse
|> Stream.with_index
|> Enum.map(&numerals_for_digit/1)
|> Enum.reverse
|> Enum.join
end
def magnitude(decimal_place) do
:math.pow(10, decimal_place) |> round
end
def numerals_for_digit(digit_with_index) do
{digit, index} = digit_with_index
magnitude = magnitude(index)
template(digit, @numerals[1 * magnitude],
@numerals[5 * magnitude],
@numerals[10 * magnitude])
end
def template(digit, one, five, ten) do
case digit do
1 -> one
2 -> one <> one
3 -> one <> one <> one
4 -> one <> five
5 -> five
6 -> five <> one
7 -> five <> one <> one
8 -> five <> one <> one <> one
9 -> one <> ten
_ -> ""
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment