2022-12-01 02:56:19 -05:00
|
|
|
:- module aoc.
|
|
|
|
:- interface.
|
|
|
|
:- import_module io.
|
|
|
|
|
|
|
|
:- pred main(io::di, io::uo) is cc_multi.
|
|
|
|
|
|
|
|
:- implementation.
|
|
|
|
:- import_module basics.
|
|
|
|
:- import_module string.
|
|
|
|
:- import_module list.
|
|
|
|
:- import_module exception.
|
|
|
|
|
|
|
|
main(!IO) :- wrap_main(main2, !IO).
|
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
:- pred main2(io::di, io::uo) is det.
|
2022-12-01 02:56:19 -05:00
|
|
|
main2(!IO) :-
|
|
|
|
command_line_arguments(Args, !IO),
|
2022-12-01 13:23:53 -05:00
|
|
|
(if Args = [DayS, PartS | Rest],
|
|
|
|
to_int(DayS, Day),
|
|
|
|
part(PartS, Part) then
|
2022-12-01 02:56:19 -05:00
|
|
|
run(Day, Part, Rest, !IO)
|
|
|
|
else if Args = [D, P | _] then
|
|
|
|
die("expected a day and a part, got ""%s"" ""%s""", [s(D), s(P)])
|
|
|
|
else
|
|
|
|
die("expected at least two args")).
|
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
:- type sol == (pred(part, list(string), io, io)).
|
|
|
|
:- inst sol == (pred(in, in, di, uo) is det).
|
2022-12-01 02:56:19 -05:00
|
|
|
|
2022-12-01 13:23:53 -05:00
|
|
|
:- pred solution(int::in, sol::out(sol)) is semidet.
|
2022-12-01 04:46:26 -05:00
|
|
|
:- import_module day1.
|
|
|
|
solution(1, day1.run).
|
2022-12-01 02:56:19 -05:00
|
|
|
|
|
|
|
:- pred run(int::in, part::in, list(string)::in, io::di, io::uo) is det.
|
|
|
|
|
|
|
|
run(Day, Part, Args, !IO) :-
|
|
|
|
if solution(Day, P) then
|
|
|
|
P(Part, Args, !IO)
|
|
|
|
else
|
|
|
|
die("no solution for day %d", [i(Day)]).
|