You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

49 lines
1.8 KiB

#!/usr/bin/env python3
import sys, re
from copy import deepcopy
from functools import reduce
from operator import mul
def parse_monkey(m):
name = int(re.compile(r"Monkey (?P<name>\d):").search(m).group('name'))
items = eval('[' + re.compile(r"Starting items: (?P<item>(\d+(, )?)+)").search(m).group('item') + ']')
expr = re.compile(r"Operation: new = (?P<op>.+)").search(m).group('op')
test = int(re.compile(r"Test: divisible by (?P<num>\d+)").search(m).group('num'))
true = int(re.compile(r"If true: throw to monkey (?P<name>\d)").search(m).group('name'))
false = int(re.compile(r"If false: throw to monkey (?P<name>\d)").search(m).group('name'))
inspect = 0
dic = locals()
dic.pop('m',None)
return dic
def roun(ms,worry,cap):
for m in ms:
while m['items']:
old = m['items'].pop(0)
new = eval(m['expr']) // (3 if not worry else 1) % cap
if (new % m['test']) == 0: ms[m['true']]['items'].append(new)
else: ms[m['false']]['items'].append(new)
m['inspect'] = m['inspect'] + 1
if __name__ == '__main__':
start_monkeys = [parse_monkey(mon) for mon in open(sys.argv[1]).read().split('\n\n')]
highest = reduce(mul,[m['test'] for m in start_monkeys])
# challenge 1
monkeys = deepcopy(start_monkeys)
for _ in range(20):
roun(monkeys,False,highest)
busy = sorted([m['inspect'] for m in monkeys], reverse=True)
res1 = str(busy[0] * busy[1])
print("challenge 1:" + "\n" + res1 + "\n")
# challenge 2
monkeys = deepcopy(start_monkeys)
for i in range(10000):
roun(monkeys,True,highest)
busy = sorted([m['inspect'] for m in monkeys], reverse=True)
res2 = str(busy[0] * busy[1])
print("challenge 2:" + "\n" + res2 + "\n")