aoc2024/src/day_3.erl

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.