1 %% to compile: erlc day3A.erl
2 %% to run: erl -noshell -s day3 solve
6 -export ([solve/0, solve/1, solve/2]).
14 solve(A, get_test_data()).
17 io:format("The solution to ~p puzzle1 is: ~p~n", [?MODULE, solve(1, D)]);
21 io:format("The solution to ~p puzzle2 is: ~p~n", [?MODULE, solve(2, D)]);
26 Count_list = get_count_list(D),
27 Gamma = [ case Ones > Zeros of 'true' -> $1; 'false' -> $0 end || {Ones, Zeros} <- Count_list],
28 Epsilion = [ case Ones > Zeros of 'true' -> $0; 'false' -> $1 end || {Ones, Zeros} <- Count_list],
29 bl2int(Gamma) * bl2int(Epsilion).
32 Most_common = fun(X,Y) -> X >= Y end,
33 Least_common = fun(X, Y) -> X < Y end,
34 get_rating(D, Most_common) * get_rating(D, Least_common).
37 get_rating(D, Fun, 1).
39 get_rating([D], _, _) ->
41 get_rating(D, Fun, Pos) ->
42 Count_list = get_count_list(D),
43 {Ones, Zeros} = lists:nth(Pos, Count_list),
45 case Fun(Ones,Zeros) of
46 'true' -> filter_list(D, Pos, $1);
47 'false' -> filter_list(D, Pos, $0)
49 get_rating(New_list, Fun, Pos + 1).
54 % Return a Filtered list where postion Pos is V
55 filter_list(L, Pos, V) ->
56 lists:filter(fun(X) -> lists:nth(Pos, X) == V end, L).
58 %% return a list [{Ones1,Zeros1},{Ones2,Zeros2}...] when OnesX is count of 1's in column X and ZerosX is count of zeros in column X
59 get_count_list([H|_] = D) ->
60 get_count_list(D, init_acc(length(H), [])).
62 get_count_list([], Acc) ->
63 io:format("~p~n", [Acc]),
65 get_count_list([H|T], Acc) ->
66 get_count_list(T, lists:zipwith(fun(X, {Ones, Zeros}) ->
67 case X of $1 -> {Ones + 1, Zeros}; $0 -> {Ones, Zeros + 1} end
70 %% create a list of {0,0} tuples of length L, e.g. if L = 3 then return [{0,0},{0,0},{0,0}]
74 init_acc(Len - 1, Acc ++ [{0,0}]).
76 %% Convert binary list to integer, e.g. "1011" -> 11 dec
78 bl2int(lists:reverse(CL), 0, 0).
82 bl2int([H|T], Acc, Mult) ->
83 bl2int(T, Acc + ((H - $0) * math:pow(2,Mult)), Mult + 1).