day24 solution
parent
9fe074b396
commit
0c219c6f2f
|
@ -0,0 +1,8 @@
|
|||
all: day24.beam
|
||||
erl -noshell -s day24 start -s init stop
|
||||
|
||||
day24.beam:
|
||||
erlc day24.erl
|
||||
|
||||
clean:
|
||||
rm -f day24.beam
|
|
@ -0,0 +1,79 @@
|
|||
-module(day24).
|
||||
-export([start/0]).
|
||||
|
||||
read_input(Filename)
|
||||
-> { ok, Input } = file:read_file(Filename),
|
||||
lists:map(fun(X) ->
|
||||
[A,B|_] = re:split(X, "/"),
|
||||
{ AInt, _ } = string:to_integer(A),
|
||||
{ BInt, _ } = string:to_integer(B),
|
||||
{ AInt, BInt }
|
||||
end, re:split(string:chomp(Input), "\n")).
|
||||
|
||||
strongest_bridge(Input)
|
||||
-> strongest_bridge(Input, 0, 0, []).
|
||||
|
||||
strongest_bridge([], _LastEdge, Sum, Train)
|
||||
-> { Sum, Train };
|
||||
strongest_bridge(Input, LastEdge, Sum, Train)
|
||||
-> { Matching, _ } = lists:partition(fun(X) ->
|
||||
{ A, B } = X,
|
||||
(A == LastEdge) or (B == LastEdge)
|
||||
end, Input),
|
||||
if length(Matching) == 0 -> { Sum, Train };
|
||||
true ->
|
||||
MatchingSums = lists:map(fun(X) ->
|
||||
{ _, Remaining } = lists:partition(fun(Y) -> Y == X end, Input),
|
||||
{ A, B } = X,
|
||||
NewTrain = lists:append(Train, [X]),
|
||||
NewSum = Sum + A + B,
|
||||
if A == LastEdge -> strongest_bridge(Remaining, B, NewSum, NewTrain);
|
||||
true -> strongest_bridge(Remaining, A, NewSum, NewTrain)
|
||||
end
|
||||
end, Matching),
|
||||
[FirstSum|_] = lists:sort(fun(X, Y) ->
|
||||
{ A, _ } = X,
|
||||
{ B, _ } = Y,
|
||||
B =< A
|
||||
end, MatchingSums),
|
||||
FirstSum
|
||||
end.
|
||||
|
||||
longest_bridge(Input)
|
||||
-> longest_bridge(Input, 0, 0, []).
|
||||
|
||||
longest_bridge([], _LastEdge, Sum, Train)
|
||||
-> { Sum, Train };
|
||||
longest_bridge(Input, LastEdge, Sum, Train)
|
||||
-> { Matching, _ } = lists:partition(fun(X) ->
|
||||
{ A, B } = X,
|
||||
(A == LastEdge) or (B == LastEdge)
|
||||
end, Input),
|
||||
if length(Matching) == 0 -> { Sum, Train };
|
||||
true ->
|
||||
MatchingSums = lists:map(fun(X) ->
|
||||
{ _, Remaining } = lists:partition(fun(Y) -> Y == X end, Input),
|
||||
{ A, B } = X,
|
||||
NewTrain = lists:append(Train, [X]),
|
||||
NewSum = Sum + A + B,
|
||||
if A == LastEdge -> longest_bridge(Remaining, B, NewSum, NewTrain);
|
||||
true -> longest_bridge(Remaining, A, NewSum, NewTrain)
|
||||
end
|
||||
end, Matching),
|
||||
[FirstSum|_] = lists:sort(fun(X, Y) ->
|
||||
{ A, I } = X,
|
||||
{ B, J } = Y,
|
||||
if length(I) == length(J) -> B =< A;
|
||||
true -> length(J) =< length(I)
|
||||
end
|
||||
end, MatchingSums),
|
||||
FirstSum
|
||||
end.
|
||||
|
||||
start()
|
||||
-> SampleInput = read_input("sample"),
|
||||
io:fwrite("~p~n", [strongest_bridge(SampleInput)]),
|
||||
io:fwrite("~p~n", [longest_bridge(SampleInput)]),
|
||||
ProblemInput = read_input("problem"),
|
||||
io:fwrite("~p~n", [strongest_bridge(ProblemInput)]),
|
||||
io:fwrite("~p~n", [longest_bridge(ProblemInput)]).
|
|
@ -0,0 +1,57 @@
|
|||
14/42
|
||||
2/3
|
||||
6/44
|
||||
4/10
|
||||
23/49
|
||||
35/39
|
||||
46/46
|
||||
5/29
|
||||
13/20
|
||||
33/9
|
||||
24/50
|
||||
0/30
|
||||
9/10
|
||||
41/44
|
||||
35/50
|
||||
44/50
|
||||
5/11
|
||||
21/24
|
||||
7/39
|
||||
46/31
|
||||
38/38
|
||||
22/26
|
||||
8/9
|
||||
16/4
|
||||
23/39
|
||||
26/5
|
||||
40/40
|
||||
29/29
|
||||
5/20
|
||||
3/32
|
||||
42/11
|
||||
16/14
|
||||
27/49
|
||||
36/20
|
||||
18/39
|
||||
49/41
|
||||
16/6
|
||||
24/46
|
||||
44/48
|
||||
36/4
|
||||
6/6
|
||||
13/6
|
||||
42/12
|
||||
29/41
|
||||
39/39
|
||||
9/3
|
||||
30/2
|
||||
25/20
|
||||
15/6
|
||||
15/23
|
||||
28/40
|
||||
8/7
|
||||
26/23
|
||||
48/10
|
||||
28/28
|
||||
2/13
|
||||
48/14
|
|
@ -0,0 +1,8 @@
|
|||
0/2
|
||||
2/2
|
||||
2/3
|
||||
3/4
|
||||
3/5
|
||||
0/1
|
||||
10/1
|
||||
9/10
|
Loading…
Reference in New Issue