#!/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)