2022 day 11

This commit is contained in:
2022-12-11 14:59:39 +00:00
parent 47a16a9b6a
commit 762f9b0700
4 changed files with 177 additions and 2 deletions

55
2022/11/input Normal file
View File

@@ -0,0 +1,55 @@
Monkey 0:
Starting items: 89, 73, 66, 57, 64, 80
Operation: new = old * 3
Test: divisible by 13
If true: throw to monkey 6
If false: throw to monkey 2
Monkey 1:
Starting items: 83, 78, 81, 55, 81, 59, 69
Operation: new = old + 1
Test: divisible by 3
If true: throw to monkey 7
If false: throw to monkey 4
Monkey 2:
Starting items: 76, 91, 58, 85
Operation: new = old * 13
Test: divisible by 7
If true: throw to monkey 1
If false: throw to monkey 4
Monkey 3:
Starting items: 71, 72, 74, 76, 68
Operation: new = old * old
Test: divisible by 2
If true: throw to monkey 6
If false: throw to monkey 0
Monkey 4:
Starting items: 98, 85, 84
Operation: new = old + 7
Test: divisible by 19
If true: throw to monkey 5
If false: throw to monkey 7
Monkey 5:
Starting items: 78
Operation: new = old + 8
Test: divisible by 5
If true: throw to monkey 3
If false: throw to monkey 0
Monkey 6:
Starting items: 86, 70, 60, 88, 88, 78, 74, 83
Operation: new = old + 4
Test: divisible by 11
If true: throw to monkey 1
If false: throw to monkey 2
Monkey 7:
Starting items: 81, 58
Operation: new = old + 5
Test: divisible by 17
If true: throw to monkey 3
If false: throw to monkey 5

58
2022/11/part1 Executable file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/env python
import re
MONKEYS = []
def parse_factor(old, factor):
if factor == 'old':
return old
return int(factor)
OPS = {
'*': lambda old, factor: old * parse_factor(old, factor),
'+': lambda old, factor: old + parse_factor(old, factor),
}
with open('input') as f:
monkey = {'inspections': 0}
for line in f:
if line == "\n":
MONKEYS.append(monkey)
monkey = {'inspections': 0}
elif match := re.match('^Monkey (\d+):$', line):
monkey['id'] = int(match[1])
elif match := re.match('^ Starting items:', line):
_, items = line.rstrip().split(":")
monkey['items'] = list(map(int, items.split(", ")))
elif match := re.match('^ Operation: new = old ([\*\+]) (\w+)', line):
monkey['op_op'] = match[1]
monkey['op_factor'] = match[2]
elif match := re.match('^ Test: divisible by (\d+)$', line):
monkey['test_factor'] = int(match[1])
elif match := re.match('^ If (true|false): throw to monkey (\d+)$', line):
monkey['test_'+match[1]] = int(match[2])
else:
raise Exception('unhandled line: '+line)
MONKEYS.append(monkey)
for idx, monkey in enumerate(MONKEYS):
assert(idx == monkey['id'])
for r in range(1, 21): # round
for monkey in MONKEYS: # turn
for item in monkey['items']:
item = OPS[monkey['op_op']](item, monkey['op_factor'])
item = item // 3
if item % monkey['test_factor'] == 0:
MONKEYS[monkey['test_true']]['items'].append(item)
else:
MONKEYS[monkey['test_false']]['items'].append(item)
monkey['inspections'] = monkey['inspections'] + 1
monkey['items'] = []
by_inspections = sorted(MONKEYS, key=lambda monkey: monkey['inspections'])
print(by_inspections[-1]['inspections'] * by_inspections[-2]['inspections'])

62
2022/11/part2 Executable file
View File

@@ -0,0 +1,62 @@
#!/usr/bin/env python
import re
import math
MONKEYS = []
def parse_factor(old, factor):
if factor == 'old':
return old
return int(factor)
OPS = {
'*': lambda old, factor: old * parse_factor(old, factor),
'+': lambda old, factor: old + parse_factor(old, factor),
}
with open('input') as f:
monkey = {'inspections': 0}
for line in f:
if line == "\n":
MONKEYS.append(monkey)
monkey = {'inspections': 0}
elif match := re.match('^Monkey (\d+):$', line):
monkey['id'] = int(match[1])
elif match := re.match('^ Starting items:', line):
_, items = line.rstrip().split(":")
monkey['items'] = list(map(int, items.split(", ")))
elif match := re.match('^ Operation: new = old ([\*\+]) (\w+)', line):
monkey['op_op'] = match[1]
monkey['op_factor'] = match[2]
elif match := re.match('^ Test: divisible by (\d+)$', line):
monkey['test_factor'] = int(match[1])
elif match := re.match('^ If (true|false): throw to monkey (\d+)$', line):
monkey['test_'+match[1]] = int(match[2])
else:
raise Exception('unhandled line: '+line)
MONKEYS.append(monkey)
for idx, monkey in enumerate(MONKEYS):
assert(idx == monkey['id'])
# keep the size of the numbers down
lcm = math.lcm(*map(lambda monkey: monkey['test_factor'], MONKEYS))
for r in range(0,10000): # round
for monkey in MONKEYS: # turn
for item in monkey['items']:
item = OPS[monkey['op_op']](item, monkey['op_factor'])
item = item % lcm
if item % monkey['test_factor'] == 0:
MONKEYS[monkey['test_true']]['items'].append(item)
else:
MONKEYS[monkey['test_false']]['items'].append(item)
monkey['inspections'] = monkey['inspections'] + 1
monkey['items'] = []
by_inspections = sorted(MONKEYS, key=lambda monkey: monkey['inspections'])
print(by_inspections[-1]['inspections'] * by_inspections[-2]['inspections'])

View File

@@ -9,7 +9,7 @@ a programming language I'm interested in learning more about.
2018, 2019, and 2020 were in their own separate repositories, but have been 2018, 2019, and 2020 were in their own separate repositories, but have been
`git subtree`'d into this one - no point creating a new repository every year. `git subtree`'d into this one - no point creating a new repository every year.
* [2022](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2022) 🌟 `20` - Python * [2022](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2022) 🌟 `22` - Python
* [2021](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2021) 🌟 ` 5` - Python * [2021](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2021) 🌟 ` 5` - Python
* [2020](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2020) 🌟 `20` - Javascript * [2020](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2020) 🌟 `20` - Javascript
* [2019](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2019) 🌟 `22` - Zig * [2019](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2019) 🌟 `22` - Zig
@@ -18,6 +18,6 @@ a programming language I'm interested in learning more about.
* 2016 🌟 `16` - LISP? * 2016 🌟 `16` - LISP?
* 2015 🌟 ` 9` - Ruby? * 2015 🌟 ` 9` - Ruby?
Total: 🌟 `98` Total: 🌟 `100`
Maybe I'll backfill some of the old years one day. Maybe I'll backfill some of the old years one day.