Update day 19 solution
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2021-12-19 21:52:44 +01:00
parent 7e1e023caa
commit 0050e6dd76

View File

@@ -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)