Skip to content

Instantly share code, notes, and snippets.

@hauptbenutzer
Created December 13, 2018 13:48
Show Gist options
  • Save hauptbenutzer/baa129b5f2e56965e4da83caa44b2c62 to your computer and use it in GitHub Desktop.
Save hauptbenutzer/baa129b5f2e56965e4da83caa44b2c62 to your computer and use it in GitHub Desktop.
defmodule Roman do
defp num_lookup({0, _}), do: ""
defp num_lookup({1, 1}), do: "I"
defp num_lookup({5, 1}), do: "V"
defp num_lookup({1, 2}), do: "X"
defp num_lookup({5, 2}), do: "L"
defp num_lookup({1, 3}), do: "C"
defp num_lookup({5, 3}), do: "D"
defp num_lookup({1, 4}), do: "M"
defp num_lookup({4, pos}), do: num_lookup({1, pos}) <> num_lookup({5, pos})
defp num_lookup({9, pos}), do: num_lookup({1, pos}) <> num_lookup({1, pos + 1})
defp num_lookup({num, pos}) do
# num is in [2, 3, 6, 7, 8] so we'll concatenate 0 or 5 with as many 1s as needed
rem = div(num, 5) * 5
num_lookup({rem, pos}) <> String.duplicate(num_lookup({1, pos}), num - rem)
end
@doc """
Convert the number to a roman number.
"""
@spec numerals(pos_integer) :: String.t()
def numerals(number) do
number
|> Integer.digits()
|> (&Enum.zip(&1, length(&1)..1)).()
|> Enum.map_join(&num_lookup/1)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment