Автор статьи: Андрей Рогов
Девятое задание в ЕГЭ по информатике можно решить в электронных таблицах, но иногда это занимает слишком много времени. Рассказываем, как справиться с ним быстрее, написав код на Python.
Содержание задания
Девятое задание — базового уровня сложности. Оно проверяет, насколько ученик умеет работать с числами в электронных таблицах.
В последние годы содержание задания часто менялось. Например, ученикам предлагали провести метеорологические измерения, найти длины сторон треугольника. Сегодня в задании даны числа, записанные в строки:
- от 4 до 7 чисел в одной строке
- от 3 000 до 16 000 строк в файле
Составители требуют проверить разные условия. Например:
- выделить максимальное и (или) минимальное число и сравнить его с остальными
- разбить числа на пары по заданному критерию
- найти строки, в которых повторяются определенные числа
- сравнить повторяющиеся и неповторяющиеся числа
Все типы задания № 9 можно решить в электронных таблицах. Но написать программу часто бывает удобнее, особенно тем, кто уверенно программирует. Поэтому покажем, как справиться с заданием, написав код на языке Python.
Как решать разные типы задания № 9
Как читать данные из задания
Файл может быть задан в одном из четырёх форматов: .csv, .ods, .xls, .xlsx. Но читать данные напрямую можно только из файла .csv. Поэтому первым делом проверяем формат и при необходимости сохраняем данные в .csv через электронные таблицы.
CSV, или Coma Separated Values, — это текстовый файл. Строки в нём разделяются символом переноса строки, а значения внутри строки — запятой, точкой с запятой или другими символами. Выглядит это так:
35;10;46;2
23;24;86;35
81;79;8;36
80;57;92;17
59;93;84;47
15;17;54;43
20;16;46;7
59;68;31;22
Данные в файле .csv — это двумерный набор чисел. Чтобы представить такие данные в Python, используем список. Его элементами также будут списки, которые содержат числа.
Преобразуем данные с помощью кода:
# Чтение данных из файла
f = open('9.csv')
# разбиение данных по строкам
a = f.read().strip().split()
# разбиение строки на отдельные числа
for i in range(len(a)):
a[i] = [int(x) for x in a[i].split(';')]
Результат его выполнения выглядит так:
[[35, 10, 46, 2],
[23, 24, 86, 35],
[81, 79, 8, 36],
[80, 57, 92, 17],
[57, 93, 84, 47],
[15, 17, 54, 43],
[20, 16, 46, 7],
[59, 68, 31, 22]]
Теперь мы можем работать с данными дальше. А как работать — зависит от условий конкретной задачи. Рассмотрим решения задач четырёх основных типов.
Тип № 1. Различные и наибольшее

Проверить первое условие — что четыре числа различны — можно несколькими способами. Например:
a = [1, 2, 3, 4]
# сравнить все числа
a[0] != a[1] and a[0] != a[2] and a[0] != a[3] and a[1] != a[2] and a[1] != a[3] and a[2] != a[3]
# сначала сортировать, потом проверить рядом стоящие
a.sort()
a[0] != a[1] and a[1] != a[2] and a[2] != a[3]
# проверить длину множества
len(set(a)) == 4
Последний вариант самый неочевидный. В этом случае проверяется длина множества, в которое преобразуется список. Если длина множества сократилась, значит, в строке есть повторяющиеся числа (напомним, множество не может содержать одинаковые числа).
Проверить второе условие — что наибольшее число в строке меньше суммы трёх других — также можно несколькими способами:
# сложить всё и вычесть максимальное
max(a) < sum(a) – max(a)
# предварительно отсортировать
a.sort()
a[-1] < sum(a[:3])
Соберём весь код в итоговую программу:
# Чтение данных из файла
f = open('9.csv')
# разбить данные по строкам
a = f.read().strip().split()
# разбить строки на отдельные числа
for i in range(len(a)):
a[i] = [int(x) for x in a[i].split(';')]
k = 0 # счетчик подходящих строк
# перебрать все строки
for s in a:
# отсортировать строку по возрастанию
s.sort()
# наибольшее меньше суммы трех других
if max(s) < sum(s[:3]):
# все числа различны
if len(set(s)) == 4:
# увеличение счетчика
k += 1
print(k)
Ответ: 2322
В этом решении мы использовали не логические операции, а вложенный условный оператор. Такой код проще читать. А ещё в нём сложнее ошибиться, так как логические операции and, or и not часто используют неверно.
Тип № 2. Наибольшее и пары

