master
Tom Weber 2 years ago
parent 72ae9ccb77
commit 2f0556d7a5

@ -0,0 +1,14 @@
Sensor at x=2, y=18: closest beacon is at x=-2, y=15
Sensor at x=9, y=16: closest beacon is at x=10, y=16
Sensor at x=13, y=2: closest beacon is at x=15, y=3
Sensor at x=12, y=14: closest beacon is at x=10, y=16
Sensor at x=10, y=20: closest beacon is at x=10, y=16
Sensor at x=14, y=17: closest beacon is at x=10, y=16
Sensor at x=8, y=7: closest beacon is at x=2, y=10
Sensor at x=2, y=0: closest beacon is at x=2, y=10
Sensor at x=0, y=11: closest beacon is at x=2, y=10
Sensor at x=20, y=14: closest beacon is at x=25, y=17
Sensor at x=17, y=20: closest beacon is at x=21, y=22
Sensor at x=16, y=7: closest beacon is at x=15, y=3
Sensor at x=14, y=3: closest beacon is at x=15, y=3
Sensor at x=20, y=1: closest beacon is at x=15, y=3

@ -0,0 +1,37 @@
lines = open("input.txt", "r").read().splitlines()
def parse_lines(lines: list) -> (set, set):
sensors = []
beacons = []
for line in lines:
_, _, sx, sy, _, _, _, _, bx, by = line.split(" ")
sensors.append([int(sx.split("=")[1][:-1]), int(sy.split("=")[1][:-1])])
beacons.append([int(bx.split("=")[1][:-1]), int(by.split("=")[1])])
return sensors, beacons
def manhatten(a, b):
return abs(a[0] - b[0]) + abs(a[1] - b[1])
critical = 2000000
sensors, beacons = parse_lines(lines)
taken = set()
critical_beacons = set(tuple(x) for x in beacons if x[1] == critical)
print(critical_beacons)
for i in range(len(sensors)):
print(i)
s = sensors[i]
b = beacons[i]
d = manhatten(s, b)
min_y, max_y = s[1] - d, s[1] + d
if min_y <= critical <= max_y:
critical_d = abs(s[1] - critical)
critical_reach = d - critical_d
taken.update(
(x, critical)
for x in range(s[0] - critical_reach, s[0] + critical_reach + 1)
)
print(len(taken) - len(critical_beacons))

@ -0,0 +1,68 @@
lines = open("input.txt", "r").read().splitlines()
def parse_lines(lines: list) -> (set, set):
sensors = []
beacons = []
for line in lines:
_, _, sx, sy, _, _, _, _, bx, by = line.split(" ")
sensors.append((int(sx.split("=")[1][:-1]), int(sy.split("=")[1][:-1])))
beacons.append((int(bx.split("=")[1][:-1]), int(by.split("=")[1])))
return sensors, beacons
def manhatten(a, b):
return abs(a[0] - b[0]) + abs(a[1] - b[1])
def build_search_space(sensors, beacons):
space = set()
for sensor, beacon in zip(sensors, beacons):
space.update(sensor_diamond(sensor, beacon))
return space
def sensor_diamond(sensor, beacon):
points = set()
d = manhatten(sensor, beacon)
xr = range(d + 2)
yr = xr[::-1]
xrneg = range(0, (d + 2) * -1, -1)
yrneg = xrneg[::-1]
for x, y, xneg, yneg in zip(xr, yr, xrneg, yrneg):
points.add((sensor[0] + x, sensor[1] + y))
points.add((sensor[0] + xneg, sensor[1] + y))
points.add((sensor[0] + x, sensor[1] + yneg))
points.add((sensor[0] + xneg, sensor[1] + yneg))
return points
def search_candidates(sensors, beacons, space):
candidates = set()
counter = 0
for point in space:
is_candidate = False
if x_min <= point[0] <= x_max and y_min <= point[1] <= y_max:
is_candidate = True
for sensor, beacon in zip(sensors, beacons):
if manhatten(sensor, point) <= manhatten(sensor, beacon):
is_candidate = False
if is_candidate:
print("candidate found")
candidates.add(point)
counter += 1
if counter % 100000 == 0:
print(f"{counter} points searched")
return candidates
x_min, x_max = 0, 4000000
y_min, y_max = 0, 4000000
sensors, beacons = parse_lines(lines)
space = build_search_space(sensors, beacons)
print("space set up")
candidates = search_candidates(sensors, beacons, space)
print(candidates)
x, y = candidates.pop()
print(x * 4000000 + y)

@ -0,0 +1,33 @@
Sensor at x=2302110, y=2237242: closest beacon is at x=2348729, y=1239977
Sensor at x=47903, y=2473047: closest beacon is at x=-432198, y=2000000
Sensor at x=2363579, y=1547888: closest beacon is at x=2348729, y=1239977
Sensor at x=3619841, y=520506: closest beacon is at x=2348729, y=1239977
Sensor at x=3941908, y=3526118: closest beacon is at x=3772294, y=3485243
Sensor at x=3206, y=1564595: closest beacon is at x=-432198, y=2000000
Sensor at x=3123411, y=3392077: closest beacon is at x=2977835, y=3592946
Sensor at x=3279053, y=3984688: closest beacon is at x=2977835, y=3592946
Sensor at x=2968162, y=3938490: closest beacon is at x=2977835, y=3592946
Sensor at x=1772120, y=2862246: closest beacon is at x=2017966, y=3158243
Sensor at x=3283241, y=2619168: closest beacon is at x=3172577, y=2521434
Sensor at x=2471642, y=3890150: closest beacon is at x=2977835, y=3592946
Sensor at x=3163348, y=3743489: closest beacon is at x=2977835, y=3592946
Sensor at x=2933313, y=2919047: closest beacon is at x=3172577, y=2521434
Sensor at x=2780640, y=3629927: closest beacon is at x=2977835, y=3592946
Sensor at x=3986978, y=2079918: closest beacon is at x=3998497, y=2812428
Sensor at x=315464, y=370694: closest beacon is at x=-550536, y=260566
Sensor at x=3957316, y=3968366: closest beacon is at x=3772294, y=3485243
Sensor at x=2118533, y=1074658: closest beacon is at x=2348729, y=1239977
Sensor at x=3494855, y=3378533: closest beacon is at x=3772294, y=3485243
Sensor at x=2575727, y=210553: closest beacon is at x=2348729, y=1239977
Sensor at x=3999990, y=2813525: closest beacon is at x=3998497, y=2812428
Sensor at x=3658837, y=3026912: closest beacon is at x=3998497, y=2812428
Sensor at x=1551619, y=1701155: closest beacon is at x=2348729, y=1239977
Sensor at x=2625855, y=3330422: closest beacon is at x=2977835, y=3592946
Sensor at x=3476946, y=2445098: closest beacon is at x=3172577, y=2521434
Sensor at x=2915568, y=1714113: closest beacon is at x=2348729, y=1239977
Sensor at x=729668, y=3723377: closest beacon is at x=-997494, y=3617758
Sensor at x=3631681, y=3801747: closest beacon is at x=3772294, y=3485243
Sensor at x=2270816, y=3197807: closest beacon is at x=2017966, y=3158243
Sensor at x=3999999, y=2810929: closest beacon is at x=3998497, y=2812428
Sensor at x=3978805, y=3296024: closest beacon is at x=3772294, y=3485243
Sensor at x=1054910, y=811769: closest beacon is at x=2348729, y=1239977
Loading…
Cancel
Save