|
|
@@ -0,0 +1,28 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+import sys
|
|
|
+from collections import defaultdict
|
|
|
+from itertools import repeat
|
|
|
+
|
|
|
+def parse(line):
|
|
|
+ (x1, y1), (x2, y2) = (part.split(',') for part in line.split(' -> '))
|
|
|
+ return int(x1), int(y1), int(x2), int(y2)
|
|
|
+
|
|
|
+def coords(a, b, c, d, diagonal):
|
|
|
+ if a == b:
|
|
|
+ yield from repeat(a, abs(d - c) + 1)
|
|
|
+ elif diagonal or c == d:
|
|
|
+ delta = -1 if a > b else 1
|
|
|
+ yield from range(a, b + delta, delta)
|
|
|
+
|
|
|
+def overlaps(lines, diagonal):
|
|
|
+ grid = defaultdict(int)
|
|
|
+ for x1, y1, x2, y2 in lines:
|
|
|
+ allx = coords(x1, x2, y1, y2, diagonal)
|
|
|
+ ally = coords(y1, y2, x1, x2, diagonal)
|
|
|
+ for x, y in zip(allx, ally):
|
|
|
+ grid[(x, y)] += 1
|
|
|
+ return sum(n > 1 for n in grid.values())
|
|
|
+
|
|
|
+lines = list(map(parse, sys.stdin))
|
|
|
+print(overlaps(lines, False))
|
|
|
+print(overlaps(lines, True))
|