Skip to content

Instantly share code, notes, and snippets.

@joeytrapp
Last active December 9, 2024 06:51
Show Gist options
  • Save joeytrapp/33450a6da6d044ce0579076c3d794588 to your computer and use it in GitHub Desktop.
Save joeytrapp/33450a6da6d044ce0579076c3d794588 to your computer and use it in GitHub Desktop.
Advent of Code Day 8 Part 1 and Part 2
-module(aoc).
-export([main/1]).
main([Path]) ->
{ok, Content} = file:read_file(Path),
{Nodes, Max} = nodes(Content, 0, 0, {0,0}, #{}),
Anti = maps:fold(fun(_, L, S) ->
antinodes(L, L, Max, S)
end, sets:new(), Nodes),
io:format("~p~n", [sets:size(Anti)]),
erlang:halt(0).
nodes(<<>>, _, _, Max, Map) -> {Map, Max};
nodes(<<"\n", T/binary>>, Y, _, {MX,MY}, Map) ->
nodes(T, Y+1, 0, {max(MX, 0), max(MY, Y+1)}, Map);
nodes(<<".", T/binary>>, Y, X, {MX,MY}, Map) ->
nodes(T, Y, X+1, {max(MX, X), max(MY, Y)}, Map);
nodes(<<C:1/binary, T/binary>>, Y, X, {MX,MY}, Map) ->
Map1 = maps:update_with(C, fun(L) -> [{X,Y} | L] end, [{X,Y}], Map),
nodes(T, Y, X+1, {max(MX, X), max(MY, Y)}, Map1).
antinodes(L, N, Max, S0) ->
lists:foldl(fun(H, S1) ->
{[P0], R} = lists:partition(fun(E) -> E == H end, N),
lists:foldl(fun(P1, S2) ->
antinode(P0, P1, Max, sets:add_element(P1, S2))
end, S1, R)
end, S0, L).
antinode({X1,Y1}, {X2,Y2}=P1, {MaxX,MaxY}=B, S) ->
A = {X,Y} = {X2-(X1-X2),Y2-(Y1-Y2)},
if
X >= 0, X =< MaxX, Y >= 0, Y =< MaxY ->
antinode(P1, A, B, sets:add_element(A, S));
true -> S
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment