Статья Автор: Деникина Н.В., Деникин А.В.

Таблица по строкам — повторы в строке

Вторая половина условий — про повторы

Вот демоверсия 2025 года:

«в строке только одно число повторяется трижды, остальные числа различны; квадрат суммы всех повторяющихся чисел строки больше квадрата суммы всех её неповторяющихся чисел»

Звучит громоздко. А решается просто, если сделать одно движение: разложить строку на две кучки — повторяющиеся числа отдельно, одиночные отдельно.

Для этого есть удобная запись — фильтрация списка. row.count(x) говорит, сколько раз число x встречается в строке. Значит:

povtor = [x for x in row if row.count(x) > 1]
odin = [x for x in row if row.count(x) == 1]

Читается по-русски: «взять каждый x из строки, если он встречается больше одного раза». Всё, две кучки готовы.

▶ Запусти и посмотри на первые восемь строк файла.



Что получилось

[7, 7, 7] [10, 37, 33]
[] [12, 25, 29, 20, 30, 14]
[32, 32, 17, 17] [38, 35]
[2, 2, 32, 32] [5, 11]
[27, 27, 27] [25, 37, 34]
[23, 23] [29, 15, 19, 13]
[17, 17, 17] [16, 37, 19]
[] [2, 33, 26, 27, 12, 23]

Разбери глазами. В первой строке три семёрки ушли влево, остальные три числа вправо — это и есть «одно число трижды, остальные различны». Во второй строке левая кучка пуста: все числа разные. В третьей слева четыре числа — там две пары, а не одна тройка.

Отсюда условие демоверсии переводится дословно:

len(povtor) == 3 and len(odin) == 3

Три числа в левой кучке — значит повторяется ровно одно число и ровно трижды. Три в правой — остальные различны.

▶ Запусти полное решение задачи из демоверсии.



Что получилось

12

12 строк из 100. Заметь: строк нужной формы всего 43, а второе условие про квадраты отсеяло ещё больше половины.

И ещё: sum(povtor) ** 2 — это квадрат суммы, а не сумма квадратов. Перепутать легко, а ответ получится другой.


Тот же приём в таблице

Кучек в редакторе не сделать, но повторы считаются так же — через СЧЁТЕСЛИ. В служебные столбцы кладём для каждого числа, сколько раз оно встречается в своей строке.

G1=СЧЁТЕСЛИ($A1:$F1;A1)ABCDEFGHIJKLM110737337713113321225292030141111113383232173517122212422532113222121252527372734271313136232915231913211211доллары закрепляют столбцы диапазона: формулу можно тянуть и вправо до L1, и вниз

Получилась строка счётчиков: под каждым числом — сколько раз оно встретилось. Дальше условие читается прямо по ней:

одно число трижды, остальные разные:
=И(СЧЁТЕСЛИ(G1:L1;3)=3; СЧЁТЕСЛИ(G1:L1;1)=3)

Тройка в счётчиках стоит под каждым из трёх одинаковых чисел — поэтому троек ровно три, а единиц тоже три.


Что делает [x for x in row if row.count(x) > 1]?


В строке получилось povtor = [32, 32, 17, 17]. Что это значит?


Чем sum(povtor) ** 2 отличается от суммы квадратов?

Печать