From 1c4d96edf445e9046393197623fdb76121433818 Mon Sep 17 00:00:00 2001 From: Shanti Chellaram Date: Mon, 12 Dec 2022 01:19:09 +0900 Subject: [PATCH] Day 11-2 --- day11.erl | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/day11.erl b/day11.erl index 83dd12e..c1a8f2d 100644 --- a/day11.erl +++ b/day11.erl @@ -4,7 +4,18 @@ solve(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) -> Monkeys1 = maps:values(Monkeys0), @@ -38,7 +49,7 @@ increment_interacts(Monkey) -> throw_item(Monkeys, From, To) -> #{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, #{}). @@ -57,8 +68,8 @@ parse_monkeys(Input, Storage) -> True = TrueDigit - $0, <<" If false: throw to monkey ", FalseDigit, $\n, Rest9/binary>> = Rest8, 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(<<$\s, Rest/binary>>, Acc) -> parse_operation(Rest, Acc);