diff --git a/day11/input.txt b/day11/input.txt new file mode 100644 index 0000000..8798a00 --- /dev/null +++ b/day11/input.txt @@ -0,0 +1,55 @@ +Monkey 0: + Starting items: 71, 56, 50, 73 + Operation: new = old * 11 + Test: divisible by 13 + If true: throw to monkey 1 + If false: throw to monkey 7 + +Monkey 1: + Starting items: 70, 89, 82 + Operation: new = old + 1 + Test: divisible by 7 + If true: throw to monkey 3 + If false: throw to monkey 6 + +Monkey 2: + Starting items: 52, 95 + Operation: new = old * old + Test: divisible by 3 + If true: throw to monkey 5 + If false: throw to monkey 4 + +Monkey 3: + Starting items: 94, 64, 69, 87, 70 + Operation: new = old + 2 + Test: divisible by 19 + If true: throw to monkey 2 + If false: throw to monkey 6 + +Monkey 4: + Starting items: 98, 72, 98, 53, 97, 51 + Operation: new = old + 6 + Test: divisible by 5 + If true: throw to monkey 0 + If false: throw to monkey 5 + +Monkey 5: + Starting items: 79 + Operation: new = old + 7 + Test: divisible by 2 + If true: throw to monkey 7 + If false: throw to monkey 0 + +Monkey 6: + Starting items: 77, 55, 63, 93, 66, 90, 88, 71 + Operation: new = old * 7 + Test: divisible by 11 + If true: throw to monkey 2 + If false: throw to monkey 4 + +Monkey 7: + Starting items: 54, 97, 87, 70, 59, 82, 59 + Operation: new = old + 8 + Test: divisible by 17 + If true: throw to monkey 1 + If false: throw to monkey 3 diff --git a/day11/part1.py b/day11/part1.py new file mode 100644 index 0000000..508f81b --- /dev/null +++ b/day11/part1.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +lines = (x.strip() for x in open("input.txt")) +monkeys = [] + + +def create_op(op_line): + if "old * old" in op_line: + return lambda x: x**2 + val = int(op_line[6:]) + if "*" in op_line: + return lambda x: x*val + return lambda x: x+val + + +for line in lines: + monkeys.append({ + "items": [*map(int, next(lines)[16:].split(", "))], + "op": create_op(next(lines)[17:]), + "div": int(next(lines)[19:]), + "if_true": int(next(lines)[25:]), + "if_false": int(next(lines)[26:]), + "count": 0 + }) + next(lines, None) + +for _ in range(20): + for idx, monkey in enumerate(monkeys): + while monkey['items']: + monkey['count'] += 1 + worry = monkey['op'](monkey['items'].pop(0)) // 3 + monkeys[monkey['if_true' if worry % monkey['div'] == 0 else 'if_false']]['items'].append(worry) + +insp = sorted(monkey['count'] for monkey in monkeys) +print(insp[-2]*insp[-1]) diff --git a/day11/part2.py b/day11/part2.py new file mode 100644 index 0000000..1dacc5b --- /dev/null +++ b/day11/part2.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +from functools import reduce + +lines = (x.strip() for x in open("input.txt")) +monkeys = [] + + +def create_op(op_line): + if "old * old" in op_line: + return lambda x: x**2 + val = int(op_line[6:]) + if "*" in op_line: + return lambda x: x*val + return lambda x: x+val + + +for line in lines: + monkeys.append({ + "items": [*map(int, next(lines)[16:].split(", "))], + "op": create_op(next(lines)[17:]), + "div": int(next(lines)[19:]), + "if_true": int(next(lines)[25:]), + "if_false": int(next(lines)[26:]), + "count": 0 + }) + next(lines, None) + +divisor = reduce(lambda x, y: x*y, set(monkey['div'] for monkey in monkeys)) + +for _ in range(10000): + for monkey in monkeys: + while monkey['items']: + monkey['count'] += 1 + worry = monkey['op'](monkey['items'].pop(0)) % divisor + monkeys[monkey['if_true' if worry % monkey['div'] == 0 else 'if_false']]['items'].append(worry) + +insp = sorted(monkey['count'] for monkey in monkeys) +print(insp[-2]*insp[-1])