-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.