|
| 1 | +from dataclasses import dataclass |
| 2 | + |
| 3 | +from aocd.models import Puzzle |
| 4 | + |
| 5 | +puzzle = Puzzle(2022, 11) |
| 6 | +input_data = puzzle.input_data.split("\n\n") |
| 7 | + |
| 8 | + |
| 9 | +@dataclass(order=True) |
| 10 | +class Monkey: |
| 11 | + items: list[int] |
| 12 | + operation: str |
| 13 | + divisible_by: int |
| 14 | + if_true: int |
| 15 | + if_false: int |
| 16 | + inspected_items: int = 0 |
| 17 | + |
| 18 | + |
| 19 | +def parse(): |
| 20 | + monkeys = [] |
| 21 | + for monkey in input_data: |
| 22 | + monkey = monkey.splitlines() |
| 23 | + monkeys.append( |
| 24 | + Monkey( |
| 25 | + items=[int(i) for i in monkey[1].split(":")[1].split(", ")], |
| 26 | + operation=monkey[2].split("= ")[1], |
| 27 | + divisible_by=int(monkey[3].split("by ")[1]), |
| 28 | + if_true=int(monkey[4][-1]), |
| 29 | + if_false=int(monkey[5][-1]), |
| 30 | + ) |
| 31 | + ) |
| 32 | + return monkeys |
| 33 | + |
| 34 | + |
| 35 | +def part_a(): |
| 36 | + monkeys: list[Monkey] = parse() |
| 37 | + for round in range(20): |
| 38 | + for monkey in monkeys: |
| 39 | + for item in monkey.items: |
| 40 | + monkey.inspected_items += 1 |
| 41 | + old = item |
| 42 | + item = eval(monkey.operation) // 3 |
| 43 | + if item % monkey.divisible_by == 0: |
| 44 | + monkeys[monkey.if_true].items.append(item) |
| 45 | + else: |
| 46 | + monkeys[monkey.if_false].items.append(item) |
| 47 | + monkey.items = [] |
| 48 | + print(round) |
| 49 | + monkeys.sort(key=lambda m: m.inspected_items, reverse=True) |
| 50 | + return monkeys[0].inspected_items * monkeys[1].inspected_items |
| 51 | + |
| 52 | + |
| 53 | +if __name__ == "__main__": |
| 54 | + puzzle.answer_a = part_a() |
0 commit comments