]> fbox.kageds.com Git - adventofcode.git/blob - 2021/day10/day10.erl
day02
[adventofcode.git] / 2021 / day10 / day10.erl
1 %% to compile: erlc day3A.erl
2 %% to run: erl -noshell -s day3 solve
3 %%
4 -module(day10).
5
6 -export ([solve/0, solve/1, solve/2]).
7 -export ([read_input/0]).
8
9 solve() ->
10 solve(['1']),
11 solve(['2']),
12 init:stop().
13
14 solve(A) ->
15 solve(A, read_input()).
16
17 solve(['1'], D) ->
18 io:format("The solution to ~p puzzle1 is: ~p~n", [?MODULE, solve(1, D)]);
19 solve(1, D) ->
20 solution1(D);
21 solve(['2'], D) ->
22 io:format("The solution to ~p puzzle2 is: ~p~n", [?MODULE, solve(2, D)]);
23 solve(2, D) ->
24 solution2(D).
25
26 read_input() ->
27 {ok, IO} = file:open("input.txt", 'read'),
28 Data = read_input(IO),
29 file:close(IO),
30 Data.
31
32 read_input(IO) ->
33 read_input(IO, []).
34
35 read_input(IO, Input) ->
36 case read_line(IO) of
37 'eof' -> Input;
38 Line -> read_input(IO, Input ++ [Line])
39 end.
40
41 read_line(IO) ->
42 case file:read_line(IO) of
43 'eof' -> 'eof';
44 {ok, Line} -> [ X || X <- Line, [X] /= "\n"]
45 end.
46
47 solution1(Input) ->
48 lists:sum([parse(X) || X <- Input]).
49
50 solution2(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).
55
56 incomplete([H|T] = Input) ->
57 io:format("~p~n", [Input]),
58 try
59 incomplete(T, [partner(H)])
60 of
61 ok -> 'ok';
62 {incomplete, Rest} -> Rest
63 catch
64 _:_ -> 'failed'
65 end.
66
67 incomplete([], Expected) -> {incomplete, Expected};
68 incomplete(Rest, []) -> {incomplete, incomplete(Rest)};
69
70 incomplete([H|T], [H|Rest]) -> incomplete(T, Rest);
71 incomplete([H|T], Expected) -> incomplete(T, [partner(H)|Expected]).
72
73 parse([H|T] = Input) ->
74 io:format("~p~n", [Input]),
75 try
76 parse(T, [partner(H)])
77 of
78 _ -> 0
79 catch
80 _:{invalid_partner,")"} -> 3;
81 _:{invalid_partner,"]"} -> 57;
82 _:{invalid_partner,"}"} -> 1197;
83 _:{invalid_partner,">"} -> 25137
84 end.
85
86 parse([], Expected) -> {parsed, Expected};
87 parse(Rest, []) -> {incomplete, parse(Rest)};
88
89 parse([H|T], [H|Rest]) -> parse(T, Rest);
90 parse([H|T], Expected) -> parse(T, [partner(H)|Expected]).
91
92 partner($() -> $);
93 partner($[) -> $];
94 partner(${) -> $};
95 partner($<) -> $>;
96 partner(X) -> throw({invalid_partner, [X]}).
97
98 value($)) -> 1;
99 value($]) -> 2;
100 value($}) -> 3;
101 value($>) -> 4.