day 6
This commit is contained in:
parent
8dc1a047a7
commit
e4d4c533f1
|
@ -0,0 +1,89 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
|
def getdist(pa, pb):
|
||||||
|
return abs(pa[0] - pb[0]) + abs(pa[1] - pb[1])
|
||||||
|
|
||||||
|
|
||||||
|
def fullrange(s, e):
|
||||||
|
return range(s, e + 1)
|
||||||
|
|
||||||
|
|
||||||
|
def get_closest(point, allpoints):
|
||||||
|
"""
|
||||||
|
Returns the index of the point from allpoints closest to the passed point.
|
||||||
|
Returns None if two points are equidistant.
|
||||||
|
"""
|
||||||
|
best_index = None
|
||||||
|
best_distance = 999999999
|
||||||
|
is_dupe = False
|
||||||
|
|
||||||
|
for index, p in enumerate(allpoints):
|
||||||
|
# if p == point:
|
||||||
|
# continue
|
||||||
|
dist = getdist(point, p)
|
||||||
|
if dist <= best_distance:
|
||||||
|
if dist == best_distance:
|
||||||
|
is_dupe = True
|
||||||
|
else:
|
||||||
|
is_dupe = False
|
||||||
|
best_distance = dist
|
||||||
|
best_index = index
|
||||||
|
|
||||||
|
if is_dupe:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return best_index
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
coords = []
|
||||||
|
|
||||||
|
with open("input.txt") as f:
|
||||||
|
for line in f.readlines():
|
||||||
|
a, b = line.split(", ")
|
||||||
|
coords.append((int(a), int(b)))
|
||||||
|
|
||||||
|
# bounding box is be +x+y, -x,-y corners
|
||||||
|
xcoords = [i[0] for i in coords]
|
||||||
|
ycoords = [i[1] for i in coords]
|
||||||
|
bufsize = 1
|
||||||
|
bbox = (
|
||||||
|
(
|
||||||
|
max(xcoords) + bufsize,
|
||||||
|
max(ycoords) + bufsize
|
||||||
|
),
|
||||||
|
(
|
||||||
|
min(xcoords) - bufsize,
|
||||||
|
min(ycoords) - bufsize
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# point ids (their index in the coords list) mapped to their size count
|
||||||
|
fields = {x: 0 for x in range(0, len(coords))}
|
||||||
|
infinte_fields = set()
|
||||||
|
for y in fullrange(bbox[1][1], bbox[0][1]):
|
||||||
|
for x in fullrange(bbox[1][0], bbox[0][0]):
|
||||||
|
closest = get_closest((x, y), coords)
|
||||||
|
if closest is not None:
|
||||||
|
fields[closest] += 1
|
||||||
|
|
||||||
|
# if touching an edge of the bounding box
|
||||||
|
if x == bbox[1][0] or x == bbox[0][0] or y == bbox[1][1] or y == bbox[0][1]:
|
||||||
|
infinte_fields.update([closest])
|
||||||
|
|
||||||
|
biggest_fieldid = None
|
||||||
|
biggest_field_size = 0
|
||||||
|
|
||||||
|
for pointid, size in fields.items():
|
||||||
|
if pointid not in infinte_fields:
|
||||||
|
if size > biggest_field_size:
|
||||||
|
biggest_field_size = size
|
||||||
|
biggest_fieldid = pointid
|
||||||
|
|
||||||
|
print("biggest field id:", biggest_fieldid)
|
||||||
|
print("biggest field size:", biggest_field_size)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -0,0 +1,56 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
|
from a import getdist, fullrange
|
||||||
|
|
||||||
|
|
||||||
|
def point_vaild(point, allpoints, units):
|
||||||
|
"""
|
||||||
|
Returns True if the point is no more than units away from all points in allpoints (as in the sum of all dists)
|
||||||
|
"""
|
||||||
|
|
||||||
|
for p in allpoints:
|
||||||
|
units -= getdist(point, p)
|
||||||
|
if units <= 0:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
coords = []
|
||||||
|
maxdist = 10000
|
||||||
|
|
||||||
|
with open("input.txt") as f:
|
||||||
|
for line in f.readlines():
|
||||||
|
a, b = line.split(", ")
|
||||||
|
coords.append((int(a), int(b)))
|
||||||
|
|
||||||
|
# bounding box is be +x+y, -x,-y corners
|
||||||
|
# TBD this probably breaks with abusive input
|
||||||
|
xcoords = [i[0] for i in coords]
|
||||||
|
ycoords = [i[1] for i in coords]
|
||||||
|
bufsize = 0
|
||||||
|
bbox = (
|
||||||
|
(
|
||||||
|
max(xcoords) + bufsize,
|
||||||
|
max(ycoords) + bufsize
|
||||||
|
),
|
||||||
|
(
|
||||||
|
min(xcoords) - bufsize,
|
||||||
|
min(ycoords) - bufsize
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
print("bbox:", bbox)
|
||||||
|
|
||||||
|
valids = 0
|
||||||
|
for y in fullrange(bbox[1][1], bbox[0][1]):
|
||||||
|
for x in fullrange(bbox[1][0], bbox[0][0]):
|
||||||
|
if point_vaild((x, y), coords, maxdist):
|
||||||
|
valids += 1
|
||||||
|
|
||||||
|
print(valids)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -0,0 +1,50 @@
|
||||||
|
305, 349
|
||||||
|
315, 193
|
||||||
|
154, 62
|
||||||
|
246, 310
|
||||||
|
145, 283
|
||||||
|
260, 324
|
||||||
|
342, 79
|
||||||
|
321, 353
|
||||||
|
40, 242
|
||||||
|
351, 353
|
||||||
|
337, 297
|
||||||
|
174, 194
|
||||||
|
251, 160
|
||||||
|
314, 195
|
||||||
|
114, 81
|
||||||
|
204, 246
|
||||||
|
203, 169
|
||||||
|
203, 296
|
||||||
|
60, 276
|
||||||
|
201, 47
|
||||||
|
206, 96
|
||||||
|
243, 46
|
||||||
|
295, 304
|
||||||
|
319, 80
|
||||||
|
213, 330
|
||||||
|
337, 255
|
||||||
|
40, 262
|
||||||
|
302, 150
|
||||||
|
147, 349
|
||||||
|
317, 240
|
||||||
|
96, 315
|
||||||
|
133, 305
|
||||||
|
320, 348
|
||||||
|
210, 300
|
||||||
|
266, 216
|
||||||
|
223, 319
|
||||||
|
207, 152
|
||||||
|
127, 214
|
||||||
|
312, 245
|
||||||
|
49, 329
|
||||||
|
211, 84
|
||||||
|
129, 276
|
||||||
|
247, 143
|
||||||
|
208, 235
|
||||||
|
271, 126
|
||||||
|
124, 211
|
||||||
|
144, 184
|
||||||
|
54, 88
|
||||||
|
354, 300
|
||||||
|
148, 85
|
Loading…
Reference in New Issue