aoc2018/day06.py

75 lines
2.1 KiB
Python

from tools.aoc import AOCDay
from tools.coordinate import Coordinate, DistanceAlgorithm
from tools.grid import Grid
from typing import Any, List
def fill_space(grid: Grid, coords: List[Coordinate], distance: int, sizecounter: List[int]) -> int:
filled = 0
for i, c in enumerate(coords):
for t in c.getCircle(distance, False, *grid.getBoundaries()):
if grid.get(t) == '.':
for tc in coords:
if tc != c and t.getDistanceTo(tc, DistanceAlgorithm.MANHATTAN, False) == distance:
grid.set(t, False)
break
else:
grid.set(t, i)
sizecounter[i] += 1
filled += 1
return filled
class Day(AOCDay):
inputs = [
[
(17, "test_input6_1"),
(4771, "input6")
],
[
(39149, "input6")
]
]
def get_input_coordinates(self) -> List[Coordinate]:
return [Coordinate(x, y) for x, y in self.getInputAsArraySplit(", ", return_type=int)]
def part1(self) -> Any:
coords = self.get_input_coordinates()
grid = Grid(".")
for i, c in enumerate(coords):
grid.set(c, i)
size_counter = [0] * len(coords)
fill_dist = 1
while fill_space(grid, coords, fill_dist, size_counter) > 0:
fill_dist += 1
return max(size_counter) + 1
def part2(self) -> Any:
coords = self.get_input_coordinates()
grid = Grid()
for c in coords:
grid.toggle(c)
region_size = 0
for x in range(grid.minX, grid.maxX + 1):
for y in range(grid.minY, grid.maxY + 1):
this_dist_sum = 0
for c in coords:
this_dist_sum += Coordinate(x, y).getDistanceTo(c, DistanceAlgorithm.MANHATTAN, False)
if this_dist_sum >= 10_000:
break
else:
region_size += 1
return region_size
if __name__ == '__main__':
day = Day(2018, 6)
day.run(verbose=True)