From: CptG9000 <71446401+CptG9000@users.noreply.github.com> Date: Sat, 4 Dec 2021 19:38:28 +0000 (+0000) Subject: Merge branch 'master' of https://fbox.kageds.com/gitweb/advent2021 X-Git-Url: https://fbox.kageds.com/gitweb/adventofcode.git/commitdiff_plain/1517295a267908fd7e7141b59b99cc3a85a09f57?hp=12d66321a19c524e1aa8e4af385032647c601fe3 Merge branch 'master' of https://fbox.kageds.com/gitweb/advent2021 --- diff --git a/day2/day2.erl b/day2/day2.erl index 1d6662d..7fd7f06 100644 --- a/day2/day2.erl +++ b/day2/day2.erl @@ -1,9 +1,52 @@ -module(day2). --export ([solve/1, solve/2]). +-export ([solve/0, solve/1, solve/2]). + +solve() -> + solve(['1']), + solve(['2']), + init:stop(). solve(A) -> - D = [ + solve(A, get_data()). + +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). + +solution1(D) -> + {X, Y} = + lists:foldl(fun({Dir, Dis}, {X, Y}) -> + case Dir of + 'up' -> {X, Y - Dis}; + 'down' -> {X, Y + Dis}; + 'forward' -> {X + Dis, Y} + end + end, + {0, 0}, + D), + X * Y. + +solution2(D) -> + {X, Y, _} = + lists:foldl(fun({Dir, Dis}, {X, Y, Aim}) -> + case Dir of + 'up' -> {X, Y, Aim - Dis}; + 'down' -> {X, Y, Aim + Dis}; + 'forward' -> {X + Dis, Y + (Dis * Aim), Aim} + end + end, + {0,0,0}, + D), + X * Y. + +get_data() -> +[ {forward, 3}, {down, 4}, {forward, 3}, @@ -1004,36 +1047,4 @@ solve(A) -> {forward, 5}, {forward, 3}, {forward, 7} -], - - solve(A, D). - -solve(['1'], D) -> - io:format("The solution to puzzle day2 is: ~p", [solve(1, D)]); -solve(1, D) -> - {X, Y} = - lists:foldl(fun({Dir, Dis}, {X, Y}) -> - case Dir of - 'up' -> {X, Y - Dis}; - 'down' -> {X, Y + Dis}; - 'forward' -> {X + Dis, Y} - end - end, - {0, 0}, - D), - X * Y; -solve(['2'], D) -> - io:format("The solution to puzzle day2 is: ~p", [solve(2, D)]); -solve(2, D) -> - {X, Y, _} = - lists:foldl(fun({Dir, Dis}, {X, Y, Aim}) -> - case Dir of - 'up' -> {X, Y, Aim - Dis}; - 'down' -> {X, Y, Aim + Dis}; - 'forward' -> {X + Dis, Y + (Dis * Aim), Aim} - end - end, - {0,0,0}, - D), - X * Y. - +]. diff --git a/day3/day3 b/day3/day3 new file mode 100755 index 0000000..393c991 Binary files /dev/null and b/day3/day3 differ diff --git a/day3/day3.erl b/day3/day3.erl new file mode 100644 index 0000000..0f506c3 --- /dev/null +++ b/day3/day3.erl @@ -0,0 +1,1104 @@ +%% to compile: erlc day3A.erl +%% to run: erl -noshell -s day3 solve +%% +-module(day3). + +-export ([solve/0, solve/1, solve/2]). + +solve() -> + solve(['1']), + solve(['2']), + init:stop(). + +solve(A) -> + solve(A, get_test_data()). + +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). + +solution1(D) -> + Count_list = get_count_list(D), + Gamma = [ case Ones > Zeros of 'true' -> $1; 'false' -> $0 end || {Ones, Zeros} <- Count_list], + Epsilion = [ case Ones > Zeros of 'true' -> $0; 'false' -> $1 end || {Ones, Zeros} <- Count_list], + bl2int(Gamma) * bl2int(Epsilion). + +solution2(D) -> + Most_common = fun(X,Y) -> X >= Y end, + Least_common = fun(X, Y) -> X < Y end, + get_rating(D, Most_common) * get_rating(D, Least_common). + +get_rating(D, Fun) -> + get_rating(D, Fun, 1). + +get_rating([D], _, _) -> + bl2int(D); +get_rating(D, Fun, Pos) -> + Count_list = get_count_list(D), + {Ones, Zeros} = lists:nth(Pos, Count_list), + New_list = + case Fun(Ones,Zeros) of + 'true' -> filter_list(D, Pos, $1); + 'false' -> filter_list(D, Pos, $0) + end, + get_rating(New_list, Fun, Pos + 1). + +%% +%% Internal functions +%% +% Return a Filtered list where postion Pos is V +filter_list(L, Pos, V) -> + lists:filter(fun(X) -> lists:nth(Pos, X) == V end, L). + +%% 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 +get_count_list([H|_] = D) -> + get_count_list(D, init_acc(length(H), [])). + +get_count_list([], Acc) -> + io:format("~p~n", [Acc]), + Acc; +get_count_list([H|T], Acc) -> + get_count_list(T, lists:zipwith(fun(X, {Ones, Zeros}) -> + case X of $1 -> {Ones + 1, Zeros}; $0 -> {Ones, Zeros + 1} end + end, H, Acc)). + +%% create a list of {0,0} tuples of length L, e.g. if L = 3 then return [{0,0},{0,0},{0,0}] +init_acc(0, Acc) -> + Acc; +init_acc(Len, Acc) -> + init_acc(Len - 1, Acc ++ [{0,0}]). + +%% Convert binary list to integer, e.g. "1011" -> 11 dec +bl2int(CL) -> + bl2int(lists:reverse(CL), 0, 0). + +bl2int([], Acc, _) -> + Acc; +bl2int([H|T], Acc, Mult) -> + bl2int(T, Acc + ((H - $0) * math:pow(2,Mult)), Mult + 1). + +get_test_data() -> +[ +"00100", +"11110", +"10110", +"10111", +"10101", +"01111", +"00111", +"11100", +"10000", +"11001", +"00010", +"01010" +]. + +get_data() -> +[ +"010100110111", +"101001010000", +"101011110010", +"100100011101", +"101000011000", +"110011011110", +"111010010100", +"001111100000", +"111101100001", +"100010101110", +"101101110101", +"010010101110", +"111001110100", +"000101111000", +"111101111100", +"000010001100", +"101010111101", +"001010011011", +"001101101101", +"000000110100", +"001100101011", +"110110110010", +"001110000011", +"011001111001", +"110100110011", +"011000110001", +"111100100010", +"101011000000", +"011101000111", +"011111000111", +"111011001110", +"011111010100", +"001110110001", +"010110110001", +"100111011011", +"100110100100", +"110010111000", +"101111001100", +"101111111001", +"000001000110", +"100010010110", +"110111100101", +"001001010101", +"001110001011", +"101111001011", +"111011110010", +"101001001100", +"101010100001", +"000000111101", +"100000000111", +"111010111101", +"000110110111", +"100100101111", +"110101100101", +"011010110010", +"110100001110", +"001011011010", +"010101010101", +"011110000100", +"010000000010", +"010111010111", +"011010011100", +"101101001011", +"000111100101", +"101111001000", +"000100010000", +"111000011111", +"100001010101", +"011101111110", +"001111011110", +"001100111111", +"000011000100", +"001011101010", +"001011010111", +"101001001110", +"010101011001", +"110101001011", +"011110011110", +"001000110010", +"011101110001", +"101110000000", +"000001100111", +"110111000011", +"001001111010", +"100100000000", +"000000011101", +"111110111011", +"101001111100", +"110110100010", +"101011011000", +"000111100010", +"011000110100", +"111100100100", +"010010100000", +"111101001011", +"111001000000", +"001001000001", +"010010100001", +"110110001100", +"001101100001", +"011110010110", +"100111011101", +"001001110110", +"001001100011", +"011001111010", +"110110010111", +"110100111010", +"111110011100", +"100000100111", +"010001101101", +"110100110101", +"101111101001", +"100110010000", +"100011001111", +"101111001010", +"001110111001", +"111101001101", +"001010111101", +"010010011010", +"100101101111", +"100000011110", +"011111010001", +"000010001101", +"010100101100", +"001010001100", +"100111011100", +"011110000000", +"100000011111", +"000010010100", +"000001001101", +"011111011111", +"100101001101", +"000100010110", +"011011111100", +"000111000011", +"010100101011", +"011000101111", +"001001100111", +"110111110100", +"111101111011", +"110011010101", +"100111111111", +"010100010000", +"001111110101", +"010011010001", +"101000111111", +"000001110100", +"010010010000", +"100010000101", +"110111100111", +"001011111101", +"101100101101", +"001010110100", +"000100110001", +"111101110110", +"111110101110", +"100011100110", +"011001001010", +"001000010111", +"010001110110", +"011110000010", +"101010101111", +"110100100100", +"010001100101", +"001011111110", +"100111100000", +"111101000010", +"101101011110", +"101100111100", +"001110011100", +"110110100101", +"000110111010", +"011001010111", +"010001000011", +"100010010111", +"000110110000", +"001000010101", +"010011010010", +"110000100010", +"010000101110", +"010110111000", +"011101001000", +"011110000111", +"100110100011", +"110011001001", +"001110000111", +"000001101110", +"001000100110", +"011101111000", +"101100000101", +"110001100000", +"101000100101", +"110101110101", +"111000101111", +"101000101001", +"101000100000", +"101011010110", +"000010111100", +"011101101000", +"000110101001", +"000110110110", +"100111001011", +"100010001101", +"101111000111", +"100100111000", +"100100111100", +"000000100010", +"100110000111", +"101110001100", +"110010010010", +"100110010011", +"100100000011", +"000001011111", +"110100100000", +"000000111100", +"110110010001", +"001101111110", +"010011010011", +"001000111110", +"100010010100", +"000111110101", +"111111101001", +"100110001110", +"101011011101", +"110100100010", +"010100001000", +"100111101001", +"010111010001", +"001110101000", +"100111101111", +"100010101011", +"101111100111", +"111001100110", +"111100110101", +"001101001111", +"111011011111", +"011011100110", +"101111011000", +"100110110001", +"100010011101", +"000111010101", +"101101011100", +"111010100100", +"001101000100", +"101111100101", +"010110001010", +"111101010000", +"100111110100", +"100000000011", +"010001111110", +"011010001110", +"110100010100", +"010100111100", +"011001101100", +"110101001001", +"000011100111", +"011000000000", +"110001000011", +"101011001101", +"001010110000", +"010000011010", +"101110101010", +"001010011111", +"011101000101", +"110011101010", +"101110001110", +"100111110000", +"100100010100", +"010011101000", +"100110000110", +"111100010011", +"011101101011", +"100110010100", +"011011100001", +"011111100110", +"111100101111", +"000111101001", +"100101011101", +"010101001110", +"110011110011", +"111011011100", +"101001101111", +"100001010111", +"110010111001", +"011011101011", +"111110001010", +"000010111110", +"011010000101", +"011011000111", +"110000000101", +"010110111011", +"010110110000", +"011000110110", +"100101001000", +"000111110001", +"011110000101", +"001000010000", +"011011000011", +"100101100011", +"010000100000", +"100010011000", +"001011100001", +"000110100010", +"011000111010", +"100011001011", +"101111111010", +"001100110101", +"101100111111", +"010011100111", +"001110110010", +"000100100110", +"010100010001", +"100100011011", +"110110100100", +"100011011001", +"110001000110", +"110110100000", +"101110001010", +"000100101010", +"000000100110", +"110110111110", +"011000111101", +"001101111000", +"110001100001", +"101011011100", +"101100001000", +"100000111011", +"011110010100", +"010000101111", +"100011100101", +"100111010100", +"000011010110", +"111010110011", +"010101000001", +"001101010100", +"010001010011", +"100011000101", +"011100011111", +"100101100010", +"011111011100", +"011010010000", +"011011011110", +"101000000100", +"110111111100", +"100111110011", +"110100010010", +"100100011111", +"000100001101", +"001101100010", +"000001010110", +"110110010010", +"001110000110", +"101100110101", +"111000110011", +"111110111111", +"001000111000", +"010101111010", +"010011101010", +"010010100100", +"000101001011", +"010011011010", +"100110111011", +"100011110111", +"111001001011", +"011000000111", +"000101101101", +"001000011100", +"110111111010", +"011010101001", +"110000010101", +"011001110010", +"001001001011", +"111010110110", +"101010000110", +"110111010011", +"101110011010", +"011111110101", +"010100110011", +"010000100111", +"010100001011", +"011111010110", +"110011111110", +"100100111101", +"000100111001", +"011011101111", +"111010001101", +"100000110101", +"110000000010", +"111110101011", +"011000010110", +"001011101100", +"010001110011", +"111010111010", +"100010011110", +"001100000011", +"000101110000", +"111011101111", +"111000000111", +"100101011100", +"010111000010", +"010010111010", +"001111111100", +"101001000000", +"000010111111", +"001110011000", +"111110011110", +"101101000110", +"101110100110", +"100011011100", +"101100000001", +"111001111011", +"101010101000", +"010111101110", +"000010100101", +"100010111000", +"101111000100", +"000010011101", +"011000111011", +"010110011011", +"010101100010", +"100101010111", +"011010101110", +"110011011011", +"110100101011", +"110110111100", +"000101110011", +"011001110101", +"111000100100", +"101010000001", +"110111100011", +"100001000110", +"001101011111", +"101010000101", +"011111111000", +"000111011110", +"100001111101", +"011010010010", +"101010011100", +"101110101100", +"000001010100", +"101010100110", +"001100101010", +"101110100100", +"100100111001", +"110010100111", +"000100001110", +"111001110101", +"110000101110", +"000010011000", +"010001110010", +"000100010011", +"011110100001", +"001010111010", +"010010111001", +"010001001011", +"101101001110", +"011001000110", +"110110011001", +"110111000000", +"011010111001", +"001000010001", +"010110011100", +"000111110010", +"101110000010", +"000101001100", +"110010111101", +"001101010000", +"010010011001", +"010000010111", +"011110011100", +"111000100011", +"110101011000", +"101100100010", +"111111100110", +"010011111110", +"111110000100", +"100010100100", +"101110111100", +"110000010010", +"011010000110", +"000101100101", +"001011001000", +"111000110001", +"000010001011", +"111000010000", +"100000101000", +"001101011101", +"101000101100", +"010100111010", +"101100000110", +"001111010011", +"011111110011", +"101000100010", +"111000001111", +"111000111010", +"001110000101", +"110001010011", +"011101011010", +"101001000101", +"111111001110", +"111110110101", +"110001110100", +"101101010101", +"000100011111", +"101100100110", +"000111011000", +"101010110001", +"000100110110", +"101101110111", +"100011101000", +"010011110101", +"110101111001", +"110001110011", +"000100111100", +"010011010110", +"101100000100", +"011011101000", +"101110000100", +"100100010110", +"111011100100", +"011010110000", +"100111011010", +"110100011010", +"101111111111", +"110110011100", +"110011100101", +"100001111100", +"111101100110", +"110010001010", +"010001001101", +"101110100001", +"111101001100", +"110101000100", +"011001110000", +"010110100011", +"111111000001", +"110010100000", +"101100110000", +"110000000000", +"001101110111", +"001100001000", +"001101101000", +"101100100011", +"001001011011", +"011011101110", +"010011111000", +"110100111000", +"011001101010", +"111011111010", +"100011111010", +"001011011110", +"111101100101", +"100011100100", +"101110101000", +"000111110110", +"100111010001", +"110000011100", +"111111111110", +"110100010101", +"101001110011", +"000010001110", +"000010001001", +"110000110000", +"001001000110", +"110111110000", +"010101010010", +"111101110001", +"110101101101", +"010111000111", +"111010110111", +"001011011011", +"001001100001", +"101000101110", +"101100110010", +"100100100100", +"011110111001", +"011100000110", +"100110110111", +"111010001110", +"110111111011", +"011010111000", +"011101100001", +"011110001111", +"110101011011", +"000000001111", +"101000001110", +"111010101110", +"001100001110", +"010111000101", +"111100111110", +"001110101110", +"011101111010", +"011100001111", +"000000000101", +"111111000100", +"000110010101", +"001101000010", +"111001111100", +"101100010100", +"001011001001", +"010110000010", +"010001101000", +"001111101111", +"011011011011", +"111110000001", +"100111011000", +"011000000110", +"100111101110", +"101100000000", +"101011000100", +"111000011101", +"100001101001", +"100001101000", +"011110001001", +"110110011011", +"011100010111", +"000100111000", +"000110000001", +"000111001100", +"000111111010", +"110110000001", +"000010011010", +"100000101001", +"101110001011", +"100010110101", +"110011010000", +"111101111111", +"100101011110", +"101110011111", +"111111011111", +"011010010110", +"010100101010", +"001010100001", +"000000110110", +"110000111101", +"010101101011", +"110100100001", +"011110001110", +"111001010011", +"001000001000", +"000011111110", +"111000100110", +"100100101000", +"011011000110", +"111001100011", +"111100101000", +"110001100010", +"011000000001", +"111101010010", +"001011000100", +"010100110110", +"000001111101", +"001010000011", +"010010100110", +"100000011101", +"101011010011", +"000111110000", +"101001001011", +"100000001000", +"010000111100", +"000100101011", +"011101010000", +"101101010010", +"100010011001", +"001101100101", +"101010010100", +"111011111001", +"101000010001", +"001111000000", +"011001000010", +"100101010110", +"000100001100", +"010000101000", +"110001111111", +"000101010111", +"110100101110", +"111100110001", +"101011000001", +"101100101110", +"110000101100", +"101100111110", +"111000010110", +"010110101110", +"001010100110", +"110011010010", +"111001100000", +"100100100001", +"000011011001", +"111011011110", +"011110000011", +"101000100001", +"101010010001", +"101001100001", +"100011001010", +"100000000110", +"010000100001", +"001011011001", +"110111010100", +"111001000111", +"111111110010", +"101010100101", +"100110001011", +"010110011001", +"110001111110", +"100100000111", +"110001110111", +"101110010101", +"010010111000", +"000000011001", +"101110000011", +"100001010000", +"001100001011", +"111111001100", +"111010010010", +"010011100001", +"100001111000", +"000010000110", +"010100011100", +"101111101010", +"100110010101", +"101001101001", +"100110101001", +"001001011100", +"001100011101", +"001100011001", +"000100100100", +"100011010100", +"000100001011", +"111101100011", +"011010001011", +"111000101101", +"101000010000", +"010110001111", +"111100010110", +"000111111101", +"100100111011", +"101011000010", +"011001100010", +"101111011100", +"101001110101", +"101111101100", +"110101001111", +"111101100000", +"101110011011", +"100101110000", +"001100111110", +"010010101010", +"001100100100", +"001010101100", +"001101100111", +"110010011100", +"010000001001", +"011011110001", +"100101110001", +"101111100100", +"110101101000", +"110000100000", +"101010011101", +"111000010011", +"100001010100", +"000101101010", +"101111001001", +"000110101101", +"101011010111", +"000001001100", +"100100111110", +"000010111011", +"000100000100", +"100100001110", +"011010000001", +"010101110011", +"111101101101", +"101110101111", +"100010100011", +"110001011101", +"110001011011", +"100011110011", +"111000011011", +"110101110010", +"000110010100", +"101000001010", +"011001011010", +"111000001101", +"101001101101", +"111001000001", +"000100000110", +"110000000110", +"010011001110", +"011101000001", +"010000101101", +"010011011001", +"010101001111", +"011110110001", +"100111110001", +"101111011101", +"111001000010", +"111111111000", +"001011101011", +"001010100111", +"111110111101", +"011111011101", +"000100111101", +"010010000101", +"001111101011", +"110010100100", +"110001011001", +"010111111000", +"100100101110", +"110111011101", +"100100000110", +"111111011011", +"101101111001", +"111011010001", +"000000011100", +"011011101001", +"100010111101", +"110111000110", +"001100110010", +"111100111100", +"111111000010", +"100111010111", +"100011001100", +"110101011100", +"001111001100", +"101010000010", +"110011010111", +"110011010001", +"001110110110", +"000011011100", +"001011001011", +"100000000001", +"110000100011", +"011011110011", +"100101100100", +"011100100011", +"100001110111", +"011101001001", +"011101100011", +"011001001101", +"011001000100", +"010111001111", +"100001001111", +"101001100000", +"110010001011", +"010101011100", +"011110110010", +"111010000110", +"000010100100", +"110111000111", +"001011010110", +"010001000100", +"110100010111", +"010101100110", +"010011101111", +"101000001000", +"011011001011", +"100001000001", +"101111110011", +"100110110011", +"100011100000", +"101101000010", +"000101011000", +"111101110010", +"110111010110", +"101110000110", +"110010110001", +"000001101111", +"110101101111", +"000010111010", +"100010010001", +"111010011001", +"011110011011", +"000110101010", +"010100001111", +"010111011000", +"000011110100", +"010001010101", +"110111011001", +"010001111001", +"111010111111", +"010010010001", +"010001100011", +"111110001001", +"101000010111", +"001101110101", +"111011000000", +"001100110100", +"000110001001", +"110111101001", +"010100110000", +"101110111110", +"100000000010", +"110011010011", +"010101100101", +"110100110001", +"100010100010", +"101111111000", +"111111100100", +"011100001101", +"000000100001", +"100110100110", +"010100100011", +"000000001000", +"101010110100", +"100010001111", +"111000001011", +"010101000111", +"001111110001", +"000000111011", +"111111101100", +"001110110000", +"011110111011", +"001110100011", +"100110000010", +"010110110011", +"001001101110", +"110011101110", +"111001100010", +"111100010000", +"000001010111", +"001110001100", +"110000101000", +"100101111010", +"001011001110", +"100111101100", +"111001101100", +"110111110010", +"101000110100", +"100011100011", +"100000100101", +"100001111011", +"011110101001", +"000111000100", +"010111100001", +"111111010001", +"100100001100", +"111111010111", +"001101111101", +"000110001101", +"010110000001", +"111011010110", +"011110110110", +"011111001001", +"001101011010", +"010101110101", +"110001100100", +"101101011101", +"011011010110", +"001011001101", +"101110110101", +"001101010010", +"101010001101", +"100111000000", +"110110101100", +"001011111000", +"000100111011", +"000111110111", +"101000111100", +"110000110011", +"000001000011", +"000111111110", +"001010010010", +"100000111001", +"010101111100", +"001100010100", +"010101110111", +"110101010010", +"000001001111", +"101101111100", +"011110111101", +"111001010001", +"000100101101", +"011100100100", +"110101000111", +"011111100011", +"110001001101", +"100001100111", +"101101100111", +"000100110000", +"101001100010", +"001101101111", +"100011000100", +"011100101111", +"011001100100", +"011010011110", +"010011001010", +"011110101000", +"111101111010", +"110001010100", +"000110010001", +"001111011011", +"110000111011", +"000001111001", +"010011001100", +"100110101011", +"111011001011", +"001100110011", +"010010011101", +"100011110000", +"110011110111" +]. + diff --git a/day3/day3.hs b/day3/day3.hs new file mode 100644 index 0000000..0ff169b --- /dev/null +++ b/day3/day3.hs @@ -0,0 +1,25 @@ +main = do + putStrLn "The solution to puzzle 1 is:" + print (solve 1 ) + +solve 1 = solution1 input_test_data (take 5 (repeat (0,0))) + +solution1 :: (Num a, Num b) => [[Char]] -> [(a, b)] -> [Char] +solution1 [] acc = + [gamma x y | (x,y) <- acc] +solution1 (x:xs) acc = do + solution1 xs (zipWith zip_f x acc) + +zip_f :: (Num a1, Num a2) => Char -> (a1, a2) -> (a1, a2) +zip_f x (y,z) + |x == '1' = (y+1,z) + |x == '0' = (y,z+1) + +gamma :: (Num a1, Num a2) => a1 -> a2 -> Char +gamma x y + | x > y = '1' + | otherwise = '0' + +input_test_data = [ "00100", "11110", "10110", "10111", "10101", "01111", "00111", "11100", "10000", "11001", "00010", "01010" ] + +input_data = [ "010100110111", "101001010000", "101011110010", "100100011101", "101000011000", "110011011110", "111010010100", "001111100000", "111101100001", "100010101110", "101101110101", "010010101110", "111001110100", "000101111000", "111101111100", "000010001100", "101010111101", "001010011011", "001101101101", "000000110100", "001100101011", "110110110010", "001110000011", "011001111001", "110100110011", "011000110001", "111100100010", "101011000000", "011101000111", "011111000111", "111011001110", "011111010100", "001110110001", "010110110001", "100111011011", "100110100100", "110010111000", "101111001100", "101111111001", "000001000110", "100010010110", "110111100101", "001001010101", "001110001011", "101111001011", "111011110010", "101001001100", "101010100001", "000000111101", "100000000111", "111010111101", "000110110111", "100100101111", "110101100101", "011010110010", "110100001110", "001011011010", "010101010101", "011110000100", "010000000010", "010111010111", "011010011100", "101101001011", "000111100101", "101111001000", "000100010000", "111000011111", "100001010101", "011101111110", "001111011110", "001100111111", "000011000100", "001011101010", "001011010111", "101001001110", "010101011001", "110101001011", "011110011110", "001000110010", "011101110001", "101110000000", "000001100111", "110111000011", "001001111010", "100100000000", "000000011101", "111110111011", "101001111100", "110110100010", "101011011000", "000111100010", "011000110100", "111100100100", "010010100000", "111101001011", "111001000000", "001001000001", "010010100001", "110110001100", "001101100001", "011110010110", "100111011101", "001001110110", "001001100011", "011001111010", "110110010111", "110100111010", "111110011100", "100000100111", "010001101101", "110100110101", "101111101001", "100110010000", "100011001111", "101111001010", "001110111001", "111101001101", "001010111101", "010010011010", "100101101111", "100000011110", "011111010001", "000010001101", "010100101100", "001010001100", "100111011100", "011110000000", "100000011111", "000010010100", "000001001101", "011111011111", "100101001101", "000100010110", "011011111100", "000111000011", "010100101011", "011000101111", "001001100111", "110111110100", "111101111011", "110011010101", "100111111111", "010100010000", "001111110101", "010011010001", "101000111111", "000001110100", "010010010000", "100010000101", "110111100111", "001011111101", "101100101101", "001010110100", "000100110001", "111101110110", "111110101110", "100011100110", "011001001010", "001000010111", "010001110110", "011110000010", "101010101111", "110100100100", "010001100101", "001011111110", "100111100000", "111101000010", "101101011110", "101100111100", "001110011100", "110110100101", "000110111010", "011001010111", "010001000011", "100010010111", "000110110000", "001000010101", "010011010010", "110000100010", "010000101110", "010110111000", "011101001000", "011110000111", "100110100011", "110011001001", "001110000111", "000001101110", "001000100110", "011101111000", "101100000101", "110001100000", "101000100101", "110101110101", "111000101111", "101000101001", "101000100000", "101011010110", "000010111100", "011101101000", "000110101001", "000110110110", "100111001011", "100010001101", "101111000111", "100100111000", "100100111100", "000000100010", "100110000111", "101110001100", "110010010010", "100110010011", "100100000011", "000001011111", "110100100000", "000000111100", "110110010001", "001101111110", "010011010011", "001000111110", "100010010100", "000111110101", "111111101001", "100110001110", "101011011101", "110100100010", "010100001000", "100111101001", "010111010001", "001110101000", "100111101111", "100010101011", "101111100111", "111001100110", "111100110101", "001101001111", "111011011111", "011011100110", "101111011000", "100110110001", "100010011101", "000111010101", "101101011100", "111010100100", "001101000100", "101111100101", "010110001010", "111101010000", "100111110100", "100000000011", "010001111110", "011010001110", "110100010100", "010100111100", "011001101100", "110101001001", "000011100111", "011000000000", "110001000011", "101011001101", "001010110000", "010000011010", "101110101010", "001010011111", "011101000101", "110011101010", "101110001110", "100111110000", "100100010100", "010011101000", "100110000110", "111100010011", "011101101011", "100110010100", "011011100001", "011111100110", "111100101111", "000111101001", "100101011101", "010101001110", "110011110011", "111011011100", "101001101111", "100001010111", "110010111001", "011011101011", "111110001010", "000010111110", "011010000101", "011011000111", "110000000101", "010110111011", "010110110000", "011000110110", "100101001000", "000111110001", "011110000101", "001000010000", "011011000011", "100101100011", "010000100000", "100010011000", "001011100001", "000110100010", "011000111010", "100011001011", "101111111010", "001100110101", "101100111111", "010011100111", "001110110010", "000100100110", "010100010001", "100100011011", "110110100100", "100011011001", "110001000110", "110110100000", "101110001010", "000100101010", "000000100110", "110110111110", "011000111101", "001101111000", "110001100001", "101011011100", "101100001000", "100000111011", "011110010100", "010000101111", "100011100101", "100111010100", "000011010110", "111010110011", "010101000001", "001101010100", "010001010011", "100011000101", "011100011111", "100101100010", "011111011100", "011010010000", "011011011110", "101000000100", "110111111100", "100111110011", "110100010010", "100100011111", "000100001101", "001101100010", "000001010110", "110110010010", "001110000110", "101100110101", "111000110011", "111110111111", "001000111000", "010101111010", "010011101010", "010010100100", "000101001011", "010011011010", "100110111011", "100011110111", "111001001011", "011000000111", "000101101101", "001000011100", "110111111010", "011010101001", "110000010101", "011001110010", "001001001011", "111010110110", "101010000110", "110111010011", "101110011010", "011111110101", "010100110011", "010000100111", "010100001011", "011111010110", "110011111110", "100100111101", "000100111001", "011011101111", "111010001101", "100000110101", "110000000010", "111110101011", "011000010110", "001011101100", "010001110011", "111010111010", "100010011110", "001100000011", "000101110000", "111011101111", "111000000111", "100101011100", "010111000010", "010010111010", "001111111100", "101001000000", "000010111111", "001110011000", "111110011110", "101101000110", "101110100110", "100011011100", "101100000001", "111001111011", "101010101000", "010111101110", "000010100101", "100010111000", "101111000100", "000010011101", "011000111011", "010110011011", "010101100010", "100101010111", "011010101110", "110011011011", "110100101011", "110110111100", "000101110011", "011001110101", "111000100100", "101010000001", "110111100011", "100001000110", "001101011111", "101010000101", "011111111000", "000111011110", "100001111101", "011010010010", "101010011100", "101110101100", "000001010100", "101010100110", "001100101010", "101110100100", "100100111001", "110010100111", "000100001110", "111001110101", "110000101110", "000010011000", "010001110010", "000100010011", "011110100001", "001010111010", "010010111001", "010001001011", "101101001110", "011001000110", "110110011001", "110111000000", "011010111001", "001000010001", "010110011100", "000111110010", "101110000010", "000101001100", "110010111101", "001101010000", "010010011001", "010000010111", "011110011100", "111000100011", "110101011000", "101100100010", "111111100110", "010011111110", "111110000100", "100010100100", "101110111100", "110000010010", "011010000110", "000101100101", "001011001000", "111000110001", "000010001011", "111000010000", "100000101000", "001101011101", "101000101100", "010100111010", "101100000110", "001111010011", "011111110011", "101000100010", "111000001111", "111000111010", "001110000101", "110001010011", "011101011010", "101001000101", "111111001110", "111110110101", "110001110100", "101101010101", "000100011111", "101100100110", "000111011000", "101010110001", "000100110110", "101101110111", "100011101000", "010011110101", "110101111001", "110001110011", "000100111100", "010011010110", "101100000100", "011011101000", "101110000100", "100100010110", "111011100100", "011010110000", "100111011010", "110100011010", "101111111111", "110110011100", "110011100101", "100001111100", "111101100110", "110010001010", "010001001101", "101110100001", "111101001100", "110101000100", "011001110000", "010110100011", "111111000001", "110010100000", "101100110000", "110000000000", "001101110111", "001100001000", "001101101000", "101100100011", "001001011011", "011011101110", "010011111000", "110100111000", "011001101010", "111011111010", "100011111010", "001011011110", "111101100101", "100011100100", "101110101000", "000111110110", "100111010001", "110000011100", "111111111110", "110100010101", "101001110011", "000010001110", "000010001001", "110000110000", "001001000110", "110111110000", "010101010010", "111101110001", "110101101101", "010111000111", "111010110111", "001011011011", "001001100001", "101000101110", "101100110010", "100100100100", "011110111001", "011100000110", "100110110111", "111010001110", "110111111011", "011010111000", "011101100001", "011110001111", "110101011011", "000000001111", "101000001110", "111010101110", "001100001110", "010111000101", "111100111110", "001110101110", "011101111010", "011100001111", "000000000101", "111111000100", "000110010101", "001101000010", "111001111100", "101100010100", "001011001001", "010110000010", "010001101000", "001111101111", "011011011011", "111110000001", "100111011000", "011000000110", "100111101110", "101100000000", "101011000100", "111000011101", "100001101001", "100001101000", "011110001001", "110110011011", "011100010111", "000100111000", "000110000001", "000111001100", "000111111010", "110110000001", "000010011010", "100000101001", "101110001011", "100010110101", "110011010000", "111101111111", "100101011110", "101110011111", "111111011111", "011010010110", "010100101010", "001010100001", "000000110110", "110000111101", "010101101011", "110100100001", "011110001110", "111001010011", "001000001000", "000011111110", "111000100110", "100100101000", "011011000110", "111001100011", "111100101000", "110001100010", "011000000001", "111101010010", "001011000100", "010100110110", "000001111101", "001010000011", "010010100110", "100000011101", "101011010011", "000111110000", "101001001011", "100000001000", "010000111100", "000100101011", "011101010000", "101101010010", "100010011001", "001101100101", "101010010100", "111011111001", "101000010001", "001111000000", "011001000010", "100101010110", "000100001100", "010000101000", "110001111111", "000101010111", "110100101110", "111100110001", "101011000001", "101100101110", "110000101100", "101100111110", "111000010110", "010110101110", "001010100110", "110011010010", "111001100000", "100100100001", "000011011001", "111011011110", "011110000011", "101000100001", "101010010001", "101001100001", "100011001010", "100000000110", "010000100001", "001011011001", "110111010100", "111001000111", "111111110010", "101010100101", "100110001011", "010110011001", "110001111110", "100100000111", "110001110111", "101110010101", "010010111000", "000000011001", "101110000011", "100001010000", "001100001011", "111111001100", "111010010010", "010011100001", "100001111000", "000010000110", "010100011100", "101111101010", "100110010101", "101001101001", "100110101001", "001001011100", "001100011101", "001100011001", "000100100100", "100011010100", "000100001011", "111101100011", "011010001011", "111000101101", "101000010000", "010110001111", "111100010110", "000111111101", "100100111011", "101011000010", "011001100010", "101111011100", "101001110101", "101111101100", "110101001111", "111101100000", "101110011011", "100101110000", "001100111110", "010010101010", "001100100100", "001010101100", "001101100111", "110010011100", "010000001001", "011011110001", "100101110001", "101111100100", "110101101000", "110000100000", "101010011101", "111000010011", "100001010100", "000101101010", "101111001001", "000110101101", "101011010111", "000001001100", "100100111110", "000010111011", "000100000100", "100100001110", "011010000001", "010101110011", "111101101101", "101110101111", "100010100011", "110001011101", "110001011011", "100011110011", "111000011011", "110101110010", "000110010100", "101000001010", "011001011010", "111000001101", "101001101101", "111001000001", "000100000110", "110000000110", "010011001110", "011101000001", "010000101101", "010011011001", "010101001111", "011110110001", "100111110001", "101111011101", "111001000010", "111111111000", "001011101011", "001010100111", "111110111101", "011111011101", "000100111101", "010010000101", "001111101011", "110010100100", "110001011001", "010111111000", "100100101110", "110111011101", "100100000110", "111111011011", "101101111001", "111011010001", "000000011100", "011011101001", "100010111101", "110111000110", "001100110010", "111100111100", "111111000010", "100111010111", "100011001100", "110101011100", "001111001100", "101010000010", "110011010111", "110011010001", "001110110110", "000011011100", "001011001011", "100000000001", "110000100011", "011011110011", "100101100100", "011100100011", "100001110111", "011101001001", "011101100011", "011001001101", "011001000100", "010111001111", "100001001111", "101001100000", "110010001011", "010101011100", "011110110010", "111010000110", "000010100100", "110111000111", "001011010110", "010001000100", "110100010111", "010101100110", "010011101111", "101000001000", "011011001011", "100001000001", "101111110011", "100110110011", "100011100000", "101101000010", "000101011000", "111101110010", "110111010110", "101110000110", "110010110001", "000001101111", "110101101111", "000010111010", "100010010001", "111010011001", "011110011011", "000110101010", "010100001111", "010111011000", "000011110100", "010001010101", "110111011001", "010001111001", "111010111111", "010010010001", "010001100011", "111110001001", "101000010111", "001101110101", "111011000000", "001100110100", "000110001001", "110111101001", "010100110000", "101110111110", "100000000010", "110011010011", "010101100101", "110100110001", "100010100010", "101111111000", "111111100100", "011100001101", "000000100001", "100110100110", "010100100011", "000000001000", "101010110100", "100010001111", "111000001011", "010101000111", "001111110001", "000000111011", "111111101100", "001110110000", "011110111011", "001110100011", "100110000010", "010110110011", "001001101110", "110011101110", "111001100010", "111100010000", "000001010111", "001110001100", "110000101000", "100101111010", "001011001110", "100111101100", "111001101100", "110111110010", "101000110100", "100011100011", "100000100101", "100001111011", "011110101001", "000111000100", "010111100001", "111111010001", "100100001100", "111111010111", "001101111101", "000110001101", "010110000001", "111011010110", "011110110110", "011111001001", "001101011010", "010101110101", "110001100100", "101101011101", "011011010110", "001011001101", "101110110101", "001101010010", "101010001101", "100111000000", "110110101100", "001011111000", "000100111011", "000111110111", "101000111100", "110000110011", "000001000011", "000111111110", "001010010010", "100000111001", "010101111100", "001100010100", "010101110111", "110101010010", "000001001111", "101101111100", "011110111101", "111001010001", "000100101101", "011100100100", "110101000111", "011111100011", "110001001101", "100001100111", "101101100111", "000100110000", "101001100010", "001101101111", "100011000100", "011100101111", "011001100100", "011010011110", "010011001010", "011110101000", "111101111010", "110001010100", "000110010001", "001111011011", "110000111011", "000001111001", "010011001100", "100110101011", "111011001011", "001100110011", "010010011101", "100011110000", "110011110111" ] diff --git a/day4/boards.txt b/day4/boards.txt new file mode 100644 index 0000000..a9fba2f --- /dev/null +++ b/day4/boards.txt @@ -0,0 +1,600 @@ +68 73 98 51 49 +82 56 87 64 8 +46 7 21 38 30 +66 5 86 97 74 +60 63 76 55 39 + +92 20 87 77 52 +72 29 81 24 64 +26 16 19 79 68 + 8 53 90 14 74 +28 89 78 54 15 + +13 17 35 2 85 +37 87 57 74 65 +60 21 18 98 96 + 4 51 46 84 0 +90 75 80 41 64 + +83 98 4 78 45 +90 62 71 68 39 +47 81 96 73 43 + 9 94 65 99 60 +44 5 29 50 6 + +23 43 42 35 9 +82 90 49 70 59 +58 38 44 55 85 + 3 99 88 65 61 +71 53 17 37 4 + +58 38 47 84 89 +60 87 80 92 75 +57 83 40 62 25 +11 7 33 76 70 +82 31 53 56 90 + +96 40 50 21 38 +58 77 64 98 86 + 9 68 78 55 10 +51 74 71 28 16 +49 45 32 7 57 + +71 98 26 5 95 +21 53 48 35 92 + 4 90 9 45 82 +67 28 33 34 58 +85 41 80 64 19 + +98 36 33 34 55 +15 81 97 56 96 +91 73 32 63 83 +31 3 85 80 38 +71 93 87 86 27 + +19 15 97 31 26 +56 58 54 87 1 + 9 28 23 7 20 +38 67 52 73 88 +95 77 27 91 81 + +81 64 19 67 10 +97 73 46 31 3 +93 77 8 7 57 + 0 28 87 42 66 +17 79 58 14 18 + +43 17 63 7 49 +28 27 31 23 41 +65 34 51 70 77 +73 56 74 96 72 +94 86 48 71 40 + +97 43 56 0 30 +60 71 34 1 96 +10 72 28 82 84 +36 22 9 20 67 + 8 29 92 5 41 + +28 49 8 78 53 +41 32 3 4 88 +56 68 18 65 54 +24 5 71 21 75 +52 15 47 83 79 + +26 47 2 22 9 + 6 81 53 17 88 +58 25 55 31 19 +42 27 85 97 14 +64 52 66 63 51 + +80 43 88 42 51 +17 18 84 60 24 +34 48 89 33 10 + 7 21 83 0 26 +28 86 25 58 16 + +71 77 2 99 16 +90 59 54 27 10 +78 51 26 12 80 +25 58 53 33 83 +31 7 96 38 95 + +87 91 7 76 5 +96 1 16 62 35 +22 61 29 27 12 +57 50 78 4 65 + 3 97 73 82 94 + +93 63 43 22 71 +12 74 41 64 62 +81 2 37 99 27 +26 39 66 30 20 +77 78 18 53 5 + +72 61 21 59 41 +18 49 95 51 30 +63 75 10 47 27 +83 11 8 39 68 + 9 99 67 44 77 + +29 98 74 11 17 +44 80 1 78 6 +73 20 32 0 27 +76 37 77 41 24 +36 97 87 89 68 + +12 35 84 98 87 +33 78 64 85 3 +18 14 71 54 93 +63 34 61 57 22 +36 20 91 69 55 + +84 74 25 67 38 +59 60 56 68 81 +41 51 23 98 92 +30 35 45 17 83 +71 97 21 5 94 + +95 10 92 27 34 +15 67 76 14 98 +85 81 40 38 58 + 8 17 6 59 48 +78 73 84 11 46 + +25 50 40 69 27 +89 59 17 86 20 + 3 98 76 90 9 +41 75 21 29 55 +47 94 23 6 68 + +82 90 99 65 52 +81 18 87 42 6 +56 79 36 96 60 +70 20 39 22 14 +71 88 86 46 48 + +99 37 16 39 46 +82 27 12 19 47 +25 80 38 22 55 +76 1 7 54 28 +60 97 56 32 17 + +79 5 56 14 51 +86 57 18 89 81 +97 88 54 60 34 +50 25 62 66 98 +23 65 87 63 11 + +71 10 5 63 73 +14 70 7 36 20 +38 75 59 33 17 +18 3 72 46 76 +98 80 64 48 30 + +54 21 56 86 61 +71 45 16 5 66 + 0 12 94 70 1 +37 98 26 93 18 +87 90 24 44 91 + +18 10 72 81 48 +67 80 42 25 33 +92 34 0 27 26 +77 99 57 9 46 +82 15 54 21 52 + +73 18 80 27 50 +58 97 84 81 21 +94 68 8 57 9 +56 98 67 36 92 +86 53 35 41 89 + +86 65 2 74 5 + 3 80 19 41 48 +98 99 24 50 57 + 8 59 53 67 91 +62 83 72 9 14 + +56 69 7 38 87 +39 71 84 41 88 +23 94 1 97 33 +73 14 2 79 72 +26 91 45 9 6 + +17 40 97 51 57 +92 25 38 26 23 +32 44 83 87 49 +54 74 33 7 12 +14 36 30 8 98 + +56 26 3 73 32 +90 80 23 0 27 +59 19 33 78 52 +21 1 20 86 34 +85 48 37 97 67 + +23 13 90 35 44 +30 96 18 14 92 +80 5 97 11 58 +12 50 33 65 78 +48 26 86 15 7 + +70 32 62 92 13 +23 1 21 50 59 +79 26 11 65 76 +90 54 64 63 31 + 0 19 86 33 9 + +69 60 3 94 20 +35 72 82 42 45 +66 6 52 64 62 +19 28 83 1 98 +76 74 12 9 54 + +32 29 46 57 50 +80 10 42 24 82 +56 41 90 7 12 +89 78 53 95 9 +26 52 67 27 83 + +85 83 2 65 71 +35 66 55 87 39 +90 56 97 81 9 +73 32 98 84 95 +88 33 34 25 86 + +78 8 34 21 23 + 2 86 10 4 58 +31 62 35 91 63 +81 90 69 15 47 +41 12 61 72 36 + +10 95 68 87 25 +59 45 54 92 82 +34 81 12 61 83 +89 69 98 72 44 +84 20 51 36 1 + +59 94 26 76 54 +39 21 86 13 48 +58 61 75 80 62 + 8 88 74 24 19 +42 38 72 60 93 + +82 46 54 48 20 +53 94 57 98 83 +15 10 39 17 91 +89 47 4 35 27 +61 42 92 13 8 + +97 73 9 67 58 +87 49 96 88 94 +68 38 11 41 43 +26 51 4 22 0 +18 2 84 62 33 + +79 25 51 78 93 +76 49 69 87 26 +63 71 67 28 34 +48 38 99 66 11 +44 61 75 96 23 + +66 79 37 23 98 +43 94 49 27 36 +21 86 34 24 42 + 4 8 85 63 32 +74 82 68 92 72 + +12 77 87 53 76 +71 66 10 68 36 +74 49 27 16 34 +98 21 54 93 18 +95 61 97 65 32 + +60 91 68 11 76 +66 62 65 3 41 + 6 84 61 58 73 + 7 28 63 75 55 +35 45 98 47 81 + +85 75 46 45 58 +95 92 73 99 47 +25 97 76 15 23 +19 5 37 36 65 +96 8 24 49 61 + +53 60 16 94 59 +10 47 82 17 89 +86 91 1 40 45 +34 76 38 97 63 +25 85 57 27 93 + +77 95 20 24 93 +37 4 23 39 35 +81 2 56 18 87 +46 75 52 51 50 +88 8 83 80 27 + +20 47 27 52 2 +97 0 17 64 11 +53 9 69 88 77 +13 89 28 21 36 +71 33 31 6 68 + +45 25 6 18 7 +51 84 82 83 81 +13 65 34 93 71 +87 92 49 8 24 +76 29 53 96 58 + +15 41 65 85 29 +78 30 93 98 67 +36 58 12 1 25 + 3 10 88 9 96 + 8 53 7 14 6 + +78 37 50 99 51 +42 19 40 62 54 +89 38 64 70 56 +96 72 41 43 95 +90 91 17 28 59 + +23 5 45 80 93 +14 75 78 25 86 +21 24 73 30 34 +39 74 22 19 49 +72 31 1 77 57 + +59 8 57 68 32 +71 19 9 29 63 + 3 92 40 79 31 +87 75 99 88 2 +15 20 85 89 44 + + 7 41 16 15 46 +76 5 51 11 38 +28 70 68 91 66 +56 94 59 34 86 +72 80 42 75 65 + +92 95 48 65 89 +27 64 69 15 33 +93 47 30 7 63 +91 35 29 42 72 +90 23 11 50 54 + +97 17 66 92 91 +81 23 12 6 93 +48 25 27 16 54 +21 32 50 94 98 +15 55 40 11 84 + +66 56 95 44 33 +26 11 41 22 86 + 2 1 50 79 32 +70 74 84 5 90 +92 0 6 73 40 + +34 48 28 98 88 +66 60 46 54 91 +43 21 81 95 33 +53 87 82 79 92 +45 62 58 99 96 + + 6 16 70 86 9 +19 95 37 96 62 + 3 42 24 60 15 +55 56 92 80 26 +72 85 91 73 94 + +72 73 94 15 4 + 3 40 67 21 84 +45 33 60 82 10 +48 6 29 79 70 +27 66 13 38 47 + +31 0 56 89 61 +62 49 37 73 1 +63 68 38 83 44 +70 17 69 14 81 +72 58 52 50 79 + +46 18 61 11 14 +51 58 94 98 69 + 2 0 93 6 95 +92 17 3 37 33 +48 20 45 16 13 + +98 74 36 23 6 +65 17 78 95 96 +68 63 47 16 18 +87 30 53 51 57 +69 11 44 75 89 + +25 56 5 53 3 +58 1 91 2 47 +72 75 44 96 70 +30 63 10 93 74 +67 55 82 32 61 + +31 97 28 14 48 +87 50 95 23 83 +33 34 4 46 94 +43 84 86 13 40 +52 64 16 88 81 + +40 30 14 36 90 + 2 25 12 10 33 +18 27 78 73 60 +11 92 52 69 93 +19 22 35 17 61 + +42 45 49 8 14 +21 18 69 12 27 +25 76 63 28 64 +52 7 77 58 39 +87 89 88 38 4 + +40 57 53 48 46 +13 59 23 55 61 + 1 50 83 73 31 +18 47 29 65 27 +76 49 33 51 26 + +65 76 78 90 30 +25 83 4 23 3 +53 34 20 36 37 +18 66 12 45 59 +68 50 74 96 48 + +39 51 92 7 22 +11 47 44 26 55 +73 52 38 45 59 +72 76 17 56 97 +83 13 70 29 37 + +25 12 84 51 14 + 2 22 85 13 10 +73 93 67 72 80 +56 90 60 42 61 +36 16 50 70 97 + + 1 60 44 32 47 +71 76 69 27 54 +22 43 12 72 9 +17 90 53 19 95 +41 65 62 11 63 + +76 64 33 3 81 +28 20 95 98 79 +58 23 87 69 29 +31 72 55 49 36 +15 67 83 37 52 + +52 87 40 67 91 +19 7 80 88 29 +97 28 50 63 53 +43 89 35 69 75 +79 65 58 78 86 + +21 52 43 71 69 +26 47 81 91 20 +70 90 6 49 78 +11 72 82 83 2 +62 64 66 93 48 + +47 78 38 10 82 +12 32 71 41 46 +18 13 74 63 90 +86 96 17 97 9 +70 4 59 52 6 + +29 49 54 76 5 +42 99 92 52 26 +48 80 65 9 89 +87 68 47 24 78 +74 2 85 43 56 + +21 7 44 36 3 + 0 72 66 28 74 +99 68 83 53 30 +96 81 4 69 23 +15 20 31 41 42 + +87 78 21 6 62 +68 95 30 5 20 +81 54 42 50 70 +18 39 93 35 72 +22 97 73 74 75 + +25 24 62 5 54 +85 31 88 40 76 +48 44 15 3 4 +61 47 56 72 9 +11 49 50 78 39 + +54 30 52 70 16 +63 49 91 3 51 +71 36 46 79 67 +80 66 31 57 43 +45 9 84 17 35 + +68 41 32 23 24 +95 62 87 97 5 +16 2 48 17 1 +59 9 35 96 22 +50 70 44 89 31 + +21 35 47 36 2 +33 49 77 39 60 +70 91 97 18 66 +25 95 22 87 20 +69 27 76 52 11 + +42 40 26 61 98 +33 88 79 72 73 + 7 57 71 0 82 + 2 21 74 63 41 +58 96 50 13 4 + +80 84 96 31 38 +58 75 19 91 6 +10 54 52 66 81 +55 35 47 23 69 +95 40 21 17 79 + +58 68 27 0 81 +49 51 93 83 23 + 5 90 8 76 57 +53 33 45 75 84 +72 28 38 43 40 + +73 62 93 77 17 + 4 89 82 85 18 +33 57 58 55 49 +48 11 94 14 72 + 7 53 34 69 21 + +19 37 69 48 13 + 5 14 46 2 86 +40 87 95 79 36 +81 62 70 23 82 +51 43 91 29 9 + +70 16 3 5 38 +62 85 19 15 41 +36 42 13 31 87 +58 66 27 49 6 +82 54 91 23 10 + +67 63 60 80 66 +16 30 2 85 97 +45 52 62 21 49 +83 75 76 10 82 +47 90 72 5 9 + + 3 11 31 61 99 +42 62 15 64 40 +30 95 7 81 28 +63 50 74 77 34 +38 89 73 2 92 + +34 73 60 32 56 +49 35 44 79 83 +64 61 57 5 24 +72 58 8 66 77 +94 31 55 67 74 + +49 17 22 97 88 + 0 16 14 93 31 +28 73 6 82 90 +80 45 92 55 78 + 3 42 65 37 29 + +23 61 97 1 69 +53 98 28 52 19 +66 51 46 77 15 +34 36 47 80 14 + 7 89 62 9 49 + diff --git a/day4/day4.erl b/day4/day4.erl new file mode 100644 index 0000000..6a2b591 --- /dev/null +++ b/day4/day4.erl @@ -0,0 +1,100 @@ +%% to compile: erlc day3A.erl +%% to run: erl -noshell -s day3 solve +%% +-module(day4). + +-export ([solve/0, solve/1, solve/2]). +-export ([read_boards/0]). + +solve() -> + solve(['1']), + solve(['2']), + init:stop(). + +solve(A) -> + solve(A, read_boards()). + +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_boards() -> + {ok, IO} = file:open("boards.txt", 'read'), + Data = read_boards(IO), + file:close(IO), + Data. + +read_boards(IO) -> + read_boards(IO, []). + +read_boards('eof', Boards) -> + Boards; +read_boards(IO, Boards) -> + case read_board(IO) of + 'eof' -> Boards; + Board -> read_boards(IO, Boards ++ [Board]) + end. + +read_board(IO) -> + read_line(IO, []). + +read_line(IO, Board) -> + case file:read_line(IO) of + {ok, "\n"} -> make_board(Board); + 'eof' -> 'eof'; + {ok, Line} -> read_line(IO, [[ list_to_integer(X) || X <- string:tokens(Line, " \n")]|Board]) + end. + +make_board(B) -> + B ++ [lists:map(fun(X) -> lists:nth(Y,X) end, B) || Y <- lists:seq(1,5)]. + +solution1(Boards) -> + Input = get_input(), + Bingo = process(Boards, 1, Input), + score(Bingo). + +solution2(Boards) -> + Input = get_input(), + Bingo = process(Boards, length(Boards), Input), + score(Bingo). + +score({'bingo', Num, Board}) -> + Fun = fun(L) -> lists:foldl(fun(X, Acc) -> X + Acc end, 0, L) end, + Num * (Fun([Fun(X) || X <- Board]) / 2). + +process(Boards, _Count, []) -> Boards; +process(Boards, Count, [H|T]) -> + New_boards = process_boards(Boards, H, []), + case is_bingo(New_boards) of + {'bingo', Board} when Count == 1 -> {'bingo', H, Board}; + {'bingo', _Board} -> + New_boards2 = delete_bingo_boards(New_boards), + process(New_boards2, Count - length(New_boards) + length(New_boards2), T); + _Else -> process(New_boards, Count, T) + end. + + +process_boards([], _Num, Acc) -> + Acc; +process_boards([B|T], Num, Acc) -> + process_boards(T, Num, [[lists:delete(Num, X) || X <- B]|Acc]). + +is_bingo([]) -> 'false'; +is_bingo([Board|Rest]) -> + case is_line(Board) of + 'true' -> {'bingo', Board}; + 'false' -> is_bingo(Rest) + end. +is_line(Board) -> + lists:any(fun(X) -> X == [] end, Board). + +delete_bingo_boards(Boards) -> + [Board || Board <- Boards, not is_line(Board)]. + +get_input() -> + [83,69,34,46,30,23,19,75,22,37,89,78,32,39,11,44,95,43,26,48,84,53,94,88,18,40,62,35,27,42,15,2,91,20,4,64,99,71,54,97,52,36,28,7,74,45,70,86,98,1,61,50,68,6,77,8,57,47,51,72,65,3,49,24,79,13,17,92,41,80,63,67,82,90,55,0,10,93,38,21,59,73,33,31,9,76,5,66,16,58,85,87,12,29,25,14,96,56,60,81].