]> fbox.kageds.com Git - adventofcode.git/blob - 2021/day7/day7.erl
day06
[adventofcode.git] / 2021 / day7 / day7.erl
1 %% to compile: erlc day3A.erl
2 %% to run: erl -noshell -s day5 solve
3 %%
4 -module(day7).
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_line(IO).
34
35 read_line(IO) ->
36 case file:read_line(IO) of
37 'eof' -> 'eof';
38 {ok, Line} -> parse_line(Line)
39 end.
40
41 parse_line(Line) ->
42 Points = string:tokens(Line, " ,->\n"),
43 [list_to_integer(X) || X <- Points].
44
45 solution1(Input) ->
46 Max = lists:max(Input),
47 Min = lists:min(Input),
48 io:format("Max: ~p Min: ~p~n", [Max, Min]),
49 Fuels = [ fuel_needed(X, Input, fun fuel1/2) || X <- lists:seq(Min, Max)],
50 lists:min(Fuels).
51
52 solution2(Input) ->
53 Max = lists:max(Input),
54 Min = lists:min(Input),
55 io:format("Soln2: Max: ~p Min: ~p~n", [Max, Min]),
56 Fuels = [ fuel_needed(X, Input, fun fuel2/2) || X <- lists:seq(Min, Max)],
57 lists:min(Fuels).
58
59 fuel_needed(Pos, Data, Fuel_fun) ->
60 fuel_needed(Pos, Data, Fuel_fun, 0).
61
62 fuel_needed(_Pos, [], _, Acc) -> Acc;
63 fuel_needed(Pos, [H|T], Fuel_fun, Acc) ->
64 fuel_needed(Pos, T, Fuel_fun, Acc + Fuel_fun(H, Pos)).
65
66 fuel1(X, X) -> 0;
67 fuel1(X, Y) when X > Y -> X - Y;
68 fuel1(X, Y) when Y > X -> Y - X.
69
70 fuel2(X, X) -> 0;
71 fuel2(X, Y) when X > Y -> fuel_steps(X - Y);
72 fuel2(X, Y) when Y > X -> fuel_steps(Y - X).
73
74 fuel_steps(X) ->
75 fuel_steps(X, 1, 0).
76
77 fuel_steps(0, _Cost, Count) -> Count;
78 fuel_steps(X, Cost, Count) ->
79 fuel_steps(X - 1, Cost + 1, Count + Cost).