Browse Source

Day 11-2

trunk
Shanti Chellaram 3 years ago
parent
commit
1c4d96edf4
  1. 19
      day11.erl

19
day11.erl

@ -4,7 +4,18 @@
solve(Input) -> solve(Input) ->
Monkeys = parse_monkeys(Input), Monkeys = parse_monkeys(Input),
{score(run(20, Monkeys)), none}.
Monkeys1 = worry_management(Monkeys, 1),
Monkeys2 = worry_management(Monkeys, 2),
{score(run(20, Monkeys1)), score(run(10000, Monkeys2))}.
worry_management(Monkeys, Part) ->
Product = maps:fold(fun(_, #{test_divisor := TestDivisor}, Acc) -> Acc * TestDivisor end, 1, Monkeys),
maps:map(fun (_, #{operation := Operation} = Monkey) ->
Monkey#{operation :=
case Part of
1 -> fun (Level) -> Operation(Level) div 3 end;
2 -> fun (Level) -> Operation(Level) rem Product end
end} end, Monkeys).
score(Monkeys0) -> score(Monkeys0) ->
Monkeys1 = maps:values(Monkeys0), Monkeys1 = maps:values(Monkeys0),
@ -38,7 +49,7 @@ increment_interacts(Monkey) ->
throw_item(Monkeys, From, To) -> throw_item(Monkeys, From, To) ->
#{From := #{operation := Op, queue:= [Item|FromQueue]} = FromMonkey, To := #{queue := ToQueue} = ToMonkey} = Monkeys, #{From := #{operation := Op, queue:= [Item|FromQueue]} = FromMonkey, To := #{queue := ToQueue} = ToMonkey} = Monkeys,
Monkeys#{From := increment_interacts(FromMonkey#{queue:=FromQueue}), To := ToMonkey#{queue := ToQueue ++ [Op(Item) div 3]}}.
Monkeys#{From := increment_interacts(FromMonkey#{queue:=FromQueue}), To := ToMonkey#{queue := ToQueue ++ [Op(Item)]}}.
parse_monkeys(Input) -> parse_monkeys(Input, #{}). parse_monkeys(Input) -> parse_monkeys(Input, #{}).
@ -57,8 +68,8 @@ parse_monkeys(Input, Storage) ->
True = TrueDigit - $0, True = TrueDigit - $0,
<<" If false: throw to monkey ", FalseDigit, $\n, Rest9/binary>> = Rest8, <<" If false: throw to monkey ", FalseDigit, $\n, Rest9/binary>> = Rest8,
False = FalseDigit - $0, False = FalseDigit - $0,
Test = fun (Var) -> case (Var div 3) rem TestDivisor of 0 -> True; _ -> False end end,
parse_monkeys(Rest9, Storage#{MonkeyNumber => #{queue => Items, operation => Operation, test => Test}}).
Test = fun (Var) -> case Var rem TestDivisor of 0 -> True; _ -> False end end,
parse_monkeys(Rest9, Storage#{MonkeyNumber => #{queue => Items, operation => Operation, test_divisor => TestDivisor, test => Test}}).
parse_operation(<<$\n, Rest/binary>>, [Rhs, Op, Lhs]) -> {fun(Old) -> Op(Rhs(Old), Lhs(Old)) end, Rest}; parse_operation(<<$\n, Rest/binary>>, [Rhs, Op, Lhs]) -> {fun(Old) -> Op(Rhs(Old), Lhs(Old)) end, Rest};
parse_operation(<<$\s, Rest/binary>>, Acc) -> parse_operation(Rest, Acc); parse_operation(<<$\s, Rest/binary>>, Acc) -> parse_operation(Rest, Acc);

Loading…
Cancel
Save