2018-12-06 - Chronal Coordinates
(original .ipynb)
testInput = (
(1, 1),
(1, 6),
(8, 3),
(3, 4),
(5, 5),
(8, 9)
)
realInput = (
(46, 246),
(349, 99),
(245, 65),
(241, 253),
(127, 128),
(295, 69),
(205, 74),
(167, 72),
(103, 186),
(101, 242),
(256, 75),
(122, 359),
(132, 318),
(163, 219),
(87, 309),
(283, 324),
(164, 342),
(255, 174),
(187, 305),
(145, 195),
(69, 266),
(137, 239),
(241, 232),
(97, 319),
(264, 347),
(256, 214),
(217, 47),
(109, 118),
(244, 120),
(132, 310),
(247, 309),
(185, 138),
(215, 323),
(184, 51),
(268, 188),
(54, 226),
(262, 347),
(206, 260),
(213, 175),
(302, 277),
(188, 275),
(352, 143),
(217, 49),
(296, 237),
(349, 339),
(179, 309),
(227, 329),
(226, 346),
(306, 238),
(48, 163)
)
# Part 1
# for the testInput the largest area is 17
def manhattan_distance(p, q):
px = p[0]
py = p[1]
qx = q[0]
qy = q[1]
return abs(px - qx) + abs(py - qy)
def initialiseProblem(pointLookup, problemInput):
# assign each point an ID and store in "points"
for point_id, p in enumerate(problemInput):
pointLookup[point_id] = p
max_coord = 0
for point in problemInput:
x = point[0]
y = point[1]
if x > max_coord:
max_coord = x
if y > max_coord:
max_coord = y
grid = []
for i in range(max_coord + 1):
grid.append([-1] * max_coord)
return grid
points = {}
g = initialiseProblem(points, realInput)
# calculate distances on grid
for y, col in enumerate(g):
for x, row in enumerate(col):
closest_id = -1
closest_distance = None
for point_id in points:
current_distance = manhattan_distance(points[point_id], (x, y))
if closest_distance is None or current_distance < closest_distance:
closest_distance = current_distance
closest_id = [ point_id ]
elif current_distance == closest_distance:
closest_id.append(current_distance)
g[y][x] = closest_id
# filter out those equally far away
for y, col in enumerate(g):
for x, row in enumerate(col):
if len(g[y][x]) > 1:
g[y][x] = None
else:
g[y][x] = g[y][x][0] # lol
# filter out those with infinite length - those at the edges
infinite_length_list = []
for y, col in enumerate(g):
for x, row in enumerate(col):
if x == 0 or y == 0 or x == len(col)-1 or y == len(col)-1:
infinite_length_list.append(g[y][x])
g[y][x] = None
infinite_length_set = set(infinite_length_list)
# now loop through the points again, count their sizes
sizes = {}
for y, col in enumerate(g):
for x, row in enumerate(col):
point_id = g[y][x]
if point_id in infinite_length_set:
continue
if point_id in sizes:
sizes[point_id] += 1
else:
sizes[point_id] = 1
sorted([ sizes[point_id] for point_id in sizes ], key= lambda n: -n )[0]
3449
# Part 2
# for test input the size of region is 16
points = {}
g = initialiseProblem(points, realInput)
# calculate distances on grid
total_points = 0
for y, col in enumerate(g):
for x, row in enumerate(col):
total_distance = 0
for point_id in points:
total_distance += manhattan_distance(points[point_id], (x, y))
if total_distance < 10000:
total_points += 1
print(total_points)
44868