1 %% to compile: erlc day3A.erl
2 %% to run: erl -noshell -s day3 solve
6 -export ([solve/0, solve/1, solve/2]).
7 -export ([read_input/0]).
15 solve(A, read_input()).
18 io:format("The solution to ~p puzzle1 is: ~p~n", [?MODULE, solve(1, D)]);
22 io:format("The solution to ~p puzzle2 is: ~p~n", [?MODULE, solve(2, D)]);
27 {ok, IO} = file:open("input.txt", 'read'),
28 Data = read_input(IO),
35 read_input(IO, Input) ->
38 Line -> read_input(IO, Input ++ [Line])
42 case file:read_line(IO) of
44 {ok, Line} -> [ X || X <- Line, [X] /= "\n"]
48 lists:sum([parse(X) || X <- Input]).
51 List = [incomplete(X) || X <- Input],
52 Filter_fail = lists:filter(fun(X) -> X /= 'failed' end, List),
53 Scores = lists:sort([lists:foldl(fun(X, Acc) -> (Acc * 5) + value(X) end, 0, F) || F <- Filter_fail]),
54 lists:nth(length(Scores) div 2 + 1, Scores).
56 incomplete([H|T] = Input) ->
57 io:format("~p~n", [Input]),
59 incomplete(T, [partner(H)])
62 {incomplete, Rest} -> Rest
67 incomplete([], Expected) -> {incomplete, Expected};
68 incomplete(Rest, []) -> {incomplete, incomplete(Rest)};
70 incomplete([H|T], [H|Rest]) -> incomplete(T, Rest);
71 incomplete([H|T], Expected) -> incomplete(T, [partner(H)|Expected]).
73 parse([H|T] = Input) ->
74 io:format("~p~n", [Input]),
76 parse(T, [partner(H)])
80 _:{invalid_partner,")"} -> 3;
81 _:{invalid_partner,"]"} -> 57;
82 _:{invalid_partner,"}"} -> 1197;
83 _:{invalid_partner,">"} -> 25137
86 parse([], Expected) -> {parsed, Expected};
87 parse(Rest, []) -> {incomplete, parse(Rest)};
89 parse([H|T], [H|Rest]) -> parse(T, Rest);
90 parse([H|T], Expected) -> parse(T, [partner(H)|Expected]).
96 partner(X) -> throw({invalid_partner, [X]}).