2022 Day 11 rough

This commit is contained in:
Luke Hubmayer-Werner 2022-12-11 16:32:46 +10:30
parent 5ab619d420
commit 6a7a6e7d23
2 changed files with 123 additions and 0 deletions

68
2022/day11.py Normal file
View File

@ -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)}')

55
2022/input/11 Normal file
View File

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