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)