aoc2021/day20.py
Stefan Harmuth 44148fd4ae day20
2021-12-20 08:14:34 +01:00

53 lines
1.5 KiB
Python

from tools.aoc import AOCDay
from tools.coordinate import Coordinate
from tools.grid import Grid
from typing import Any, List
def enhance(image: Grid, enhancements: List[bool], count: int) -> Grid:
flippingInfinity = enhancements[0] and not enhancements[-1]
infinity = False
for _ in range(count):
if flippingInfinity:
infinity = not infinity
new_image = Grid(infinity)
for x in image.rangeX(pad=1):
for y in image.rangeY(pad=1):
index_str = ''
for y1 in [y - 1, y, y + 1]:
for x1 in [x - 1, x, x + 1]:
index_str += '1' if image.get(Coordinate(x1, y1)) else '0'
new_image.set(Coordinate(x, y), enhancements[int(index_str, 2)])
image = new_image
return image
class Day(AOCDay):
test_solutions_p1 = [35, 5425]
test_solutions_p2 = [3351, 14052]
def getInputs(self) -> (Grid, List[bool]):
enhancement, image = self.getMultiLineInputAsArray()
enhancement = [c == '#' for c in enhancement[0]]
grid = Grid()
for y, l in enumerate(image):
for x, c in enumerate(l):
grid.set(Coordinate(x, y), c == '#')
return grid, enhancement
def part1(self) -> Any:
image, enhancement = self.getInputs()
image = enhance(image, enhancement, 2)
return image.getSum()
def part2(self) -> Any:
image, enhancement = self.getInputs()
image = enhance(image, enhancement, 50)
return image.getSum()