From 28e733e405fcd57fa123ad2f62814da1f5f3700f Mon Sep 17 00:00:00 2001 From: Martin Frost Date: Thu, 19 Dec 2024 10:44:27 +0100 Subject: [PATCH] Solve day 3 --- priv/test_input/3_2.txt | 1 + src/day_3.erl | 34 +++++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 priv/test_input/3_2.txt diff --git a/priv/test_input/3_2.txt b/priv/test_input/3_2.txt new file mode 100644 index 0000000..30032cb --- /dev/null +++ b/priv/test_input/3_2.txt @@ -0,0 +1 @@ +xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5)) diff --git a/src/day_3.erl b/src/day_3.erl index cdad017..66e9739 100644 --- a/src/day_3.erl +++ b/src/day_3.erl @@ -20,7 +20,9 @@ part_2() -> part_2(Filename) -> Input = read_input(Filename), - 0. + Pairs = parse_2(Input), + Products = lists:map(fun({A, B}) -> A * B end, Pairs), + lists:sum(Products). %% Private Functions @@ -49,6 +51,26 @@ parse(<<"">>, Pairs) -> make_pair(A, B) -> {binary_to_integer(A), binary_to_integer(B)}. +parse_2(Binary) -> + parse_2(enabled, Binary, []). + +parse_2(enabled, <<"mul(",A:1/binary,",",B:1/binary,")",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, [make_pair(A, B) | Pairs]); +parse_2(enabled, <<"mul(",A:1/binary,",",B:2/binary,")",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, [make_pair(A, B) | Pairs]); +parse_2(enabled, <<"mul(",A:1/binary,",",B:3/binary,")",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, [make_pair(A, B) | Pairs]); +parse_2(enabled, <<"mul(",A:2/binary,",",B:1/binary,")",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, [make_pair(A, B) | Pairs]); +parse_2(enabled, <<"mul(",A:2/binary,",",B:2/binary,")",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, [make_pair(A, B) | Pairs]); +parse_2(enabled, <<"mul(",A:2/binary,",",B:3/binary,")",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, [make_pair(A, B) | Pairs]); +parse_2(enabled, <<"mul(",A:3/binary,",",B:1/binary,")",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, [make_pair(A, B) | Pairs]); +parse_2(enabled, <<"mul(",A:3/binary,",",B:2/binary,")",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, [make_pair(A, B) | Pairs]); +parse_2(enabled, <<"mul(",A:3/binary,",",B:3/binary,")",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, [make_pair(A, B) | Pairs]); +parse_2(enabled, <<"don't()",Rest/binary>>, Pairs) -> parse_2(disabled, Rest, Pairs); +parse_2(disabled, <<"do()",Rest/binary>>, Pairs) -> parse_2(enabled, Rest, Pairs); +parse_2(State, <<_:8,Rest/binary>>, Pairs) -> + parse_2(State, Rest, Pairs); +parse_2(_State, <<_Whatever:8>>, Pairs) -> + Pairs; +parse_2(_State, <<"">>, Pairs) -> + Pairs. %% TESTS @@ -56,13 +78,11 @@ make_pair(A, B) -> {binary_to_integer(A), binary_to_integer(B)}. -include_lib("eunit/include/eunit.hrl"). part_1_test() -> - TestFile = test_data(), + TestFile = filename:absname("./priv/test_input/3.txt"), ?assertEqual(161, part_1(TestFile)). -%% part_2_test() -> -%% TestFile = test_data(), -%% ?assertEqual(4, part_2(TestFile)). +part_2_test() -> + TestFile = filename:absname("./priv/test_input/3_2.txt"), + ?assertEqual(48, part_2(TestFile)). -test_data() -> - filename:absname("./priv/test_input/3.txt"). -endif.