2016 Update
This commit is contained in:
parent
948b86eafa
commit
dcf5d15da3
7965 changed files with 139854 additions and 31002 deletions
|
|
@ -1,10 +1,5 @@
|
|||
RomanForm[i_Integer?Positive] :=
|
||||
Module[{num = i, string = "", value, letters, digits},
|
||||
digits = {{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"}};
|
||||
While[num > 0, {value, letters} =
|
||||
Which @@ Flatten[{num >= #[[1]], ##} & /@ digits, 1];
|
||||
num -= value;
|
||||
string = string <> letters;];
|
||||
string]
|
||||
RomanNumeral[4]
|
||||
RomanNumeral[99]
|
||||
RomanNumeral[1337]
|
||||
RomanNumeral[1666]
|
||||
RomanNumeral[6889]
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
RomanForm[4]
|
||||
RomanForm[99]
|
||||
RomanForm[1337]
|
||||
RomanForm[1666]
|
||||
RomanForm[6889]
|
||||
IV
|
||||
XCIX
|
||||
MCCCXXXVII
|
||||
MDCLXVI
|
||||
MMMMMMDCCCLXXXIX
|
||||
|
|
|
|||
|
|
@ -1,5 +1,52 @@
|
|||
IV
|
||||
XCIX
|
||||
MCCCXXXVII
|
||||
MDCLXVI
|
||||
MMMMMMDCCCLXXXIX
|
||||
:- module roman.
|
||||
|
||||
:- interface.
|
||||
|
||||
:- import_module io.
|
||||
|
||||
:- pred main(io::di, io::uo) is det.
|
||||
|
||||
:- implementation.
|
||||
|
||||
:- import_module char, int, list, string.
|
||||
|
||||
main(!IO) :-
|
||||
command_line_arguments(Args, !IO),
|
||||
filter(is_all_digits, Args, CleanArgs),
|
||||
foldl((pred(Arg::in, !.IO::di, !:IO::uo) is det :-
|
||||
( Roman = to_roman(Arg) ->
|
||||
format("%s => %s", [s(Arg), s(Roman)], !IO), nl(!IO)
|
||||
; format("%s cannot be converted.", [s(Arg)], !IO), nl(!IO) )
|
||||
), CleanArgs, !IO).
|
||||
|
||||
:- func to_roman(string::in) = (string::out) is semidet.
|
||||
to_roman(Number) = from_char_list(build_roman(reverse(to_char_list(Number)))).
|
||||
|
||||
:- func build_roman(list(char)) = list(char).
|
||||
:- mode build_roman(in) = out is semidet.
|
||||
build_roman([]) = [].
|
||||
build_roman([D|R]) = Roman :-
|
||||
map(promote, build_roman(R), Interim),
|
||||
Roman = Interim ++ digit_to_roman(D).
|
||||
|
||||
:- func digit_to_roman(char) = list(char).
|
||||
:- mode digit_to_roman(in) = out is semidet.
|
||||
digit_to_roman('0') = [].
|
||||
digit_to_roman('1') = ['I'].
|
||||
digit_to_roman('2') = ['I','I'].
|
||||
digit_to_roman('3') = ['I','I','I'].
|
||||
digit_to_roman('4') = ['I','V'].
|
||||
digit_to_roman('5') = ['V'].
|
||||
digit_to_roman('6') = ['V','I'].
|
||||
digit_to_roman('7') = ['V','I','I'].
|
||||
digit_to_roman('8') = ['V','I','I','I'].
|
||||
digit_to_roman('9') = ['I','X'].
|
||||
|
||||
:- pred promote(char::in, char::out) is semidet.
|
||||
promote('I', 'X').
|
||||
promote('V', 'L').
|
||||
promote('X', 'C').
|
||||
promote('L', 'D').
|
||||
promote('C', 'M').
|
||||
|
||||
:- end_module roman.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
:- module roman.
|
||||
:- module roman2.
|
||||
|
||||
:- interface.
|
||||
|
||||
|
|
@ -12,41 +12,37 @@
|
|||
|
||||
main(!IO) :-
|
||||
command_line_arguments(Args, !IO),
|
||||
filter(is_all_digits, Args, CleanArgs),
|
||||
filter_map(to_int, Args, CleanArgs),
|
||||
foldl((pred(Arg::in, !.IO::di, !:IO::uo) is det :-
|
||||
( Roman = to_roman(Arg) ->
|
||||
format("%s => %s", [s(Arg), s(Roman)], !IO), nl(!IO)
|
||||
; format("%s cannot be converted.", [s(Arg)], !IO), nl(!IO) )
|
||||
format("%i => %s",
|
||||
[i(Arg), s(from_char_list(Roman))], !IO),
|
||||
nl(!IO)
|
||||
; format("%i cannot be converted.", [i(Arg)], !IO), nl(!IO) )
|
||||
), CleanArgs, !IO).
|
||||
|
||||
:- func to_roman(string::in) = (string::out) is semidet.
|
||||
to_roman(Number) = from_char_list(build_roman(reverse(to_char_list(Number)))).
|
||||
:- func to_roman(int) = list(char).
|
||||
:- mode to_roman(in) = out is semidet.
|
||||
to_roman(N) = ( N >= 1000 ->
|
||||
['M'] ++ to_roman(N - 1000)
|
||||
;( N >= 100 ->
|
||||
digit(N / 100, 'C', 'D', 'M') ++ to_roman(N rem 100)
|
||||
;( N >= 10 ->
|
||||
digit(N / 10, 'X', 'L', 'C') ++ to_roman(N rem 10)
|
||||
;( N >= 1 ->
|
||||
digit(N, 'I', 'V', 'X')
|
||||
; [] ) ) ) ).
|
||||
|
||||
:- func build_roman(list(char)) = list(char).
|
||||
:- mode build_roman(in) = out is semidet.
|
||||
build_roman([]) = [].
|
||||
build_roman([D|R]) = Roman :-
|
||||
map(promote, build_roman(R), Interim),
|
||||
Roman = Interim ++ digit_to_roman(D).
|
||||
:- func digit(int, char, char, char) = list(char).
|
||||
:- mode digit(in, in, in, in) = out is semidet.
|
||||
digit(1, X, _, _) = [X].
|
||||
digit(2, X, _, _) = [X, X].
|
||||
digit(3, X, _, _) = [X, X, X].
|
||||
digit(4, X, Y, _) = [X, Y].
|
||||
digit(5, _, Y, _) = [Y].
|
||||
digit(6, X, Y, _) = [Y, X].
|
||||
digit(7, X, Y, _) = [Y, X, X].
|
||||
digit(8, X, Y, _) = [Y, X, X, X].
|
||||
digit(9, X, _, Z) = [X, Z].
|
||||
|
||||
:- func digit_to_roman(char) = list(char).
|
||||
:- mode digit_to_roman(in) = out is semidet.
|
||||
digit_to_roman('0') = [].
|
||||
digit_to_roman('1') = ['I'].
|
||||
digit_to_roman('2') = ['I','I'].
|
||||
digit_to_roman('3') = ['I','I','I'].
|
||||
digit_to_roman('4') = ['I','V'].
|
||||
digit_to_roman('5') = ['V'].
|
||||
digit_to_roman('6') = ['V','I'].
|
||||
digit_to_roman('7') = ['V','I','I'].
|
||||
digit_to_roman('8') = ['V','I','I','I'].
|
||||
digit_to_roman('9') = ['I','X'].
|
||||
|
||||
:- pred promote(char::in, char::out) is semidet.
|
||||
promote('I', 'X').
|
||||
promote('V', 'L').
|
||||
promote('X', 'C').
|
||||
promote('L', 'D').
|
||||
promote('C', 'M').
|
||||
|
||||
:- end_module roman.
|
||||
:- end_module roman2.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue