alan day10 erlang
This commit is contained in:
101
day10/day10.erl
Normal file
101
day10/day10.erl
Normal file
@@ -0,0 +1,101 @@
|
||||
%% to compile: erlc day3A.erl
|
||||
%% to run: erl -noshell -s day3 solve
|
||||
%%
|
||||
-module(day10).
|
||||
|
||||
-export ([solve/0, solve/1, solve/2]).
|
||||
-export ([read_input/0]).
|
||||
|
||||
solve() ->
|
||||
solve(['1']),
|
||||
solve(['2']),
|
||||
init:stop().
|
||||
|
||||
solve(A) ->
|
||||
solve(A, read_input()).
|
||||
|
||||
solve(['1'], D) ->
|
||||
io:format("The solution to ~p puzzle1 is: ~p~n", [?MODULE, solve(1, D)]);
|
||||
solve(1, D) ->
|
||||
solution1(D);
|
||||
solve(['2'], D) ->
|
||||
io:format("The solution to ~p puzzle2 is: ~p~n", [?MODULE, solve(2, D)]);
|
||||
solve(2, D) ->
|
||||
solution2(D).
|
||||
|
||||
read_input() ->
|
||||
{ok, IO} = file:open("input.txt", 'read'),
|
||||
Data = read_input(IO),
|
||||
file:close(IO),
|
||||
Data.
|
||||
|
||||
read_input(IO) ->
|
||||
read_input(IO, []).
|
||||
|
||||
read_input(IO, Input) ->
|
||||
case read_line(IO) of
|
||||
'eof' -> Input;
|
||||
Line -> read_input(IO, Input ++ [Line])
|
||||
end.
|
||||
|
||||
read_line(IO) ->
|
||||
case file:read_line(IO) of
|
||||
'eof' -> 'eof';
|
||||
{ok, Line} -> [ X || X <- Line, [X] /= "\n"]
|
||||
end.
|
||||
|
||||
solution1(Input) ->
|
||||
lists:sum([parse(X) || X <- Input]).
|
||||
|
||||
solution2(Input) ->
|
||||
List = [incomplete(X) || X <- Input],
|
||||
Filter_fail = lists:filter(fun(X) -> X /= 'failed' end, List),
|
||||
Scores = lists:sort([lists:foldl(fun(X, Acc) -> (Acc * 5) + value(X) end, 0, F) || F <- Filter_fail]),
|
||||
lists:nth(length(Scores) div 2 + 1, Scores).
|
||||
|
||||
incomplete([H|T] = Input) ->
|
||||
io:format("~p~n", [Input]),
|
||||
try
|
||||
incomplete(T, [partner(H)])
|
||||
of
|
||||
ok -> 'ok';
|
||||
{incomplete, Rest} -> Rest
|
||||
catch
|
||||
_:_ -> 'failed'
|
||||
end.
|
||||
|
||||
incomplete([], Expected) -> {incomplete, Expected};
|
||||
incomplete(Rest, []) -> {incomplete, incomplete(Rest)};
|
||||
|
||||
incomplete([H|T], [H|Rest]) -> incomplete(T, Rest);
|
||||
incomplete([H|T], Expected) -> incomplete(T, [partner(H)|Expected]).
|
||||
|
||||
parse([H|T] = Input) ->
|
||||
io:format("~p~n", [Input]),
|
||||
try
|
||||
parse(T, [partner(H)])
|
||||
of
|
||||
_ -> 0
|
||||
catch
|
||||
_:{invalid_partner,")"} -> 3;
|
||||
_:{invalid_partner,"]"} -> 57;
|
||||
_:{invalid_partner,"}"} -> 1197;
|
||||
_:{invalid_partner,">"} -> 25137
|
||||
end.
|
||||
|
||||
parse([], Expected) -> {parsed, Expected};
|
||||
parse(Rest, []) -> {incomplete, parse(Rest)};
|
||||
|
||||
parse([H|T], [H|Rest]) -> parse(T, Rest);
|
||||
parse([H|T], Expected) -> parse(T, [partner(H)|Expected]).
|
||||
|
||||
partner($() -> $);
|
||||
partner($[) -> $];
|
||||
partner(${) -> $};
|
||||
partner($<) -> $>;
|
||||
partner(X) -> throw({invalid_partner, [X]}).
|
||||
|
||||
value($)) -> 1;
|
||||
value($]) -> 2;
|
||||
value($}) -> 3;
|
||||
value($>) -> 4.
|
||||
Reference in New Issue
Block a user