|
|
@ -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); |
|
|
|