| @@ -0,0 +1,19 @@ | |||
| from collections import Counter | |||
| from itertools import cycle | |||
| from math import copysign | |||
| sign = lambda n: int(copysign(1, n)) | |||
| points = {'flat': Counter(), 'diag': Counter()} | |||
| for line in text.splitlines(): | |||
| x1, y1, x2, y2 = [int(n) for n in re.findall(r'\d+', line)] | |||
| xs = [*range(x1, x2, sign(x2 - x1)), x2] | |||
| ys = [*range(y1, y2, sign(y2 - y1)), y2] | |||
| if len(xs) == 1: | |||
| points['flat'].update(zip(cycle(xs), ys)) | |||
| elif len(ys) == 1: | |||
| points['flat'].update(zip(xs, cycle(ys))) | |||
| else: | |||
| points['diag'].update(zip(xs, ys)) | |||
| ans1 = sum(v > 1 for v in (points['flat']).values()) | |||
| ans2 = sum(v > 1 for v in (points['flat'] + points['diag']).values()) | |||