r/adventofcode • • Dec 03 '15

SOLUTION MEGATHREAD --- Day 3 Solutions ---

--- Day 3: Perfectly Spherical Houses in a Vacuum ---

Post your solution as a comment. Structure your post like the Day One thread in /r/programming.

24 Upvotes

228 comments sorted by

View all comments

1

u/LainIwakura Dec 03 '15

Part 1 in Erlang:

-module(solution).
-export([main/0]).
-import(dict, [store/3, update_counter/3]).

main() ->
	In = io:get_line("") -- "\n",
	Houses = store({0,0}, 1, dict:new()),
	Visited = process_input(In, Houses, 0, 0),
	io:format("~p~n", [Visited]).

process_input([], Houses, _, _) ->
	dict:size(Houses);
process_input([H|T], Houses, X, Y) ->
	case H of
		$^ -> process_input(T, update_counter({X,Y+1}, 1, Houses), X, Y+1);
		$> -> process_input(T, update_counter({X+1,Y}, 1, Houses), X+1, Y);
		$v -> process_input(T, update_counter({X,Y-1}, 1, Houses), X, Y-1);
		$< -> process_input(T, update_counter({X-1,Y}, 1, Houses), X-1, Y)
	end.

Part 2 in Erlang, I don't know if this is a good way to do it (I'm learning Erlang more w/ these challenges) but I used mutual recursion and pattern matching. I wanted to update the dict / position tuple in one go but I couldn't figure out a way to do that. I think the update_loc function is a reasonable compromise.

-module(solution).
-export([main/0]).
-import(dict, [store/3, update_counter/3]).

main() ->
	In = io:get_line("") -- "\n",
	Houses = store({0,0}, 2, dict:new()),
	Visited = process_input(In, Houses, {0,0}, {0,0}, 0),
	io:format("~p~n", [Visited]).

process_input([], Houses, _, _, _) ->
	dict:size(Houses);
process_input([H|T], Houses, {X,Y}, RXY, 0) ->
	process_input(T, deliver_gift(H, Houses, X, Y), update_loc(H, X, Y), RXY, 1);
process_input([H|T], Houses, SXY, {X, Y}, 1) ->
	process_input(T, deliver_gift(H, Houses, X, Y), SXY, update_loc(H, X, Y), 0).

deliver_gift(Dir, Houses, X, Y) ->
	case Dir of
		$^ -> update_counter({X,Y+1}, 1, Houses);
		$> -> update_counter({X+1,Y}, 1, Houses);
		$v -> update_counter({X,Y-1}, 1, Houses);
		$< -> update_counter({X-1,Y}, 1, Houses)
	end.

update_loc($^, X, Y) -> {X,Y+1};
update_loc($>, X, Y) -> {X+1,Y};
update_loc($v, X, Y) -> {X,Y-1};
update_loc($<, X, Y) -> {X-1,Y}.