#!/usr/bin/env python3 from pprint import pprint with open('input.txt', 'r') as f: coords = [x.strip().split(', ') for x in f.readlines()] coords = [tuple(map(lambda y: int(y), x)) for x in coords] # print(coords) def distance(p1, p2): """Manhattan distance""" return abs(p2[0] - p1[0]) + abs(p2[1] - p1[1]) def get_closest_idx(coords, point): """Returns the index of the point that is closest to the point or None""" distances = [distance(x, point) for x in coords] min_dist = min(distances) return distances.index(min_dist) if distances.count(min_dist) == 1 else None def is_infinite_area(coords, idx, delta=10000): """Determines if point coords[idx] has infinite area A point has infinite area if it is closest to any of the four points: * (x, y + delta) * (x, y - delta) * (x + delta, y) * (x - delte, y) """ point = coords[idx] far_points = [ (point[0], point[1] + delta), (point[0], point[1] - delta), (point[0] + delta, point[1]), (point[0] - delta, point[1]) ] for far in far_points: if get_closest_idx(coords, far) == idx: return True return False def get_circle(point, radius): """Returns an array of all points with distance radius to point""" if radius == 0: return [point] x = point[0] y = point[1] d_x = radius d_y = 0 circle = list() while d_y < radius: circle.append((x + d_x, y + d_y)) circle.append((x - d_x, y - d_y)) circle.append((x + d_y, y - d_x)) circle.append((x - d_y, y + d_x)) d_x -= 1 d_y += 1 return circle def main(): areas = list() area_map = dict() for idx, point in enumerate(coords): if is_infinite_area(coords, idx): continue is_relevant = True radius = 0 area = 0 while is_relevant: # print(f'Radius {radius}') is_relevant = False for p2 in get_circle(point, radius): if idx == get_closest_idx(coords, p2): is_relevant = True area += 1 radius += 1 areas.append(area) print(f'Point {point}: Area: {area}') print('Largest Area', max(areas)) main()