module RomanNumerals exposing (toRoman) import Dict import Maybe toRoman : Int -> String toRoman number = if number == 0 then "" else let part = largestFactor number letter = numerals |> Dict.get part |> Maybe.withDefault "" in letter ++ (toRoman (number - part)) largestFactor : Int -> Int largestFactor number = numerals |> Dict.keys |> List.filter (\p -> p <= number) |> List.reverse |> List.head |> Maybe.withDefault 0 numerals : Dict.Dict Int String numerals = Dict.fromList [ ( 1000, "M" ) , ( 900, "CM" ) , ( 500, "D" ) , ( 400, "CD" ) , ( 100, "C" ) , ( 90, "XC" ) , ( 50, "L" ) , ( 40, "XL" ) , ( 10, "X" ) , ( 9, "IX" ) , ( 5, "V" ) , ( 4, "IV" ) , ( 1, "I" ) ]