12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import operator
- from collections import defaultdict
- from enum import Enum
-
-
- class State(Enum):
- clean = 0,
- weakened = 1,
- infected = 2,
- flagged = 3
-
-
- def clean_cells():
- cells = defaultdict(lambda: State.clean)
- for y, line in enumerate(lines):
- for x, c in enumerate(line):
- cells[(x, y)] = State.infected if c == '#' else State.clean
- return cells
-
-
- def execute(runs, transitions):
- cells, location, direction, infected = clean_cells(), start, (0, -1), 0
- for _ in range(runs):
- direction = directions[cells[location]][direction]
- cells[location] = transitions[cells[location]]
- if cells[location] == State.infected:
- infected += 1
- location = tuple(map(operator.add, location, direction))
- return infected
-
-
- with open('data/22.txt') as file:
- lines = file.readlines()
- start = ((len(lines[0]) - 1) // 2, (len(lines) - 1) // 2)
-
- right = {(0, -1): (1, 0), (1, 0): (0, 1), (0, 1): (-1, 0), (-1, 0): (0, -1)}
- left = {v: k for k, v in right.items()}
- identity = {v: v for v in right.values()}
- reverse = {v: (-1 * v[0], -1 * v[1]) for v in right.values()}
-
- directions = {
- State.clean: left,
- State.infected: right,
- State.weakened: identity,
- State.flagged: reverse
- }
-
- transitions = [
- {
- # part one
- State.clean: State.infected,
- State.infected: State.clean,
- },
- {
- # part two
- State.clean: State.weakened,
- State.weakened: State.infected,
- State.infected: State.flagged,
- State.flagged: State.clean,
- }
- ]
-
- print(f'Part one: {execute(10000, transitions[0])}')
- print(f'Part two: {execute(10000000, transitions[1])}')
|