Задание 17 · Обработка числовой последовательности
Практика и итог
Вся тема на одной странице: как решилась задача темы, главное из подтем, порядок решения и частые ошибки.
Одна задача — вся тема
Задача темы — тройки, в которых не более двух четырёхзначных, а сумма не больше наибольшего числа на 25, — прошла через подтемы, и каждая добавляла к программе новую строку. Пролистай версии: точками отмечены строки, которых не было в предыдущей.
- Подтема 1, «Файл и условие»: файл — в список чисел. Точками отмечены новые строки.
- Подтема 2, «Пары и тройки»: тройки подряд: количество и max.
- Подтема 3, «Сколько подходит»: не более двух четырёхзначных.
- Подтема 4, «Цифры и знак»: окончание — по модулю.
- Подтема 5, «Порог по всему файлу»: порог — до цикла по всему файлу. Ответ задачи темы — 8358 99821; на восьми числах — 4 1707.
Каждую версию проверяли на восьми числах 125, 1300, −1250, −2100, 7, −325, 2025, 3000 — ответ на них 4 1707. Подтема 6 разбирает длинные формулировки, а дополнительный урок — тройки как стороны треугольника.
Карта темы
Каждая подтема дала одну проверку или приём, и любое решение собирается из них. Сверху — путь от файла к ответу, ниже — по блоку на подтему. Заголовок блока ведёт на подтему.
- Порогдо цикла, по всему списку
- Переборсоседние группы с проверками
- Ответколичество и max или min
1Файл и условие
[int(x) for x in f]файл → список чиселx % d == 0кратно d; ноль кратен любому
2Соседние пары и тройки
range(len(a) - 2)тройки; пары — len(a) − 1sums.append(s)внутри if; ответ — len и max
3Сколько чисел группы подходит
k = int(…) + int(…) + int(…)сколько чисел прошло проверкуk == 1,k <= 2ровно одно, не более двух
4Цифры и знак числа
abs(x) % 100 == 25оканчивается на 25, и −325 тоже1000 <= abs(x) <= 9999четырёхзначное, в том числе отрицательное
5Порог по всей последовательности
[x for x in a if …]отбор исходных чисел, не их модулей- порогдо цикла: max, min, среднее по всему списку
6Длинные формулировки
- что выводитьпоследняя фраза условия, слово за словом
7Тройка как стороны треугольникадополнительный урок
- треугольниккаждая сторона меньше суммы двух других
Как решать
Любое задание 17 решается одним порядком из пяти шагов. Каждому шагу ты уже учился — под ним номера подтем:
Проверка на коротком списке — заменить чтение файла восемью числами темы и вывести каждую тройку:
def four(x): return 1000 <= abs(x) <= 9999 a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000]for i in range(len(a) - 2): x, y, z = a[i], a[i + 1], a[i + 2] k = int(four(x)) + int(four(y)) + int(four(z)) print(i, x, y, z, k, x + y + z)Частые ошибки
Восемь ошибок встречаются чаще других, и каждую ловит один вопрос к себе. Выбери ошибку — увидишь, как её исправить, и вопрос, который её ловит:
- граница range
range(len(a))→range(len(a) - 2). Спроси себя: есть ли у последней тройки третий элемент?подтема 2- «не более двух»
k == 2→k <= 2. Спроси себя: подходят ли тройки с 0 и 1 таким числом?подтема 3- цифры без модуля
1000 <= x <= 9999→1000 <= abs(x) <= 9999. Спроси себя: −1250 — четырёхзначное?подтема 4- окончание без модуля
x % 100 == 25→abs(x) % 100 == 25. Спроси себя: что даёт -325 % 100?подтема 4- модуль в списке
[abs(x) for x in a if …]→[x for x in a if …]. Спроси себя: в порог попало исходное число?подтема 5- порог по ходу
- порог считают в том же цикле, что и тройки → порог — до цикла, по всему списку. Спроси себя: известен ли порог, когда проверяю первую тройку?подтема 5
- строгое и нестрогое
- «не больше» записано как < → «не больше» — <=. Спроси себя: подходит ли тройка с суммой, равной порогу?подтема 6
- что выводить
- вывели наибольшую сумму, а спросили наименьшую → выводят ровно то, что просят. Спроси себя: что в последней фразе условия?подтема 6
Итог
Тема пройдена: задача темы решена от чтения файла до ответа 8358 99821. Вот что взять с собой.
- ПорядокФайл, порог, группы, условия, ответ.
- ПорогДо цикла, по всему списку, исходными числами.
- ЗнакЦифры и окончание — по abs(x), остаток — без модуля.
- ПроверкаВосемь чисел вручную — ответ 4 1707.
- Задача темыПорог 99825 — 8358 троек, наибольшая сумма 99821.
Проверьте себя
Ответь сначала сам, потом открой ответ.
Почему порог задачи темы нельзя считать в цикле по тройкам?
ОтветСкрыть ответ
Порог — наибольшее число на 25 во всём файле. Пока цикл не дошёл до конца, он может ещё вырасти, и ранние тройки проверятся не с тем порогом.
Что вернёт -325 % 100 в Python?
ОтветСкрыть ответ
75: остаток в Python не отрицателен. Окончание проверяют по abs(-325) % 100 = 25.
Сколько четырёхзначных в тройке 1300, −1250, −2100? Подходит ли она под «не более двух»?
ОтветСкрыть ответ
Три — не подходит.
Сколько соседних троек в списке из 8 чисел?
ОтветСкрыть ответ
6: тройки начинаются с индексов 0–5, range(len(a) − 2).
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Ровно одно кратно 3, сумма кратна 5
В файле 17-4.txt содержится последовательность натуральных чисел, не превышающих 100 000. Определите количество пар, в которых ровно одно число делится на 3, а сумма элементов пары кратна 5. В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар.
Введите через пробел количество пар, затем максимальную сумму.
Подсказка
«Ровно одно» — количество выполненных проверок равно 1.
Решение
«Ровно одно кратно 3» — k == 1; с «хотя бы одним» подошли бы и пары, где кратны оба.
with open("17-4.txt") as f: a = [int(x) for x in f]sums = []for i in range(len(a) - 1): x, y = a[i], a[i + 1] k = int(x % 3 == 0) + int(y % 3 == 0) if k == 1 and (x + y) % 5 == 0: sums.append(x + y)print(len(sums), max(sums))Ответ: 92 172180
Не более одного трёхзначного
В файле 17-3.txt содержится последовательность целых чисел от −100 000 до 100 000. Определите количество троек, в которых не более одного числа трёхзначное, а сумма элементов тройки не меньше минимального положительного элемента последовательности, оканчивающегося на 99. В ответе запишите количество найденных троек, затем минимальную из сумм элементов таких троек.
Введите через пробел количество троек, затем минимальную сумму.
Подсказка
Трёхзначное — по модулю; «не меньше» включает равенство с порогом.
Решение
Минимальный положительный элемент на 99 — само число 99, и тройка с суммой ровно 99 подходит; со строгим «больше» ответ был бы другим.
def three(x): return 100 <= abs(x) <= 999 with open("17-3.txt") as f: a = [int(x) for x in f]limit = min([x for x in a if x > 0 and x % 100 == 99])sums = []for i in range(len(a) - 2): x, y, z = a[i], a[i + 1], a[i + 2] k = int(three(x)) + int(three(y)) + int(three(z)) if k <= 1 and x + y + z >= limit: sums.append(x + y + z)print(len(sums), min(sums))Ответ: 404 99
Остатки минимума и максимума
Для файла 17-4.txt определите количество пар, для которых выполняются условия: остаток от деления на 3 хотя бы одного числа пары равен остатку от деления на 3 минимального элемента последовательности; остаток от деления на 7 хотя бы одного числа пары равен остатку от деления на 7 максимального элемента последовательности. В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар.
Введите через пробел количество пар, затем максимальную сумму.
Подсказка
Сравнивай остатки: x % 3 == min(a) % 3, а не x % 3 == min(a).
Решение
Остатки минимума и максимума находят до цикла; в паре сравнивают остатки её чисел.
with open("17-4.txt") as f: a = [int(x) for x in f]r3 = min(a) % 3r7 = max(a) % 7sums = []for i in range(len(a) - 1): x, y = a[i], a[i + 1] first = x % 3 == r3 or y % 3 == r3 second = x % 7 == r7 or y % 7 == r7 if first and second: sums.append(x + y)print(len(sums), max(sums))Ответ: 164 149944
Все одного знака
Для файла 17-3.txt определите количество троек, в которых все числа одного знака, а модуль суммы элементов тройки меньше максимального элемента последовательности, запись которого оканчивается на 77. В ответе запишите количество найденных троек, затем абсолютное значение максимальной из сумм элементов таких троек.
Введите через пробел количество троек, затем модуль максимальной суммы.
Подсказка
Ноль не положительный и не отрицательный; модуль — у суммы в проверке и у окончательного максимума.
Решение
Тройки с нулём не подходят: ноль не относится ни к положительным, ни к отрицательным.
with open("17-3.txt") as f: a = [int(x) for x in f]limit = max([x for x in a if abs(x) % 100 == 77])sums = []for i in range(len(a) - 2): t = [a[i], a[i + 1], a[i + 2]] same = min(t) > 0 or max(t) < 0 if same and abs(sum(t)) < limit: sums.append(sum(t))print(len(sums), abs(max(sums)))Ответ: 77 6498
Четвёрки и утроенное среднее
Для файла 17-4.txt определите количество четвёрок, в которых чисел, кратных 3, больше, чем чисел, кратных 7, а сумма элементов четвёрки больше утроенного среднего арифметического всех чётных элементов последовательности. В ответе запишите количество найденных четвёрок, затем максимальную из сумм элементов таких четвёрок.
Введите через пробел количество четвёрок, затем максимальную сумму.
Подсказка
Без деления: сумма четвёрки, умноженная на k, больше 3 * s, где s и k — сумма и количество чётных.
Решение
Условие на среднее записано без деления: sum(t) * k > 3 * s.
with open("17-4.txt") as f: a = [int(x) for x in f]even = [x for x in a if x % 2 == 0]s, k = sum(even), len(even)sums = []for i in range(len(a) - 3): t = [a[i], a[i + 1], a[i + 2], a[i + 3]] k3 = len([x for x in t if x % 3 == 0]) k7 = len([x for x in t if x % 7 == 0]) if k3 > k7 and sum(t) * k > 3 * s: sums.append(sum(t))print(len(sums), max(sums))Ответ: 357 240298