import sys sys.path.append("../common") import aoc data = [[int(v) for v in l.split(",")] for l in aoc.data.split("\n")] minx = min(data, key = lambda x: x[0])[0] maxx = max(data, key = lambda x: x[0])[0] miny = min(data, key = lambda x: x[1])[1] maxy = max(data, key = lambda x: x[1])[1] def closest(x, y): mc = None md = None ad = None for i in range(len(data)): c = data[i] dist = abs(c[0] - x) + abs(c[1] - y) if md == None or dist < md: md = dist mc = i ad = None elif dist == md: ad = dist return mc, ad def combined_dist(x, y): dist = 0 for i in range(len(data)): c = data[i] dist += abs(c[0] - x) + abs(c[1] - y) return dist def solve1(args): areas = dict() for x in range(minx, maxx): for y in range(miny, maxy): mc, ad = closest(x, y) if ad == None: if mc not in areas: areas[mc] = 1 else: areas[mc] += 1 # remove outside points for i in range(len(data)): c = data[i] mc, ac = closest(minx, c[1]) if mc == i: areas.pop(i) continue mc, ac = closest(maxx, c[1]) if mc == i: areas.pop(i) continue mc, ac = closest(c[0], miny) if mc == i: areas.pop(i) continue mc, ac = closest(c[0], maxy) if mc == i: areas.pop(i) continue return max(areas.values()) def solve2(args): safezone = 0 for x in range(minx, maxx): for y in range(miny, maxy): dist = combined_dist(x,y) if dist < 10000: safezone += 1 return safezone aoc.run(solve1, solve2, sols=[3276, 38380])