re-organise repo
This commit is contained in:
88
2021/day13/day13.erl
Normal file
88
2021/day13/day13.erl
Normal file
@@ -0,0 +1,88 @@
|
||||
%% to compile: erlc day3A.erl
|
||||
%% to run: erl -noshell -s day5 solve
|
||||
%%
|
||||
-module(day13).
|
||||
|
||||
-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} -> parse_line(Line)
|
||||
end.
|
||||
|
||||
parse_line(Line) ->
|
||||
Points = string:tokens(Line, " ,\n"),
|
||||
[X, Y] = [list_to_integer(X) || X <- Points],
|
||||
{X, Y}.
|
||||
|
||||
solution1(Input) ->
|
||||
io:format("Input ~p~n", [Input]),
|
||||
F1 = fold(x, 655, Input),
|
||||
length(F1).
|
||||
|
||||
solution2(Input) ->
|
||||
I = fold(y,6,fold(y,13,fold(y,27,fold(x,40,fold(y,55,fold(x,81,fold(y,111,fold(x,163,fold(y,223,fold(x,327,fold(y,447,fold(x,655, Input)))))))))))),
|
||||
MaxX = lists:foldl(fun({T, _}, Acc) -> case T > Acc of 'true' -> T; _ -> Acc end end, 0, I),
|
||||
MaxY = lists:foldl(fun({_, T}, Acc) -> case T > Acc of 'true' -> T; _ -> Acc end end, 0, I),
|
||||
Coords = [{X,Y} || Y <- lists:seq(0,MaxY), X <- lists:seq(0,MaxX)],
|
||||
output(Coords, I, MaxX).
|
||||
|
||||
output([], I, MaxX) -> ok;
|
||||
output([{X,Y}|Rest], I, MaxX) ->
|
||||
case lists:member({X,Y}, I) of
|
||||
'true' -> io:format("#");
|
||||
'false' -> io:format(" ")
|
||||
end,
|
||||
case X == MaxX of
|
||||
'true' -> io:format("~n");
|
||||
'false' -> ok
|
||||
end,
|
||||
output(Rest, I, MaxX).
|
||||
|
||||
fold(y, N, Input) ->
|
||||
L1 = [ {X, (Y * -1) + N} || {X, Y} <- Input],
|
||||
{Sat, NotSat} = lists:partition(fun({_,Y}) -> Y < 0 end, L1),
|
||||
Sat2 = [{X, Y * -1}|| {X, Y} <- Sat],
|
||||
L2 = lists:usort(NotSat ++ Sat2),
|
||||
[ {X, (Y - N) * -1} || {X,Y} <- L2];
|
||||
fold(x, N, Input) ->
|
||||
L1 = [ {(X * -1) + N, Y} || {X, Y} <- Input],
|
||||
{Sat, NotSat} = lists:partition(fun({X,_}) -> X < 0 end, L1),
|
||||
Sat2 = [{X * -1, Y}|| {X, Y} <- Sat],
|
||||
L2 = lists:usort(NotSat ++ Sat2),
|
||||
[ {(X - N) * -1, Y} || {X,Y} <- L2].
|
||||
|
||||
Reference in New Issue
Block a user