Skip to content

Instantly share code, notes, and snippets.

@joeytrapp
Last active December 9, 2024 06:58
Show Gist options
  • Save joeytrapp/85752a1024d1f0f5132fbce9f0242995 to your computer and use it in GitHub Desktop.
Save joeytrapp/85752a1024d1f0f5132fbce9f0242995 to your computer and use it in GitHub Desktop.
Advent of Code 2024 Day 3 Part 1 and Part 2
-module(aoc).
-export([main/1]).
main([Path]) ->
{ok, Data1} = file:read_file(Path, [read, binary]),
io:format("Without modes: ~p~n", [read_char(Data1, skip, 0)]),
{ok, Data2} = file:read_file(Path, [read, binary]),
io:format("With modes: ~p~n", [read_char(Data2, do, 0)]),
erlang:halt(0).
read_char(<<>>, _, Acc) ->
Acc;
read_char(<<"m", _/binary>> = Data, Mode, Acc) ->
parse(Data, nil, Mode, Acc);
read_char(<<_:1/binary, T/binary>>, skip, Acc) ->
read_char(T, skip, Acc);
read_char(<<"don't()", _/binary>> = <<_:1/binary, T/binary>>, _, Acc) ->
read_char(T, dont, Acc);
read_char(<<"do()", _/binary>> = <<_:1/binary, T/binary>>, _, Acc) ->
read_char(T, do, Acc);
read_char(<<_:1/binary, T/binary>>, Mode, Acc) ->
read_char(T, Mode, Acc).
parse(<<>>, _, _, Acc) ->
Acc;
parse(<<_:1/binary, T/binary>>, _, dont, Acc) ->
read_char(T, dont, Acc);
parse(<<"mul", T/binary>>, nil, Mode, Acc) ->
parse(T, mul, Mode, Acc);
parse(<<"(", T/binary>>, mul, Mode, Acc) ->
parse(T, mul_open, Mode, Acc);
parse(<<D:1/binary, _/binary>> = Data, mul_open, Mode, Acc)
when D >= <<"0">>, D =< <<"9">> ->
{N, T} = take_int(Data, <<>>),
parse(T, {N}, Mode, Acc);
parse(<<",", T/binary>>, {A}, Mode, Acc) ->
parse(T, {A, nil}, Mode, Acc);
parse(<<D:1/binary, _/binary>> = Data, {A, nil}, Mode, Acc)
when D >= <<"0">>, D =< <<"9">> ->
{N, T} = take_int(Data, <<>>),
parse(T, {A, N}, Mode, Acc);
parse(<<")", T/binary>>, {A, B}, Mode, Acc) ->
read_char(T, Mode, A * B + Acc);
parse(<<_:1/binary, T/binary>>, _, Mode, Acc) ->
read_char(T, Mode, Acc).
take_int(<<D:1/binary, T/binary>>, Acc) when D >= <<"0">>, D =< <<"9">> ->
take_int(T, <<Acc/binary, D/binary>>);
take_int(T, Acc) ->
{binary_to_integer(Acc), T}.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment