From 1d27472553c2f9727ba02836dd10ba0ddb7e0d95 Mon Sep 17 00:00:00 2001 From: "exercism-solutions-syncer[bot]" <211797793+exercism-solutions-syncer[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 10:15:27 +0000 Subject: [PATCH] [Sync Iteration] elixir/roman-numerals/2 --- .../roman-numerals/2/lib/roman_numerals.ex | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 solutions/elixir/roman-numerals/2/lib/roman_numerals.ex diff --git a/solutions/elixir/roman-numerals/2/lib/roman_numerals.ex b/solutions/elixir/roman-numerals/2/lib/roman_numerals.ex new file mode 100644 index 0000000..0b4bea3 --- /dev/null +++ b/solutions/elixir/roman-numerals/2/lib/roman_numerals.ex @@ -0,0 +1,39 @@ +defmodule RomanNumerals do + @doc """ + Convert the number to a roman number. + """ + @spec numeral(pos_integer) :: String.t() + def numeral(number), do: reduce_to_roman(number) + + defp reduce_to_roman(number, numeral \\ "") + defp reduce_to_roman(0, numeral), do: numeral + defp reduce_to_roman(number, numeral) when number >= 1000, + do: reduce_to_roman(number - 1000, numeral <> "M") + + defp reduce_to_roman(number, numeral) when number >= 500 and number < 900, + do: reduce_to_roman(number - 500, numeral <> "D") + + defp reduce_to_roman(number, numeral) when number >= 900 or number >= 400, + do: reduce_to_roman(number + 100, numeral <> "C") + + defp reduce_to_roman(number, numeral) when number >= 100, + do: reduce_to_roman(number - 100, numeral <> "C") + + defp reduce_to_roman(number, numeral) when number >= 50 and number < 90, + do: reduce_to_roman(number - 50, numeral <> "L") + + defp reduce_to_roman(number, numeral) when number >= 90 or number >= 40, + do: reduce_to_roman(number + 10, numeral <> "X") + + defp reduce_to_roman(number, numeral) when number >= 10, + do: reduce_to_roman(number - 10, numeral <> "X") + + defp reduce_to_roman(number, numeral) when number >= 5 and number < 9, + do: reduce_to_roman(number - 5, numeral <> "V") + + defp reduce_to_roman(number, numeral) when number == 9 or number == 4, + do: reduce_to_roman(number + 1, numeral <> "I") + + defp reduce_to_roman(number, numeral) when number > 0, + do: reduce_to_roman(number - 1, numeral <> "I") +end