This commit is contained in:
dave 2018-12-24 20:55:33 -05:00
parent ef01a6e885
commit 8bb9e32344
2 changed files with 1078 additions and 0 deletions

78
23/a.py Executable file
View File

@ -0,0 +1,78 @@
#!/usr/bin/env python3
import re
import pdb
RE_LINE = re.compile(r'pos=<(-?[0-9]+),(-?[0-9]+),(-?[0-9]+)>, r=([0-9]+)')
class Bot(object):
def __init__(self, x, y, z, r):
self.x = x
self.y = y
self.z = z
self.r = r
def __repr__(self):
return "<Bot ({},{},{}) r={}>".format(self.x, self.y, self.z, self.r)
def getdist(bot1, x, y, z):
return abs(bot1.x - x) + abs(bot1.y - y) + abs(bot1.z - z)
def main():
bots = []
with open("input.txt") as f:
for line in f.readlines():
bot = Bot(*[int(i) for i in RE_LINE.search(line).groups()])
bots.append(bot)
xs = [bot.x for bot in bots]
ys = [bot.y for bot in bots]
zs = [bot.z for bot in bots]
dist = 1
while dist < max(xs) - min(xs):
dist *= 2
while True:
target_count = 0
best = None
best_val = None
for x in range(min(xs), max(xs) + 1, dist):
for y in range(min(ys), max(ys) + 1, dist):
for z in range(min(zs), max(zs) + 1, dist):
count = 0
for bot in bots:
calc = getdist(bot, x, y, z)
if (calc - bot.r) / dist <= 0:
count += 1
if count > target_count:
target_count = count
best_val = abs(x) + abs(y) + abs(z)
best = (x, y, z)
elif count == target_count:
if not best_val or abs(x) + abs(y) + abs(z) < best_val:
best_val = abs(x) + abs(y) + abs(z)
best = (x, y, z)
if dist == 1:
print(best_val)
return
else:
xs = [best[0] - dist, best[0] + dist]
ys = [best[1] - dist, best[1] + dist]
zs = [best[2] - dist, best[2] + dist]
dist //= 2
if __name__ == '__main__':
main()

1000
23/input.txt Normal file

File diff suppressed because it is too large Load Diff