···11+import fileinput
22+from utils import parse_nums
33+44+55+def dist(x, y):
66+ return sum(abs(a - b) for a, b in zip(x, y))
77+88+99+POINTS = [tuple(parse_nums(line)) for line in fileinput.input()]
1010+1111+1212+cliques = [[g] for g in POINTS]
1313+last_len = None
1414+1515+while True:
1616+ if len(cliques) == last_len:
1717+ break
1818+1919+ last_len = len(cliques)
2020+2121+ next_cliques = []
2222+ merged = set()
2323+2424+ for i in range(len(cliques)):
2525+ next_clique = cliques[i][:]
2626+2727+ if i in merged:
2828+ continue
2929+3030+ for j in range(i + 1, len(cliques)):
3131+ for dd in cliques[j]:
3232+ if (any(dist(cc, dd) <= 3 for cc in cliques[i])):
3333+ next_clique.extend(cliques[j])
3434+ merged.add(j)
3535+ break
3636+3737+ next_cliques.append(next_clique)
3838+3939+ cliques = next_cliques
4040+4141+print "Number of constellations:", len(cliques)