day1
This commit is contained in:
parent
ea6fb40895
commit
835eeefc0a
3 changed files with 49 additions and 1 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -2,3 +2,4 @@ Mercury/
|
||||||
*.mh
|
*.mh
|
||||||
*.err
|
*.err
|
||||||
aoc
|
aoc
|
||||||
|
input/
|
||||||
|
|
3
aoc.m
3
aoc.m
|
@ -31,7 +31,8 @@ main2(!IO) :-
|
||||||
:- inst solution == (pred(in, in, di, uo) is det).
|
:- inst solution == (pred(in, in, di, uo) is det).
|
||||||
|
|
||||||
:- pred solution(int::in, solution::out(solution)) is semidet.
|
:- pred solution(int::in, solution::out(solution)) is semidet.
|
||||||
solution(_, _) :- fail.
|
:- import_module day1.
|
||||||
|
solution(1, day1.run).
|
||||||
|
|
||||||
:- pred run(int::in, part::in, list(string)::in, io::di, io::uo) is det.
|
:- pred run(int::in, part::in, list(string)::in, io::di, io::uo) is det.
|
||||||
|
|
||||||
|
|
46
day1.m
Normal file
46
day1.m
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
:- module day1.
|
||||||
|
:- interface.
|
||||||
|
:- import_module basics.
|
||||||
|
:- import_module io.
|
||||||
|
:- import_module list.
|
||||||
|
|
||||||
|
:- pred run(part::in, list(string)::in, io::di, io::uo) is det.
|
||||||
|
|
||||||
|
:- implementation.
|
||||||
|
:- import_module die.
|
||||||
|
:- import_module std_util.
|
||||||
|
:- import_module string.
|
||||||
|
:- import_module int.
|
||||||
|
|
||||||
|
run(Part, Args, !IO) :-
|
||||||
|
if Args = [File] then (
|
||||||
|
read_named_file_as_lines(File, LinesM, !IO),
|
||||||
|
need(LinesM, 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).
|
||||||
|
go(Lines) = sort(converse(ordering), map(int_sum, gather(Lines))).
|
||||||
|
|
||||||
|
:- func gather(list(string)::in) = (list(list(string))::out(non_empty_list)).
|
||||||
|
gather([]) = [[]].
|
||||||
|
gather([X | Xs]) = Groups :-
|
||||||
|
[Ys | Yss] = gather(Xs),
|
||||||
|
(if X = "" then Groups = [[], Ys | Yss]
|
||||||
|
else Groups = [[X | Ys] | Yss]).
|
||||||
|
|
||||||
|
:- func sum(list(int)) = int.
|
||||||
|
sum(Xs) = foldl(func(X, Y) = X + Y, Xs, 0).
|
||||||
|
|
||||||
|
:- func int_sum(list(string)) = int.
|
||||||
|
int_sum(Xs) = sum(map(det_to_int, Xs)).
|
||||||
|
|
||||||
|
:- pred need(io.res(T)::in, T::out) is det.
|
||||||
|
need(ok(X), X).
|
||||||
|
need(error(E), _) :- die(error_message(E)).
|
Loading…
Reference in a new issue