Задание 17 ЕГЭ по информатике на Python: пары чисел из файла

опубликовано
читать
≈ 3 мин
автор
среда и версия
Python 3.14.2 в браузере (Pyodide 314.0.3) — там же, где запускаются примеры на странице; вывод совпал с CPython 3.14.7
содержание решать задачи Python для начинающих

В задании 17 ЕГЭ по информатике дан файл с последовательностью целых чисел, и нужно посчитать пары или тройки соседних элементов с какими-то свойствами. Чисел в файле тысячи, так что без программы это задание не решить. На Python решение умещается в несколько строк: open() читает числа, zip составляет пары соседей, а условия записываются почти как в задании. Главная ловушка — отрицательные числа. Примеры ниже запускаются прямо на странице и составлены для этой статьи: на экзамене условия будут другими, а шаблон — тот же.

ЕГЭ / 01

Пары соседних чисел — это zip(nums, nums[1:])

Пары соседних чисел — это zip(nums, nums[1:])Список nums и тот же список без первого числа стоят друг под другом: 1200 и −35, −35 и 117, 117 и 8, 8 и −2017, −2017 и 4500, 4500 и 60. Каждый столбец — пара соседних элементов. Пара 8 и −2017 подходит: −2017 — четырёхзначное число, сумма −2009 не больше 317. Всего подходит 7 пар, наибольшая сумма — −100.1 · список и он же со сдвигом на одинnums1200−351178−20174500…nums[1:]−351178−2017450060…столбец — пара соседей: (8, −2017) подходит — −2017 четырёхзначное, сумма −2009 ≤ 3172 · проверка каждой пары7 пар, наибольшая сумма −100
zip идёт по двум спискам сразу, и сдвиг на один элемент даёт все пары соседей без индексов — и без выхода за конец списка.

Пример задачи

В файле 17.txt записана последовательность целых чисел от −10 000 до 10 000, по одному в строке. Найди количество пар соседних элементов, в которых хотя бы одно число четырёхзначное, а сумма пары не больше наибольшего элемента, запись которого оканчивается на 17. В ответе запиши количество пар и наибольшую из их сумм.

Решение

На этой странице файла задания нет, поэтому первые три строки примера создают его сами — из 14 чисел, чтобы ответ можно было проверить глазами. В настоящем файле чисел тысячи, а код тот же.

data = [1200, -35, 117, 8, -2017, 4500, 60, -9999, 317, 25, -3017, 40, -1500, 1400]
with open('17.txt', 'w') as f:
    f.write('\n'.join(map(str, data)))

nums = [int(x) for x in open('17.txt')]
limit = max(x for x in nums if abs(x) % 100 == 17)

def four(x):
    return 1000 <= abs(x) <= 9999

sums = [a + b for a, b in zip(nums, nums[1:])
        if (four(a) or four(b)) and a + b <= limit]
print(limit, len(sums), max(sums))
317 7 -100
  • [int(x) for x in open('17.txt')] читает файл по строкам и превращает каждую строку в число.
  • abs(x) % 100 == 17 — «запись оканчивается на 17» и для отрицательных чисел: последние цифры берут у модуля.
  • four(x) — число четырёхзначное, с минусом или без: от 1000 до 9999 по модулю.
  • zip(nums, nums[1:]) даёт пары соседей (схема выше), а sums собирает суммы подходящих пар.
  • len(sums) — количество пар, max(sums) — наибольшая сумма.

Ответ: 7 и −100.

Проверка глазами. На 17 оканчиваются 117, −2017, 317 и −3017, наибольшее из них — 317. Четырёхзначное число и сумму не больше 317 имеют пары (8, −2017), (60, −9999), (−9999, 317), (25, −3017), (−3017, 40), (40, −1500) и (−1500, 1400). Их семь, наибольшая сумма у последней — −100.

Файл задания в песочнице

На экзамене файл уже дан, и строки, которые создают пример, не нужны — программа начинается с чтения:

nums = [int(x) for x in open('17.txt')]

Чтобы потренироваться на настоящем файле из варианта, открой песочницу Python и перетащи файл на страницу: он появится в проекте рядом с программой, и open('17.txt') его прочитает. Песочница хранит текстовые файлы до 200 КБ.

Частые ошибки

Остаток отрицательного числа. В Python остаток от деления на положительное число всегда неотрицательный, поэтому для −2017 проверка x % 100 == 17 не сработает:

print(-2017 % 100, abs(-2017) % 100)
83 17

Четырёхзначность без abs. Условие 1000 <= x <= 9999 пропускает −2017, −9999, −3017 и −1500, и в примере выше осталась бы одна пара вместо семи.

Индексы до конца списка. Цикл for i in range(len(nums)) с обращением к nums[i + 1] на последнем элементе останавливается с ошибкой IndexError: list index out of range. Пар на одну меньше, чем чисел: range(len(nums) - 1) — или zip, как выше.

Какие ещё задания решают программой и что из Python для них нужно — в статье «Python для ЕГЭ по информатике», чтение файлов подробно — в статье «Работа с файлами в Python».

Источники