This commit is contained in:
rhiannon morris 2022-12-01 23:59:19 +01:00
parent 65760d712e
commit 88072169a0
4 changed files with 25 additions and 33 deletions

View File

@ -1,6 +1,6 @@
Day1 { Day1 {
nums •BQN0¨ •FLines 𝕩 nums •BQN0¨ •FLines 𝕩
sums (+´ {𝕩𝕨nums}´)¨ (»¨ -») / 0¨ nums sums (+´ {𝕩𝕨nums}´)¨ (»¨ -») /0=nums
sums, +´ 3sums sums, +´ 3sums
} }
•Show Day1 •args •Show Day1 •args

29
aoc.m
View File

@ -9,32 +9,33 @@
:- import_module string. :- import_module string.
:- import_module list. :- import_module list.
:- import_module exception. :- import_module exception.
:- import_module univ.
main(!IO) :- wrap_main(main2, !IO). main(!IO) :- wrap_main(main2, !IO).
:- pred main2(io::di, io::uo) is det. :- pred main2(io::di, io::uo) is cc_multi.
main2(!IO) :- main2(!IO) :-
command_line_arguments(Args, !IO), command_line_arguments(Args, !IO),
(if Args = [DayS, PartS | Rest], (if Args = [DayS, PartS, File],
to_int(DayS, Day), to_int(DayS, Day),
part(PartS, Part) then part(PartS, Part) then (
run(Day, Part, Rest, !IO) read_lines_need(File, Lines, !IO),
else if Args = [D, P | _] then run_day(Day, Part, Lines, Out),
die("expected a day and a part, got ""%s"" ""%s""", [s(D), s(P)]) write_line(univ_value(Out), !IO)
else ) else
die("expected at least two args")). die("expected day, part, filename")).
:- type sol == (pred(part, list(string), io, io)). :- type sol == (pred(part, list(string), univ)).
:- inst sol == (pred(in, in, di, uo) is det). :- inst sol == (pred(in, in, out) is cc_multi).
:- pred solution(int::in, sol::out(sol)) is semidet. :- pred solution(int::in, sol::out(sol)) is semidet.
:- import_module day1. :- import_module day1.
solution(1, day1.run). solution(1, day1.run).
:- pred run(int::in, part::in, list(string)::in, io::di, io::uo) is det. :- pred run_day(int, part, list(string), univ).
:- mode run_day(in, in, in, out) is cc_multi.
run(Day, Part, Args, !IO) :- run_day(Day, Part, Lines, Out) :-
if solution(Day, P) then if solution(Day, P) then
P(Part, Args, !IO) P(Part, Lines, Out)
else else
die("no solution for day %d", [i(Day)]). die("no solution for day %d", [i(Day)]).

View File

@ -1,7 +1,7 @@
:- module basics. :- module basics.
:- interface. :- interface.
:- type part ---> one; two.
:- type part ---> one; two.
:- pred part(string, part). :- pred part(string, part).
:- mode part(in, out) is semidet. :- mode part(in, out) is semidet.
:- mode part(out, in) is det. :- mode part(out, in) is det.
@ -18,10 +18,9 @@
:- pred read_lines_need(string::in, list(string)::out, io::di, io::uo) is det. :- pred read_lines_need(string::in, list(string)::out, io::di, io::uo) is det.
:- type main == (pred(io, io)). :- pred wrap_main(pred(io, io), io, io).
:- inst main == (pred(di, uo) is det). :- 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.
:- pred wrap_main(main::in(main), io::di, io::uo) is cc_multi.
:- import_module maybe. :- import_module maybe.

18
day1.m
View File

@ -1,10 +1,10 @@
:- module day1. :- module day1.
:- interface. :- interface.
:- import_module basics. :- import_module basics.
:- import_module io.
:- import_module list. :- import_module list.
:- import_module univ.
:- pred run(part::in, list(string)::in, io::di, io::uo) is det. :- pred run(part::in, list(string)::in, univ::out) is cc_multi.
:- implementation. :- implementation.
:- import_module std_util. :- import_module std_util.
@ -12,17 +12,9 @@
:- import_module string. :- import_module string.
:- import_module int. :- import_module int.
run(Part, Args, !IO) :- :- pragma no_determinism_warning(run/3).
if Args = [File] then ( run(one, Lines, univ(det_head(go(Lines)))).
read_lines_need(File, Lines, !IO), run(two, Lines, univ(sum(take_upto(3, go(Lines))))).
Totals = go(Lines),
( Part = one,
format("%d\n", [i(det_head(Totals))], !IO)
; Part = two,
Res = sum(take_upto(3, Totals)),
format("%d\n", [i(Res)], !IO)
)
) else die("expected one readable file").
:- func go(list(string)) = list(int). :- func go(list(string)) = list(int).
go(Lines) = go(Lines) =