Browse Source

Day 5-2

trunk
Shanti Chellaram 3 years ago
parent
commit
847380f878
  1. 19
      day5.erl

19
day5.erl

@ -1,27 +1,26 @@
-module(day5). -module(day5).
-compile(export_all).
-export([solve/1]). -export([solve/1]).
solve(InputData) -> solve(InputData) ->
[DiagramData, Instructions] = binary:split(InputData, <<"\n\n">>, [trim_all]), [DiagramData, Instructions] = binary:split(InputData, <<"\n\n">>, [trim_all]),
Diagram = lists:reverse(binary:split(DiagramData, <<"\n">>, [trim_all, global])), Diagram = lists:reverse(binary:split(DiagramData, <<"\n">>, [trim_all, global])),
Stacks = parse_diagram(Diagram), Stacks = parse_diagram(Diagram),
EndStacks = eval_instructions(Instructions, Stacks),
{print_stacks(EndStacks), none}.
EndStacks = eval_instructions(Instructions, Stacks, fun eval_move/4),
EndStacks2 = eval_instructions(Instructions, Stacks, fun eval_move2/4),
{print_stacks(EndStacks), print_stacks(EndStacks2)}.
print_stacks(Stacks) -> print_stacks(Stacks) ->
lists:reverse( lists:reverse(
maps:fold(fun (_Key, [Top|_Rest], Acc) -> [Top|Acc] end, [], Stacks) maps:fold(fun (_Key, [Top|_Rest], Acc) -> [Top|Acc] end, [], Stacks)
). ).
eval_instructions(<<>>, Stacks) -> Stacks;
eval_instructions(Instructions, Stacks) ->
eval_instructions(<<>>, Stacks, _MoveFun) -> Stacks;
eval_instructions(Instructions, Stacks, MoveFun) ->
<<"move ", Instruction1/binary>> = Instructions, <<"move ", Instruction1/binary>> = Instructions,
{Moves, Instruction2} = parse_int(Instruction1), {Moves, Instruction2} = parse_int(Instruction1),
<<" from ", DigitFrom, " to ", DigitTo, $\n, Rest/binary>> = Instruction2, <<" from ", DigitFrom, " to ", DigitTo, $\n, Rest/binary>> = Instruction2,
eval_instructions(Rest, eval_move(DigitFrom, DigitTo, Moves, Stacks)).
eval_instructions(Rest, MoveFun(DigitFrom, DigitTo, Moves, Stacks), MoveFun).
parse_int(String) -> parse_int(String, 0). parse_int(String) -> parse_int(String, 0).
parse_int(<<Char, Rest/binary>>, Acc) when Char >= $0 andalso Char =< $9 -> parse_int(Rest, Acc*10+(Char - $0)); parse_int(<<Char, Rest/binary>>, Acc) when Char >= $0 andalso Char =< $9 -> parse_int(Rest, Acc*10+(Char - $0));
@ -32,6 +31,12 @@ eval_move(DigitFrom, DigitTo, N, Stacks) when is_integer(N) and (N > 0) ->
#{DigitFrom := [Item | StackFrom], DigitTo := StackTo} = Stacks, #{DigitFrom := [Item | StackFrom], DigitTo := StackTo} = Stacks,
eval_move(DigitFrom, DigitTo, N-1, Stacks#{DigitFrom := StackFrom, DigitTo := [Item | StackTo]}). eval_move(DigitFrom, DigitTo, N-1, Stacks#{DigitFrom := StackFrom, DigitTo := [Item | StackTo]}).
eval_move2(DigitFrom, DigitTo, N, Stacks) when is_integer(N) and (N > 0) ->
#{DigitFrom := StackFrom, DigitTo := StackTo} = Stacks,
{Items, NewFrom} = lists:split(N, StackFrom),
NewTo = Items ++ StackTo,
Stacks#{DigitFrom := NewFrom, DigitTo := NewTo}.
parse_diagram([Program | Boxes]) -> parse_diagram(Program, Boxes, #{}). parse_diagram([Program | Boxes]) -> parse_diagram(Program, Boxes, #{}).
parse_diagram(<<>>, _Boxes, Stacks) -> Stacks; parse_diagram(<<>>, _Boxes, Stacks) -> Stacks;

Loading…
Cancel
Save