summary refs log tree commit diff
path: root/22.15
diff options
context:
space:
mode:
Diffstat (limited to '22.15')
-rw-r--r--22.15/main.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/22.15/main.py b/22.15/main.py
new file mode 100644
index 0000000..c366999
--- /dev/null
+++ b/22.15/main.py
@@ -0,0 +1,41 @@
+import sys, re
+# ranges are inclusive from both ends
+
+def range_intersect(a, b):
+	return a[0] <= b[0] <= a[1] or a[0] <= b[1] <= a[1] or b[0] <= a[0] <= b[1] or b[0] <= a[1] <= b[1]
+
+class RangeSet:
+	def __init__(self):
+		self.rs = []
+	def add(self, a, b):
+		for i in range(len(self.rs)):
+			r = self.rs[i]
+			if range_intersect(r, (a, b)):
+				a = min(a, r[0])
+				b = max(b, r[1])
+				self.rs[i] = None
+		self.rs = [r for r in self.rs if r]
+		self.rs.append((a, b))
+	def size(self):
+		s = 0
+		for r in self.rs:
+			s += r[1] - r[0] + 1
+		return s
+
+data = []
+for line in sys.stdin:
+	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 partOne(y):
+	r = RangeSet()
+	for l, m in zip(data, manhattan):
+		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))