mirror of
https://github.com/correl/elm.git
synced 2024-12-19 19:14:14 +00:00
47 lines
789 B
Text
47 lines
789 B
Text
|
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")
|
||
|
]
|