Как решить задание № 9 с помощью программирования

Автор статьи: Андрей Рогов

Девятое задание в ЕГЭ по информатике можно решить в электронных таблицах, но иногда это занимает слишком много времени. Рассказываем, как справиться с ним быстрее, написав код на 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. Различные и наибольшее

Ссылка на задачу

Тип № 1. Различные и наибольшее.webp

Проверить первое условие — что четыре числа различны — можно несколькими способами. Например:

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. Наибольшее и пары

Ссылка на задачу

Тип № 2. Наибольшее и пары.webp

Проверку первого условия мы уже разобрали. А вот второе условие можно подтвердить или опровергнуть несколькими способами.

Например, поочерёдно проверить все три варианта. Или учесть, что получить равные суммы можно, только если в одной паре будет максимальное и минимальное число, а во второй — два оставшихся.

Полное решение будет выглядеть так:

# Чтение данных из файла
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. Повторяющиеся и неповторяющиеся

Ссылка на задачу

Тип № 3. Повторяющиеся и неповторяющиеся.webp

Узнать, сколько раз число повторяется, можно методом списков 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. Среднее арифметическое

Ссылка на задачу

Тип № 4. Среднее арифметическое.webp

Как проверить первое условие, мы уже разобрали. А чтобы найти среднее арифметическое, используем встроенные функции:

  • 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 в качестве разделителя используется точка с запятой (содержимое файла можно увидеть, если открыть его в блокноте)

Чтобы не ошибиться при написании кода, используйте вложенный условный оператор. С ним можно отладить каждое условие по отдельности и убедиться, что записанные условия соответствуют заданным.

Итоги

Итак, девятое задание можно решить в электронных таблицах и с помощью программирования. Если вы научитесь решать задание разными способами, на экзамене сможете быстро выбрать вариант, который вам подходит. А потренироваться предлагаем на подборке задач.

Источник: Яндекс Учебник — Как решить задание № 9 с помощью программирования. Каталог разборов: education.yandex.ru.

Назад к статьям Поделиться