№17 Числа из файла

Задание 17: Программирование. Обработка числовых последовательностей

1. Общая информация о задании

  • Уровень сложности: базовый (Часть 1)
  • Максимальный балл: 1
  • Формат на экзамене: файл .txt с числами (каждое на новой строке), ответ — два числа через пробел

Ответ всегда состоит из двух чисел:

  1. Количество найденных пар / троек
  2. Максимальная или минимальная сумма / произведение / иная характеристика таких пар / троек

Внимательно читать условие: иногда нужен min, а не max, и характеристика — не сумма, а произведение.


Задания: N17. Числа из файла


2. Считывание данных из файла

Во всех задачах файл считывается целиком в список одной строкой:

f = open('17.txt')
a = [int(s) for s in f]

После этого a это обычный список целых чисел, с которым работаем через индексы.


3. Структура решения

Все задачи решаются по одной схеме:

1. Считать файл в список a
2. Найти вспомогательное значение по всему списку (если нужно)
3. Перебрать пары / тройки, собрать подходящие значения
4. Вывести len(...) и max(...) или min(...)

Структура для пар

f = open('17.txt')
a = [int(s) for s in f]

sum_par = []

for i in range(len(a) - 1):          # до предпоследнего включительно
    if условие(a[i], a[i+1]):
        sum_par.append(a[i] + a[i+1])

print(len(sum_par), max(sum_par))

Структура для троек

f = open('17.txt')
a = [int(s) for s in f]

sum_tri = []

for i in range(len(a) - 2):          # до третьего с конца включительно
    if условие(a[i], a[i+1], a[i+2]):
        sum_tri.append(значение_тройки)

print(len(sum_tri), max(sum_tri))   

4. Двухпроходное решение

Если условие зависит от всего списка (минимум, максимум, какой-то особый элемент) — сначала находим это значение, потом ищем пары / тройки.

Паттерн: найти минимальный / максимальный элемент по условию

# Способ 1: через список в min / max
candidates = []
for x in a:
    if условие(x):
        candidates.append(x)
result = min(candidates)   # или max(candidates)

# Способ 2: компактно через генератор (то же самое)
result = min(x for x in a if условие(x))

5. Проверка условий на элементы

5.1. Остаток от деления (последние цифры)

Что проверяем Код
Кратность числу k x % k == 0
Остаток равен r x % k == r
Последняя цифра abs(x) % 10
Последние две цифры abs(x) % 100 == 25
Последняя цифра в СС по основанию b x % b

Важно: str(x)[-2:] работает только для положительных чисел. Для отрицательных безопасный вариант — abs(x) % 100 == 25.

5.2. Количество цифр (N-значное число)

len(str(abs(x))) == 4    # четырёхзначное 
len(str(abs(x))) == 3    # трёхзначное 

# То же самое через неравенства:
1000 <= abs(x) <= 9999   # четырёхзначное
100  <= abs(x) <= 999    # трёхзначное

5.3. Комбинированное условие

Проверка сразу двух свойств через and:

# Трёхзначное И оканчивается на 15
str(x)[-2:] == '15' and len(str(abs(x))) == 3

# Через остатки (надежнее для отрицательных):
abs(x) % 100 == 15 and 100 <= abs(x) <= 999

5.4. Проверка «хотя бы один» через or

# Хотя бы одно из двух кратно mn23 
a[i] % mn23 == 0 or a[i+1] % mn23 == 0

# Хотя бы один остаток от /16 равен min(a) 
a[i] % 16 == mn or a[i+1] % 16 == mn

5.5. Проверка знака всех элементов тройки

# Все три положительные ИЛИ все три отрицательные
(a[i] > 0 and a[i+1] > 0 and a[i+2] > 0) or \
(a[i] < 0 and a[i+1] < 0 and a[i+2] < 0)

5.7. Разность и абсолютное значение

abs(a[i] - a[i+1]) % mn35 == 0    # |разность| кратна mn35
a[i] != a[i+1]                     # элементы не равны

6. Что добавлять в список: сумма или другая характеристика

Не всегда добавляем сумму. Где-то нужно произведение min × max тройки:

# Сумма пары:
sum_par.append(a[i] + a[i+1])

# Сумма тройки:
sum_tri.append(a[i] + a[i+1] + a[i+2])

# Произведение min и max тройки:
umn_tri.append(max(a[i:i+3]) * min(a[i:i+3]))

a[i:i+3] - срез списка из трёх элементов: [a[i], a[i+1], a[i+2]]. К срезу можно применять max(), min(), sum() напрямую.


7. Справочник: списки, генераторы, срезы

Создание списка из файла

Способ Код
Построчно в список a = [int(s) for s in open('17.txt')]
Через readlines() a = [int(x) for x in open('17.txt').readlines()]

Операции со списком a

Что делаем Код
Длина len(a)
Минимум min(a)
Максимум max(a)
Сумма sum(a)
Элемент по индексу a[i]
Добавить элемент a.append(x)

Срезы (slices)

Что делаем Код
Элементы с i до j (не включая j) a[i:j]
Тройка начиная с i a[i:i+3]
Последние два символа строки str(x)[-2:]
Минимум тройки min(a[i:i+3])
Максимум тройки max(a[i:i+3])
Сумма тройки sum(a[i:i+3])

Генераторы (выражения внутри min / max / sum)

min(x for x in a if x > 0)               # минимальный положительный
max(x for x in a if abs(x) % 100 == 25)  # максимальный, оканчивается на 25
sum(x for x in a if x % 2 == 0)          # сумма чётных
[x for x in a if x > 0]                  # список положительных

Генератор — это (выражение for переменная in последовательность if условие). Условие if необязательно.

Встроенные функции

Функция Пример Что возвращает
abs(x) abs(-325)325 Модуль числа
len(x) len([1,2,3])3 Длина
str(x) str(325)'325' Строка
int(x) int('42')42 Целое число
min(a) min([3,1,2])1 Минимум
max(a) max([3,1,2])3 Максимум
sum(a) sum([1,2,3])6 Сумма
range(n) range(5)0,1,2,3,4 Диапазон

8. Типичные ошибки

Ошибка Как избежать
min(a) или min(x for ...) внутри цикла — пересчитывается каждый раз Вычислить вспомогательное значение до цикла
str(x)[-2:] для отрицательных чисел Использовать abs(x) % 100 == 15
len(str(x)) == 3 для отрицательного числа Использовать len(str(abs(x))) == 3
Не убрать отладочный print(min15) перед сдачей Удалить все промежуточные print из финального кода
max(sum_par) когда по условию нужен min Читать условие внимательно: «минимальное из произведений» → min()
max(umn_tri) падает, если список пуст Убедиться, что подходящие тройки есть (как правило, гарантируется)
range(len(a)) вместо range(len(a) - 1) для пар Для пар: -1, для троек: -2

9. Краткий чек-лист

  1. Считать файл: a = [int(s) for s in open('17.txt')]
  2. Нужна ли вспомогательная характеристика? найти до цикла
  3. Пары range(len(a) - 1), тройки range(len(a) - 2)
  4. Что собираем: сумму, произведение min×max или другое? res.append(...)
  5. Для отрицательных чисел: abs() при проверке цифр и остатков
  6. max или min в ответе? читать условие
  7. Вывести: print(len(res), max(res)) или print(len(res), min(res))