Проверку первого условия мы уже разобрали. А вот второе условие можно подтвердить или опровергнуть несколькими способами.
Например, поочерёдно проверить все три варианта. Или учесть, что получить равные суммы можно, только если в одной паре будет максимальное и минимальное число, а во второй — два оставшихся.
Полное решение будет выглядеть так:
# Чтение данных из файла
f = open('9.csv')
# разбить данные по строкам
a = f.read().strip().split()
# разбить строки на отдельные числа
for i in range(len(a)):
a[i] = [int(x) for x in a[i].split(';')]
k = 0 # счетчик подходящих строк
# перебрать все строки
for s in a:
# отсортировать строки по возрастанию
s.sort()
# наибольшее меньше суммы трех других
if max(s) < sum(s[:3]):
# четыре числа можно разбить на пары с равными суммами
if s[0] + s[3] == s[1] + s[2]:
# увеличение счетчика
k += 1
print(k)
Ответ: 118
Тип № 3. Повторяющиеся и неповторяющиеся

Узнать, сколько раз число повторяется, можно методом списков count.
Сначала делим все числа на два списка: повторяющиеся и неповторяющиеся. А затем проверяем заданные условия в каждом списке.
Узнать количество повторяющихся чисел можно по длине множества, полученного из списка (разбирали выше). А определить, сколько раз эти числа повторяются, можно по размерам самого списка.
Если три из шести чисел одинаковые, то в списке неповторяющихся чисел тоже будет три числа. Для подсчета суммы квадратов можно обращаться к этим числам по индексам.
Полное решение будет выглядеть так:
# Чтение данных из файла
f = open('9.csv')
# разбить данные по строкам
a = f.read().strip().split()
# разбить строки на отдельные числа
for i in range(len(a)):
a[i] = [int(x) for x in a[i].split(';')]
k = 0 # счетчик подходящих строк
# перебрать все строки
for s in a:
r = [] # повторяющиеся числа
n = [] # неповторяющиеся числа
# разделить числа
for c in s:
if s.count(c) > 1:
r.append(c)
else:
n.append(c)
# только одно число повторяется трижды
if len(r) == 3 and len(set(r)) == 1:
# утроенный квадрат повторяющегося числа
# больше суммы квадратов неповторяющихся чисел
if r[0]**2 * 3 > n[0]**2 + n[1]**2 + n[2]**2:
# увеличение счетчика
k += 1
print(k)
Ответ: 245
Тип № 4. Среднее арифметическое

Как проверить первое условие, мы уже разобрали. А чтобы найти среднее арифметическое, используем встроенные функции:
sum— находит сумму чиселlen— определяет количество символов
Полное решение выглядит так:
# Чтение данных из файла
f = open('9.csv')
# разбить данные по строкам
a = f.read().strip().split()
# разбить строки на отдельные числа
for i in range(len(a)):
a[i] = [int(x) for x in a[i].split(';')]
k = 0 # счетчик подходящих строк
# перебрать все строки
for s in a:
r = [] # повторяющиеся числа
n = [] # неповторяющиеся числа
# разделить числа
for c in s:
if s.count(c) > 1:
r.append(c)
else:
n.append(c)
# два числа, каждое из которых повторяется дважды
if len(r) == 4 and len(set(r)) == 2:
# среднее арифметическое трёх неповторяющихся
# чисел строки не больше среднего арифметического всех её чисел
if sum(n) / len(n) <= sum(s) / len(s):
# увеличение счетчика
k += 1
print(k)
Ответ: 92
Отметим, что в этом случае делить можно и на константу, ведь мы точно знаем, сколько чисел не повторяется и сколько всего чисел в строке.
Как избежать типовых ошибок
Чаще всего при решении девятого задания выпускники ошибаются при чтении данных и в работе со слишком длинными условиями.
Чтобы избежать ошибок при чтении данных, убедитесь в следующем:
- файл программы и файл с данными находятся в одном каталоге
- в файле .csv в качестве разделителя используется точка с запятой (содержимое файла можно увидеть, если открыть его в блокноте)
Чтобы не ошибиться при написании кода, используйте вложенный условный оператор. С ним можно отладить каждое условие по отдельности и убедиться, что записанные условия соответствуют заданным.
Итоги
Итак, девятое задание можно решить в электронных таблицах и с помощью программирования. Если вы научитесь решать задание разными способами, на экзамене сможете быстро выбрать вариант, который вам подходит. А потренироваться предлагаем на подборке задач.