2022 Day 11 rough
This commit is contained in:
parent
5ab619d420
commit
6a7a6e7d23
|
@ -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)}')
|
|
@ -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
|
Loading…
Reference in New Issue