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