I created this app to learn Erlang. It takes a Date and returns a string representation of the date according to ab urbe condite, or AUC. It also will provide the roman numeral for a number.

Since there’s very little code I can include it all here:

to_roman(Number) ->
  build_roman( Number, "", lists:reverse( roman_numerals_dict()) ).

%% ROMAN NUMERAL BUILDER FUNCTIONS

build_roman(Number, RomanNumeral, NumeralsList) when Number == 0 ->
  RomanNumeral;

build_roman(Number, RomanNumeral, NumeralsList) when Number > 0 ->
  {Divisor, Numeral} = greatest_divisor(Number, NumeralsList),
  NewNumber = Number - Divisor,
  build_roman( NewNumber , RomanNumeral ++ Numeral, NumeralsList ).

greatest_divisor(Number, NumeralsList) ->
  lists:max( lists:filter( divides_number(Number) , NumeralsList)).

divides_number(Number) ->
  fun({K,_}) -> Number div K > 0 end.

%% TREE BUILDER FUNCTIONS

roman_numerals_dict() ->
  orddict:from_list( build_list(roman_numerals(), []) ).

subtract({Number, Numeral}, {OtherNumber, OtherNumeral}) ->
  { Number - OtherNumber, OtherNumeral ++ Numeral }.

is_less_than(NumeralTuple, OtherNumeralTuple) ->
  if
    element(1, NumeralTuple) < element(1, OtherNumeralTuple) -> true;
    true -> false
  end.

lesser_numerals(NumeralTuple) ->
  fun(A) -> is_less_than(A, NumeralTuple) end.

subtract(NumeralTuple) ->
  fun(A) -> subtract(NumeralTuple, A) end.

numerals_less_than_given(NumeralTuple) ->
  lists:filter(lesser_numerals(NumeralTuple), roman_numerals()).

subtracted_numerals(NumeralTuple) ->
  lists:map( subtract(NumeralTuple), numerals_less_than_given(NumeralTuple)).

not_duplicate_numeral() ->
 fun(A) ->
   Key = element(1, A),
   Dict = orddict:from_list(roman_numerals()),
   not orddict:is_key(Key, Dict)
 end.

numerals_with_subtracted(NumeralTuple) ->
  SubtractedNumerals = lists:filter( not_duplicate_numeral(), subtracted_numerals(NumeralTuple)),
  [NumeralTuple] ++ SubtractedNumerals.

build_list(L, BuiltList) when length(L) == 0 ->
  BuiltList;

build_list(L, BuiltList) when length(L) > 0 ->
  {Tuple, Remaining} = lists:split(1, L),
  NewBuiltList = BuiltList ++ numerals_with_subtracted(lists:last(Tuple)),
  build_list( Remaining, NewBuiltList ).

roman_numerals() ->
  [
    {    1,  "I" },
    {    5,  "V" },
    {   10,  "X" },
    {   50,  "L" },
    {  100,  "C" },
    {  500,  "D" },
    { 1000,  "M" }
  ].