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