diff --git a/22.15/main.py b/22.15/main.py
index c366999..9b21981 100644
--- a/22.15/main.py
+++ b/22.15/main.py
@@ -1,4 +1,4 @@
-import sys, re
+import sys, re, itertools
# ranges are inclusive from both ends
def range_intersect(a, b):
@@ -24,18 +24,54 @@ class RangeSet:
data = []
for line in sys.stdin:
- data.append([int(n) for n in re.findall('\d+', line)])
+ data.append([int(n) for n in re.findall('-?\d+', line)])
-manhattan = [abs(a[0] - a[2]) + abs(a[1] - a[3]) for a in data]
+def manhattan(a):
+ return abs(a[0] - a[2]) + abs(a[1] - a[3])
def partOne(y):
r = RangeSet()
- for l, m in zip(data, manhattan):
+ for l in data:
+ m = manhattan(l)
w = m - abs(l[1] - y)
if w < 0: continue
- #print(l, w, l[0] - w, l[0] + w)
r.add(l[0] - w, l[0] + w)
beacons = set([(a[2], a[3]) for a in data if a[3] == y])
return r.size() - len(beacons)
-print(partOne(2000000))
+def vis(size):
+ s = ''
+ for y in range(size):
+ for x in range(size):
+ c = ' '
+ for l in data:
+ m = abs(l[0] - l[2]) + abs(l[1] - l[3])
+ if abs(l[0] - x) + abs(l[1] - y) <= m:
+ c = '#'
+ break
+ if (x, y) in [(a[0], a[1]) for a in data]:
+ c = 'S'
+ if (x, y) in [(a[2], a[3]) for a in data]:
+ c = 'B'
+ s += c
+ s += '\n'
+ return s
+
+def partTwo():
+ for y in range(4000000):
+ if y % 4000 == 0: print(y / 40000)
+ r = RangeSet()
+ for l in data:
+ m = manhattan(l)
+ w = m - abs(l[1] - y)
+ if w < 0: continue
+ r.add(l[0] - w, l[0] + w)
+ l = len(r.rs)
+ if l == 0: break
+ if l != 1:
+ print(r.rs, y)
+ x = r.rs[0][1] + 1
+ return 4000000 * x + y
+
+#print(partOne(2000000))
+print(partTwo())
|