21 lines
802 B
Erlang
21 lines
802 B
Erlang
-module( roman_numerals ).
|
|
|
|
-export( [encode_from_integer/1]).
|
|
|
|
-record( encode_acc, {n, romans=""} ).
|
|
|
|
encode_from_integer( N ) when N > 0 ->
|
|
#encode_acc{romans=Romans} = lists:foldl( fun encode_from_integer/2, #encode_acc{n=N}, map() ),
|
|
Romans.
|
|
|
|
|
|
encode_from_integer( _Map, #encode_acc{n=0}=Acc ) -> Acc;
|
|
encode_from_integer( {_Roman, Value}, #encode_acc{n=N}=Acc ) when N < Value -> Acc;
|
|
encode_from_integer( {Roman, Value}, #encode_acc{n=N, romans=Romans} ) ->
|
|
Times = N div Value,
|
|
New_roman = lists:flatten( lists:duplicate(Times, Roman) ),
|
|
#encode_acc{n=N - (Times * Value), romans=Romans ++ New_roman}.
|
|
|
|
map() -> [{"M",1000}, {"CM",900}, {"D",500}, {"CD",400}, {"C",100}, {"XC",90}, {"L",50}, {"XL",40}, {"X",10}, {"IX",9}, {"V",5}, {"IV",4}, {"I\
|
|
",1}].
|