Update day 19 solution
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -11,8 +11,7 @@ def parse(input):
|
|||||||
s = []
|
s = []
|
||||||
continue
|
continue
|
||||||
if len(line):
|
if len(line):
|
||||||
b = tuple([int(x) for x in line.split(',')])
|
s.append(tuple([int(x) for x in line.split(',')]))
|
||||||
s.append(b)
|
|
||||||
else:
|
else:
|
||||||
scanners.append(s)
|
scanners.append(s)
|
||||||
if len(s):
|
if len(s):
|
||||||
@@ -21,9 +20,7 @@ def parse(input):
|
|||||||
|
|
||||||
|
|
||||||
def calc_distances(s):
|
def calc_distances(s):
|
||||||
d = []
|
d = [set() for _ in s]
|
||||||
for _ in s:
|
|
||||||
d.append(set())
|
|
||||||
for i in range(len(s)):
|
for i in range(len(s)):
|
||||||
for j in range(i+1, len(s)):
|
for j in range(i+1, len(s)):
|
||||||
dist = 0
|
dist = 0
|
||||||
@@ -112,15 +109,14 @@ def transform(scanners, idx, done=[]):
|
|||||||
for i in range(len(scanners[n]['beacons'])):
|
for i in range(len(scanners[n]['beacons'])):
|
||||||
(x, y, z) = scanners[n]['beacons'][i]
|
(x, y, z) = scanners[n]['beacons'][i]
|
||||||
scanners[n]['beacons'][i] = eval(transform_func)
|
scanners[n]['beacons'][i] = eval(transform_func)
|
||||||
(xo, yo, zo) = scanners[idx]['origin']
|
|
||||||
(x0, y0, z0) = scanners[idx]['beacons'][overlapping[0][0]]
|
(x0, y0, z0) = scanners[idx]['beacons'][overlapping[0][0]]
|
||||||
(x1, y1, z1) = scanners[n]['beacons'][overlapping[0][1]]
|
(x1, y1, z1) = scanners[n]['beacons'][overlapping[0][1]]
|
||||||
scanners[n]['origin'] = (xo + x0 - x1, yo + y0 - y1, zo + z0 - z1)
|
(xo, yo, zo) = (x0 - x1, y0 - y1, z0 - z1)
|
||||||
(xo, yo, zo) = scanners[n]['origin']
|
scanners[n]['origin'] = (xo, yo, zo)
|
||||||
transform(scanners, n, done)
|
|
||||||
for i in range(len(scanners[n]['beacons'])):
|
for i in range(len(scanners[n]['beacons'])):
|
||||||
(x, y, z) = scanners[n]['beacons'][i]
|
(x, y, z) = scanners[n]['beacons'][i]
|
||||||
scanners[n]['beacons'][i] = (x + xo, y + yo, z + zo)
|
scanners[n]['beacons'][i] = (x + xo, y + yo, z + zo)
|
||||||
|
transform(scanners, n, done)
|
||||||
|
|
||||||
|
|
||||||
def solve(input):
|
def solve(input):
|
||||||
@@ -129,12 +125,11 @@ def solve(input):
|
|||||||
beacons = parse(input)
|
beacons = parse(input)
|
||||||
scanners = []
|
scanners = []
|
||||||
for b in beacons:
|
for b in beacons:
|
||||||
s = {}
|
scanners.append({
|
||||||
s['beacons'] = b
|
'beacons': b,
|
||||||
s['metrics'] = calc_distances(b)
|
'metrics': calc_distances(b),
|
||||||
s['origin'] = (0, 0, 0)
|
'origin': (0, 0, 0),
|
||||||
s['overlapping'] = set()
|
'overlapping': set()})
|
||||||
scanners.append(s)
|
|
||||||
for i in range(len(scanners)):
|
for i in range(len(scanners)):
|
||||||
for j in range(i + 1, len(scanners)):
|
for j in range(i + 1, len(scanners)):
|
||||||
num = num_overlapping(
|
num = num_overlapping(
|
||||||
@@ -148,10 +143,10 @@ def solve(input):
|
|||||||
for b in s['beacons']:
|
for b in s['beacons']:
|
||||||
m.add(b)
|
m.add(b)
|
||||||
result_p1 = len(m)
|
result_p1 = len(m)
|
||||||
for i in range(len(scanners)):
|
for i, si in enumerate(scanners):
|
||||||
(xi, yi, zi) = scanners[i]['origin']
|
(xi, yi, zi) = si['origin']
|
||||||
for j in range(i + 1, len(scanners)):
|
for j, sj in enumerate(scanners[i + 1:]):
|
||||||
(xj, yj, zj) = scanners[j]['origin']
|
(xj, yj, zj) = sj['origin']
|
||||||
md = abs(xi - xj) + abs(yi - yj) + abs(zi - zj)
|
md = abs(xi - xj) + abs(yi - yj) + abs(zi - zj)
|
||||||
result_p2 = max(result_p2, md)
|
result_p2 = max(result_p2, md)
|
||||||
print("Part 1 result:", result_p1)
|
print("Part 1 result:", result_p1)
|
||||||
|
|||||||
Reference in New Issue
Block a user