diff --git a/day5.erl b/day5.erl index be984dd..0a66936 100644 --- a/day5.erl +++ b/day5.erl @@ -1,27 +1,26 @@ -module(day5). --compile(export_all). -export([solve/1]). - solve(InputData) -> [DiagramData, Instructions] = binary:split(InputData, <<"\n\n">>, [trim_all]), Diagram = lists:reverse(binary:split(DiagramData, <<"\n">>, [trim_all, global])), 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) -> lists:reverse( 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, {Moves, Instruction2} = parse_int(Instruction1), <<" 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(<>, 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, 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(<<>>, _Boxes, Stacks) -> Stacks;