]> fbox.kageds.com Git - adventofcode.git/blob - day13/day13.erl
commit
[adventofcode.git] / day13 / day13.erl
1 %% to compile: erlc day3A.erl
2 %% to run: erl -noshell -s day5 solve
3 %%
4 -module(day13).
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} -> parse_line(Line)
45 end.
46
47 parse_line(Line) ->
48 Points = string:tokens(Line, " ,\n"),
49 [X, Y] = [list_to_integer(X) || X <- Points],
50 {X, Y}.
51
52 solution1(Input) ->
53 io:format("Input ~p~n", [Input]),
54 F1 = fold(x, 655, Input),
55 length(F1).
56
57 solution2(Input) ->
58 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)))))))))))),
59 MaxX = lists:foldl(fun({T, _}, Acc) -> case T > Acc of 'true' -> T; _ -> Acc end end, 0, I),
60 MaxY = lists:foldl(fun({_, T}, Acc) -> case T > Acc of 'true' -> T; _ -> Acc end end, 0, I),
61 Coords = [{X,Y} || Y <- lists:seq(0,MaxY), X <- lists:seq(0,MaxX)],
62 output(Coords, I, MaxX).
63
64 output([], I, MaxX) -> ok;
65 output([{X,Y}|Rest], I, MaxX) ->
66 case lists:member({X,Y}, I) of
67 'true' -> io:format("#");
68 'false' -> io:format(" ")
69 end,
70 case X == MaxX of
71 'true' -> io:format("~n");
72 'false' -> ok
73 end,
74 output(Rest, I, MaxX).
75
76 fold(y, N, Input) ->
77 L1 = [ {X, (Y * -1) + N} || {X, Y} <- Input],
78 {Sat, NotSat} = lists:partition(fun({_,Y}) -> Y < 0 end, L1),
79 Sat2 = [{X, Y * -1}|| {X, Y} <- Sat],
80 L2 = lists:usort(NotSat ++ Sat2),
81 [ {X, (Y - N) * -1} || {X,Y} <- L2];
82 fold(x, N, Input) ->
83 L1 = [ {(X * -1) + N, Y} || {X, Y} <- Input],
84 {Sat, NotSat} = lists:partition(fun({X,_}) -> X < 0 end, L1),
85 Sat2 = [{X * -1, Y}|| {X, Y} <- Sat],
86 L2 = lists:usort(NotSat ++ Sat2),
87 [ {(X - N) * -1, Y} || {X,Y} <- L2].
88