70 lines
2.1 KiB
Erlang
70 lines
2.1 KiB
Erlang
|
|
-module(day_3).
|
||
|
|
-export([part_1/0, part_2/0]).
|
||
|
|
-export([parse/1]).
|
||
|
|
|
||
|
|
%% mul\((\d{1,3}),(\d{1,3})\)
|
||
|
|
|
||
|
|
part_1() ->
|
||
|
|
Filename = filename:absname("./priv/input/3.txt"),
|
||
|
|
part_1(Filename).
|
||
|
|
|
||
|
|
part_1(Filename) ->
|
||
|
|
Input = read_input(Filename),
|
||
|
|
Pairs = parse(Input),
|
||
|
|
io:format("~p~n", [Pairs]),
|
||
|
|
Products = lists:map(fun({A, B}) -> A * B end, Pairs),
|
||
|
|
lists:sum(Products).
|
||
|
|
|
||
|
|
part_2() ->
|
||
|
|
Filename = filename:absname("./priv/input/3.txt"),
|
||
|
|
part_2(Filename).
|
||
|
|
|
||
|
|
part_2(Filename) ->
|
||
|
|
Input = read_input(Filename),
|
||
|
|
0.
|
||
|
|
|
||
|
|
%% Private Functions
|
||
|
|
|
||
|
|
read_input(Filename) ->
|
||
|
|
{ok, Binary} = file:read_file(Filename),
|
||
|
|
Binary.
|
||
|
|
|
||
|
|
parse(Binary) ->
|
||
|
|
parse(Binary, []).
|
||
|
|
|
||
|
|
parse(<<"mul(",A:1/binary,",",B:1/binary,")",Rest/binary>>, Pairs) -> parse(Rest, [make_pair(A, B) | Pairs]);
|
||
|
|
parse(<<"mul(",A:1/binary,",",B:2/binary,")",Rest/binary>>, Pairs) -> parse(Rest, [make_pair(A, B) | Pairs]);
|
||
|
|
parse(<<"mul(",A:1/binary,",",B:3/binary,")",Rest/binary>>, Pairs) -> parse(Rest, [make_pair(A, B) | Pairs]);
|
||
|
|
parse(<<"mul(",A:2/binary,",",B:1/binary,")",Rest/binary>>, Pairs) -> parse(Rest, [make_pair(A, B) | Pairs]);
|
||
|
|
parse(<<"mul(",A:2/binary,",",B:2/binary,")",Rest/binary>>, Pairs) -> parse(Rest, [make_pair(A, B) | Pairs]);
|
||
|
|
parse(<<"mul(",A:2/binary,",",B:3/binary,")",Rest/binary>>, Pairs) -> parse(Rest, [make_pair(A, B) | Pairs]);
|
||
|
|
parse(<<"mul(",A:3/binary,",",B:1/binary,")",Rest/binary>>, Pairs) -> parse(Rest, [make_pair(A, B) | Pairs]);
|
||
|
|
parse(<<"mul(",A:3/binary,",",B:2/binary,")",Rest/binary>>, Pairs) -> parse(Rest, [make_pair(A, B) | Pairs]);
|
||
|
|
parse(<<"mul(",A:3/binary,",",B:3/binary,")",Rest/binary>>, Pairs) -> parse(Rest, [make_pair(A, B) | Pairs]);
|
||
|
|
parse(<<_:8,Rest/binary>>, Pairs) ->
|
||
|
|
parse(Rest, Pairs);
|
||
|
|
parse(<<_Whatever:8>>, Pairs) ->
|
||
|
|
Pairs;
|
||
|
|
parse(<<"">>, Pairs) ->
|
||
|
|
Pairs.
|
||
|
|
|
||
|
|
make_pair(A, B) -> {binary_to_integer(A), binary_to_integer(B)}.
|
||
|
|
|
||
|
|
|
||
|
|
%% TESTS
|
||
|
|
|
||
|
|
-ifdef(TEST).
|
||
|
|
-include_lib("eunit/include/eunit.hrl").
|
||
|
|
|
||
|
|
part_1_test() ->
|
||
|
|
TestFile = test_data(),
|
||
|
|
?assertEqual(161, part_1(TestFile)).
|
||
|
|
|
||
|
|
%% part_2_test() ->
|
||
|
|
%% TestFile = test_data(),
|
||
|
|
%% ?assertEqual(4, part_2(TestFile)).
|
||
|
|
|
||
|
|
test_data() ->
|
||
|
|
filename:absname("./priv/test_input/3.txt").
|
||
|
|
-endif.
|