Б
БАЛЛОДОЖИМАЛКА | ПРОФИМАТИКА
13.06.2026 16:22 · 👁 3.6K
```python
#####5
def dist(a, b):
x1, y1, z1 = a # распаковываем координаты и характеристику первой точки
x2, y2, z2 = b # распаковываем координаты и характеристику второй точки
return ((x2-x1)**2 + (y2-y1)**2)**0.5
# евклидово расстояние между точками (используем только x, y)
def centr(k):
s = []
for i in k:
a = sum(dist(i, j) for j in k) # суммарное расстояние от точки i до всех остальных точек кластера
s.append([a, i]) # сохраняем пару [сумма расстояний, точка]
return min(s)[1] # центр — точка с минимальной суммой расстояний
# ===== Файл A =====
a = open("C:\\Users\\ACER\\Desktop\\БДЖ Вебинар 13.06.2026 (№27)\\5A.txt")
k1, k2 = [], [] # два кластера
A = [] # белые гиганты класса A III (для поиска ближайшего к центру кластера 2)
c2 = [38.970620418312336, 18.851501568814687, 'B9IV']
# временно заданный центр кластера 2 (предварительно вычисленный заранее)
for i in a:
x, y, z = i.replace(',', '.').split() # читаем строку, заменяем запятую на точку
x, y = float(x), float(y) # переводим координаты в числа
if x < 25: k1.append([x, y, z]) # разбиваем точки на два кластера по координате x
else: k2.append([x, y, z])
if z[0] == 'A' and z[2:] == 'III': # ищем звёзды класса A, светимости III (белые гиганты)
A.append([dist(c2, [x, y, z]), [x, y, z]])
# сохраняем расстояние от такой звезды до центра кластера 2
c1, c2 = centr(k1), centr(k2) # пересчитываем настоящие центры обоих кластеров
# print(len(k1), len(k2)) #250 229 — проверка количества точек в кластерах
A1 = int(min(A)[1][0] * 10000) # A1 — абсцисса (×10000) ближайшего к центру белого гиганта
A2 = int(min(A)[1][1] * 10000) # A2 — ордината (×10000) того же белого гиганта
print(A1, A2)
# ===== Файл B =====
def m(k):
for i in k:
a = max(dist(i, j) for j in k if dist(i, j) > 0)
# максимальное расстояние от точки i до любой другой точки в группе (исключая саму себя)
return a # возвращается значение для ПОСЛЕДНЕЙ точки в k (особенность реализации)
a = open("C:\\Users\\ACER\\Desktop\\БДЖ Вебинар 13.06.2026 (№27)\\5B.txt")
k1, k2, k3 = [], [], [] # три кластера по значению y
g1, g2, g3 = [], [], [] # жёлтые карлики (G, V) в каждом кластере
m1, m2, m3 = 0, 0, 0 # счётчики красных сверхгигантов (M, I) в каждом кластере
for i in a:
x, y, z = i.replace(',', '.').split()
x, y = float(x), float(y)
if y > 14: # точки с y > 14 — кластер 1
k1.append([x, y, z])
if z[0] == 'G' and z[2:] == 'V': g1.append([x, y, z]) # жёлтый карлик
if z[0] == 'M' and z[2:] == 'I': m1 += 1 # красный сверхгигант
elif y < 8: # точки с y < 8 — кластер 3
k3.append([x, y, z])
if z[0] == 'G' and z[2:] == 'V': g3.append([x, y, z])
if z[0] == 'M' and z[2:] == 'I': m3 += 1
else: # остальные — кластер 2
k2.append([x, y, z])
if z[0] == 'G' and z[2:] == 'V': g2.append([x, y, z])
if z[0] == 'M' and z[2:] == 'I': m2 += 1
# print(m1, m2, m3) #9 12 8 — проверка количества красных сверхгигантов в каждом кластере
c1, c2, c3 = centr(k1), centr(k2), centr(k3) # центры всех трёх кластеров
B1 = int(dist(c2, c3) * 10000)
# B1 — расстояние между центрами кластеров с наибольшим и наименьшим количеством
# красных сверхгигантов (×10000)
# print(len(g1), len(g2), len(g3)) # 5 8 11 — проверка количества жёлтых карликов в каждом кластере
B2 = int(max(m(g1), m(g2), m(g3)) * 10000)
# B2 — максимальное расстояние между двумя жёлтыми карликами, находящимися в одном кластере (×10000)
print(B1, B2)
```