1. Введение

В задании 9 нужно обработать электронную таблицу. Каждую строку таблицы проверяют на несколько условий, а затем считают количество подходящих строк.

Главная трудность — точно перевести текст условия в проверки Python: какие числа считаются повторяющимися, сколько их должно быть и какое число нужно сравнить с ними.

Условие примера

Откройте файл электронной таблицы, содержащей в каждой строке семь натуральных чисел.

Определите количество строк таблицы, для чисел которых выполнены оба условия:

  • в строке есть ровно три числа, каждое из которых повторяется дважды, и одно число без повторений;
  • среднее арифметическое минимального и максимального среди повторяющихся чисел строки меньше неповторяющегося числа.

В ответе запишите только число.

2. Теория и разбор данных

Как устроен файл

Для Python файл можно представить как набор текстовых строк.

Одна строка файла соответствует одной строке таблицы. Внутри неё семь чисел разделены пробелами или знаками табуляции. В конце обычно находится символ перевода строки \n.

Идея решения

Читаем файл по одной строке, превращаем строку в список чисел, проверяем оба условия и увеличиваем счётчик.

Важно о формате

Код с open() читает текстовый файл. Если данные открываются как таблица, сохраните их в текстовом формате. Файл .xlsx обычным open() по строкам не читают.

1

Что делает open()

open('9')

открывает файл с именем 9 и возвращает файловый объект.

Цикл:

for i in open('9'):

берёт из него одну строку за другой. Переменная i каждый раз содержит текст одной строки.

Важно:

  • файл должен лежать в той же папке, где запускается программа, или нужно указать правильный путь;
  • имя и расширение должны совпадать: если файл называется 9.txt, нужно написать open('9.txt');
  • в этой задаче в файле только цифры и разделители, поэтому отдельно указывать кодировку не нужно.

split() и генераторы списков

i.split()

делит строку i по пробелам, табуляции и переводу строки.

Результатом будет список строк str, например:

['14', '8', '14', '21', '8', '35', '21']

Поэтому нужно применить int(j) к каждому фрагменту:

a = [int(j) for j in i.split()]

После этого получим список целых чисел:

[14, 8, 14, 21, 8, 35, 21]
1

Запись:

[int(j) for j in i.split()]

называется генератором списков, правильнее — списковым включением.

Она создаёт новый список, последовательно обрабатывая все элементы после for.

То же самое обычным циклом:

a = []

for j in i.split():
    a.append(int(j))

Генератор списка позволяет записать это короче:

a = [int(j) for j in i.split()]

3. Код на Python и построчный разбор

Полное решение

k = 0

for i in open('9'):
    a = [int(j) for j in i.split()]

    pov_2 = [j for j in a if a.count(j) == 2]
    pov_1 = [j for j in a if a.count(j) == 1]

    if len(pov_2) == 6 and len(pov_1) == 1:
        if (min(pov_2) + max(pov_2)) / 2 < pov_1[0]:
            k += 1

print(k)

Ответ: 3582

Что делает каждая строка

1. Создаём счётчик

k = 0

Создаём счётчик подходящих строк. Пока ни одна строка не проверена, счётчик равен нулю.

2. Перебираем файл

for i in open('9'):

Открываем файл и перебираем его построчно.

На каждой итерации i — это одна строка файла.

3. Превращаем строку в список чисел

a = [int(j) for j in i.split()]

Разделяем строку на семь фрагментов и превращаем каждый из них в int.

Получаем список из семи целых чисел.

4. Находим числа, которые встречаются дважды

pov_2 = [j for j in a if a.count(j) == 2]

Для каждого элемента j проверяем:

a.count(j) == 2

То есть считаем, сколько раз число j встречается во всей строке.

Если ровно два раза, это число добавляется в pov_2.

5. Находим неповторяющееся число

pov_1 = [j for j in a if a.count(j) == 1]

Сохраняем число, которое встречается только один раз.

6. Проверяем структуру повторений

if len(pov_2) == 6 and len(pov_1) == 1:

Нам нужны:

  • три разных числа, встречающихся по два раза;
  • одно число, встречающееся один раз.

Поэтому в pov_2 должно быть 6 элементов, а в pov_11.

7. Проверяем второе условие

if (min(pov_2) + max(pov_2)) / 2 < pov_1[0]:

Находим:

  • минимальное повторяющееся число;
  • максимальное повторяющееся число;
  • их среднее арифметическое.

После этого сравниваем результат с единственным неповторяющимся числом.

8. Увеличиваем счётчик

k += 1

Счётчик увеличивается только тогда, когда выполнены оба условия.

В конце:

print(k)

выводит итоговое количество подходящих строк.

1

Почему повторы дают длину 6

Важно отличать разные значения от их вхождений.

Например, дана строка:

14 8 14 21 8 35 21

Число 14 встречается дважды, поэтому проверку:

a.count(14) == 2

проходят оба числа 14.

То же происходит с 8 и 21.

Поэтому:

pov_2 = [14, 8, 14, 21, 8, 21]

Получается:

3 разных значения × 2 вхождения = 6 элементов

Самих различных повторяющихся значений при этом три.

Дубликаты не мешают функциям min() и max(): минимум и максимум от повторов не изменяются.

4. Практика

Ниже — пять типовых задач. Перед каждым решением отмечен главный нюанс, который нужно перевести из условия в проверку Python.

Не потеряй скобки

Среднее двух чисел считается так:

(min(pov_2) + max(pov_2)) / 2

Если убрать скобки, Python сначала разделит только max(pov_2), и получится другое выражение.

Практика 1. Первая подходящая строка

Источник: Основная волна 2026 (день 1)

Откройте файл электронной таблицы, содержащей в каждой строке пять натуральных чисел.

Определите сумму чисел в строке таблицы с наименьшим номером, содержащей числа, для которых выполнены оба условия:

  • в строке все числа различны;
  • удвоенная сумма максимального и минимального чисел строки больше суммы оставшихся трёх её чисел.

В ответе запишите только число.

Нюанс задачи

Нужно найти строку с наименьшим номером, поэтому n увеличивается для каждой прочитанной строки.

Как только оба условия выполнены, печатаем номер и сумму, а затем останавливаем перебор командой break.

Решение на Python

n = 0

for i in open('9'):
    a = [int(x) for x in i.split()]
    n += 1

    if len(set(a)) == 5:
        if 2 * (max(a) + min(a)) > sum(a) - max(a) - min(a):
            print(n, sum(a))
            break

Ответ: 1980

Почему len(set(a)) == 5

set(a)

оставляет каждое значение только один раз.

Если после этого в множестве осталось 5 элементов, значит все пять чисел исходной строки различны.