1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#!/usr/bin/env python3
from functools import reduce
from re import findall
from copy import deepcopy
import sys
import numpy as np
from collections import defaultdict
from operator import mul
filename = sys.argv[1] if len(sys.argv) == 2 \
else "in/" + sys.argv[0].split('/')[-1].rstrip(".py") + ".pzl"
data = open(filename).read()
lines = data.rstrip('\n').split('\n')
counter = 0
points = []
for line in lines:
a = line.split(',')
x,y,z = [int(i) for i in a]
points.append((counter, x, y, z))
counter += 1
def dist(p0, p1):
_, x0, y0, z0 = p0
_, x1, y1, z1 = p1
return np.sqrt((x1 - x0)**2 + (y1 - y0)**2 + (z1 - z0)**2)
D = []
for i, p0 in enumerate(points):
for p1 in points[i+1:]:
d = dist(p0, p1)
D.append((d, p0, p1))
D.sort()
groups = [i for i in range(len(points))]
res1 = 0
res2 = 0
count = 0
for d, p0, p1 in D:
g0 = groups[p0[0]]
g1 = groups[p1[0]]
m = min(g0, g1)
for i in range(len(groups)):
if groups[i] == g0 or groups[i] == g1:
groups[i] = m
hist = defaultdict(int)
for i in groups:
hist[i] += 1
count += 1
if count == 1000:
res1 = reduce(mul, sorted(hist.values(), reverse=True)[:3])
if len(hist) == 1:
res2 = p0[1] * p1[1]
if res1 != 0 and res2 != 0:
break
print('res1:', res1)
print('res2:', res2)
|