75 lines
2.1 KiB
Python
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)
|