2022-12-01 02:56:19 -05:00
|
|
|
:- module basics.
|
|
|
|
:- interface.
|
2022-12-10 01:05:22 -05:00
|
|
|
:- import_module io.
|
2022-12-01 02:56:19 -05:00
|
|
|
|
2022-12-01 17:59:19 -05:00
|
|
|
:- type part ---> one; two.
|
2022-12-01 02:56:19 -05:00
|
|
|
:- pred part(string, part).
|
|
|
|
:- mode part(in, out) is semidet.
|
2022-12-01 13:23:53 -05:00
|
|
|
:- mode part(out, in) is det.
|
|
|
|
|
2022-12-09 06:18:58 -05:00
|
|
|
:- func part(part, T, T) = T.
|
|
|
|
|
2022-12-11 03:00:55 -05:00
|
|
|
:- type answer --->
|
|
|
|
int(int); string(string); lines(list(string));
|
|
|
|
some [T] other(T).
|
2022-12-10 01:05:22 -05:00
|
|
|
:- pred output(answer::in, io::di, io::uo) is det.
|
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
|
2022-12-10 03:42:22 -05:00
|
|
|
:- func ite((pred), T, T) = T.
|
|
|
|
:- mode ite((pred) is semidet, in, in) = out is det.
|
|
|
|
|
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
:- import_module list.
|
|
|
|
:- import_module string.
|
|
|
|
|
2022-12-05 04:14:29 -05:00
|
|
|
:- type lines == list(string).
|
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
:- pred die(string::in) is erroneous.
|
|
|
|
:- pred die(string::in, list(poly_type)::in) is erroneous.
|
|
|
|
|
|
|
|
:- pred need(io.res(T)::in, T::out) is det.
|
2022-12-05 04:14:29 -05:00
|
|
|
:- pred read_lines_need(string::in, lines::out, io::di, io::uo) is det.
|
2022-12-01 13:23:53 -05:00
|
|
|
|
|
|
|
|
2022-12-01 17:59:19 -05:00
|
|
|
:- pred wrap_main(pred(io, io), io, io).
|
|
|
|
:- mode wrap_main(pred(di, uo) is cc_multi, di, uo) is cc_multi.
|
|
|
|
:- mode wrap_main(pred(di, uo) is det, di, uo) is cc_multi.
|
2022-12-01 13:23:53 -05:00
|
|
|
|
|
|
|
|
2022-12-03 00:33:45 -05:00
|
|
|
:- import_module char.
|
|
|
|
|
|
|
|
:- type chars == list(char).
|
|
|
|
|
|
|
|
|
|
|
|
:- func sum(list(int)) = int.
|
2022-12-11 03:00:55 -05:00
|
|
|
:- func prod(list(int)) = int.
|
2022-12-09 06:18:58 -05:00
|
|
|
:- func replicate(int, T) = list(T).
|
2022-12-11 03:00:55 -05:00
|
|
|
:- func rev_sort(list(T)) = list(T).
|
2022-12-03 00:33:45 -05:00
|
|
|
|
2022-12-10 03:42:22 -05:00
|
|
|
:- func map_index(func(int, T) = U, list(T)) = list(U).
|
|
|
|
|
2022-12-03 00:33:45 -05:00
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
:- import_module maybe.
|
|
|
|
|
|
|
|
:- func to_int_may(string) = maybe(int).
|
|
|
|
|
2022-12-01 02:56:19 -05:00
|
|
|
|
|
|
|
:- implementation.
|
|
|
|
|
|
|
|
part("1", one).
|
|
|
|
part("2", two).
|
2022-12-01 13:23:53 -05:00
|
|
|
|
2022-12-09 06:18:58 -05:00
|
|
|
part(one, X, _) = X.
|
|
|
|
part(two, _, Y) = Y.
|
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
|
2022-12-10 01:05:22 -05:00
|
|
|
output(int(I), !IO) :- write_int(I, !IO), nl(!IO).
|
|
|
|
output(string(S), !IO) :- write_string(S, !IO), nl(!IO).
|
|
|
|
output(lines(Ss), !IO) :- write_list(Ss, "\n", write_string, !IO), nl(!IO).
|
2022-12-11 03:00:55 -05:00
|
|
|
output(other(X), !IO) :- write(X, !IO), nl(!IO).
|
2022-12-10 01:05:22 -05:00
|
|
|
|
2022-12-10 03:42:22 -05:00
|
|
|
|
|
|
|
ite(P, T, E) = X :- if P then X = T else X = E.
|
|
|
|
|
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
:- import_module exception.
|
|
|
|
|
|
|
|
:- type die ---> death(string).
|
|
|
|
|
|
|
|
die(Str) :- throw(death(Str)).
|
|
|
|
die(Fmt, Args) :- die(format(Fmt, Args)).
|
|
|
|
|
|
|
|
wrap_main(Main, !IO) :-
|
|
|
|
try [io(!IO)] Main(!IO)
|
|
|
|
then true
|
|
|
|
catch death(Err) -> (
|
|
|
|
format("%s\n", [s(Err)], !IO),
|
|
|
|
set_exit_status(1, !IO)
|
|
|
|
).
|
|
|
|
|
|
|
|
need(ok(X), X).
|
|
|
|
need(error(E), _) :- die(error_message(E)).
|
|
|
|
|
|
|
|
read_lines_need(File, Lines, !IO) :-
|
|
|
|
read_named_file_as_lines(File, Res, !IO),
|
|
|
|
need(Res, Lines).
|
|
|
|
|
|
|
|
|
2022-12-11 03:00:55 -05:00
|
|
|
:- import_module int.
|
|
|
|
|
2022-12-03 00:33:45 -05:00
|
|
|
sum(Xs) = foldl(plus, Xs, 0).
|
2022-12-11 03:00:55 -05:00
|
|
|
prod(Xs) = foldl(times, Xs, 1).
|
2022-12-03 00:33:45 -05:00
|
|
|
|
2022-12-09 06:18:58 -05:00
|
|
|
replicate(N, X) = Out :-
|
|
|
|
if N = 0 then Out = [] else Out = [X | replicate(N - 1, X)].
|
2022-12-03 00:33:45 -05:00
|
|
|
|
2022-12-11 03:00:55 -05:00
|
|
|
:- import_module std_util.
|
|
|
|
|
|
|
|
rev_sort(Xs) = sort(converse(ordering), Xs).
|
|
|
|
|
2022-12-10 03:42:22 -05:00
|
|
|
:- func map_index(int, func(int, T) = U, list(T)) = list(U).
|
|
|
|
map_index(_, _, []) = [].
|
|
|
|
map_index(I, F, [X | Xs]) = [F(I, X) | map_index(I+1, F, Xs)].
|
|
|
|
|
|
|
|
map_index(F, Xs) = map_index(0, F, Xs).
|
|
|
|
|
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
to_int_may(Str) = Out :-
|
|
|
|
if to_int(Str, N) then Out = yes(N) else Out = no.
|