Skip to content

Instantly share code, notes, and snippets.

@chriswright47
Last active May 13, 2016 02:51
Show Gist options
  • Select an option

  • Save chriswright47/2edd9cb328007e237b672428675fbc71 to your computer and use it in GitHub Desktop.

Select an option

Save chriswright47/2edd9cb328007e237b672428675fbc71 to your computer and use it in GitHub Desktop.
defmodule ElixirRomanNumerals do
def to_roman(n) do
to_roman n, ""
end
defp to_roman(n, string) when n >= 1000 do
to_roman rem(n,1000), string <> stringify(trunc(n/1000), "M")
end
defp to_roman(n, string) when n >= 100 do
to_roman rem(n,100), string <> stringify(trunc(n/100), "C", "D", "M")
end
defp to_roman(n, string) when n >= 10 do
to_roman rem(n,10), string <> stringify(trunc(n/10), "X", "L", "C")
end
defp to_roman(n, string) when n >= 1 do
to_roman 0, string <> stringify(n, "I", "V", "X")
end
defp to_roman(0, string), do: string
defp stringify(thousands, "M"), do: String.duplicate "M", thousands
defp stringify(9, one_char, five_char, ten_char), do: one_char <> ten_char
defp stringify(n, one_char, five_char, ten_char) when n > 4 do
five_char <> String.duplicate(one_char, rem(n, 5))
end
defp stringify(4, one_char, five_char, ten_char), do: one_char <> five_char
defp stringify(n, one_char, five_char, ten_char), do: String.duplicate(one_char, n)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment