diff --git a/2022/day11.py b/2022/day11.py new file mode 100644 index 0000000..6701e18 --- /dev/null +++ b/2022/day11.py @@ -0,0 +1,68 @@ +from helpers import * +from math import prod, lcm + +input_stripped = read_day(day) +monkeys_input = [m.split('\n') for m in input_stripped.split('\n\n')] +# monkeys_input = [[l.strip() for l in m.split('\n')] for m in input_stripped.split('\n\n')] +num_regex = re.compile(r'(\d+)') +op_regex = re.compile(r'Operation: (new = .*)') + +def generate_monkeys(split_input): + monkeys = {} + for monkey in monkeys_input: + m = { + 'id': int(num_regex.findall(monkey[0])[0]), + 'items': [int(x) for x in num_regex.findall(monkey[1])], + 'operation': op_regex.findall(monkey[2])[0], + 'test_divisor': int(num_regex.findall(monkey[3])[0]), + 'true_monkey': int(num_regex.findall(monkey[4])[0]), + 'false_monkey': int(num_regex.findall(monkey[5])[0]), + 'inspections': 0, + } + monkeys[m['id']] = m + return monkeys + +def calculate_monkey_business(monkeys): + inspections = [m['inspections'] for m in monkeys.values()] + print(inspections) + return prod(sorted(inspections)[-2:]) + +# Part 1 +monkeys = generate_monkeys(monkeys_input) +for round in range(20): + for monkey in monkeys.values(): + for item in monkey['items']: + worry = item + old = worry + new = 0 + exec(monkey['operation']) + worry = new // 3 + if worry % monkey['test_divisor'] == 0: + monkeys[monkey['true_monkey']]['items'].append(worry) + else: + monkeys[monkey['false_monkey']]['items'].append(worry) + monkey['inspections'] += 1 + monkey['items'] = [] +print(f'Part 1: {calculate_monkey_business(monkeys)}') + +# Part 2 +monkeys = generate_monkeys(monkeys_input) +# divisor = prod([m['test_divisor'] for m in monkeys.values()]) +divisor = lcm(*[m['test_divisor'] for m in monkeys.values()]) +print(f'Using modular arithmetic of base: {divisor}') + +for round in range(10000): + for monkey in monkeys.values(): + for item in monkey['items']: + worry = item + old = worry + new = 0 + exec(monkey['operation']) + worry = new % divisor + if worry % monkey['test_divisor'] == 0: + monkeys[monkey['true_monkey']]['items'].append(worry) + else: + monkeys[monkey['false_monkey']]['items'].append(worry) + monkey['inspections'] += 1 + monkey['items'] = [] +print(f'Part 2: {calculate_monkey_business(monkeys)}') diff --git a/2022/input/11 b/2022/input/11 new file mode 100644 index 0000000..2e2bd25 --- /dev/null +++ b/2022/input/11 @@ -0,0 +1,55 @@ +Monkey 0: + Starting items: 50, 70, 89, 75, 66, 66 + Operation: new = old * 5 + Test: divisible by 2 + If true: throw to monkey 2 + If false: throw to monkey 1 + +Monkey 1: + Starting items: 85 + Operation: new = old * old + Test: divisible by 7 + If true: throw to monkey 3 + If false: throw to monkey 6 + +Monkey 2: + Starting items: 66, 51, 71, 76, 58, 55, 58, 60 + Operation: new = old + 1 + Test: divisible by 13 + If true: throw to monkey 1 + If false: throw to monkey 3 + +Monkey 3: + Starting items: 79, 52, 55, 51 + Operation: new = old + 6 + Test: divisible by 3 + If true: throw to monkey 6 + If false: throw to monkey 4 + +Monkey 4: + Starting items: 69, 92 + Operation: new = old * 17 + Test: divisible by 19 + If true: throw to monkey 7 + If false: throw to monkey 5 + +Monkey 5: + Starting items: 71, 76, 73, 98, 67, 79, 99 + Operation: new = old + 8 + Test: divisible by 5 + If true: throw to monkey 0 + If false: throw to monkey 2 + +Monkey 6: + Starting items: 82, 76, 69, 69, 57 + Operation: new = old + 7 + Test: divisible by 11 + If true: throw to monkey 7 + If false: throw to monkey 4 + +Monkey 7: + Starting items: 65, 79, 86 + Operation: new = old + 5 + Test: divisible by 17 + If true: throw to monkey 5 + If false: throw to monkey 0