Задание 9 · Электронные таблицы
Практика и итог
Вся тема на одной странице: как решилась задача темы, главное из подтем, порядок решения и частые ошибки.
Одна задача — вся тема
Задача темы — строки с одной парой и средним одиночных больше суммы пары — прошла через подтемы, и каждая добавляла к программе новую проверку. Пролистай версии: точками отмечены строки, которых не было в предыдущей.
- Подтема 1, «Строка и условие»: каждая строка — своя проверка. Точками отмечены новые строки.
- Подтема 2, «Сумма и крайние»: среднее без деления.
- Подтема 3, «Повторы в строке»: частоты: одна пара.
- Подтема 4, «Две группы чисел»: одиночные и пара двумя списками.
- Подтема 5, «Порядок и номер»: другой вопрос: номер строки. На учебной таблице подходят строки 1 и 6: ответ задачи темы — 2, последняя подходящая строка — 6.
В электронной таблице те же проверки делают вспомогательные столбцы: полоса частот СЧЁТЕСЛИ, суммы групп СУММЕСЛИ и признак строки ЕСЛИ(И(…);1;0), а ответ — сумма признаков.
Карта темы
Каждая подтема дала несколько проверок строки, и любое решение собирается из них. Сверху — путь от условия к ответу, ниже — по блоку на подтему. Заголовок блока ведёт на подтему.
- Условиеотдельные проверки строки
- Проверкапризнак в таблице или if в программе
- Ответколичество, номер или число из строки
1Строка и условие
- «не меньше»≥: равенство подходит
=ЕСЛИ(И(…);признак строки; ответ — сумма признаков1; 0) line.split()числа строки текстового файла
2Сумма, наибольшее и наименьшее
sorted(a)[-2]второе по величине, с повторами- S − m − Mбез одного наименьшего и одного наибольшего
- S₁ · k₂ > S₂ · k₁сравнение средних без деления
3Повторы в строке
=СЧЁТЕСЛИ($A1:$F1;полоса частот в таблицеA1) [a.count(x) for x in a]та же полоса в Pythonlen(set(a)) == len(a)все числа различны
4Две группы чисел
- одиночные и повторычастота 1 и частота больше 1
=СУММЕСЛИ(G1:L1;сумма одиночных в таблице1; A1:F1) - сначала структурапотом суммы и средние групп
5Порядок и номер строки
enumerate(f, start=1)номер строки с единицыlast = numberпоследняя; первая — с breaka == sorted(a)числа по неубыванию — на исходной строке
6Вся таблица и соседние ячейкидополнительный урок
- другие строкичастота в таблице минус частота в своей
- сдвиги −1, 0, 1соседи без самой ячейки и за краем
Как решать
Любое задание 9 решается одним порядком из пяти шагов. Каждому шагу ты уже учился — под ним номера подтем:
Числа таблицы должны быть числами: =СЧЁТ(A1:F1) для шести чисел строки даёт 6, а текстовые записи чисел СЧЁТ не учитывает.
Частые ошибки
Восемь ошибок встречаются чаще других, и каждую ловит один вопрос к себе. Выбери ошибку — увидишь, как её исправить, и вопрос, который её ловит:
- строгость
- «больше» записали как ≥ → «больше» — строго, >. Спроси себя: подходит ли строка с равенством?подтема 1
- S − m − M
- убрали все числа, равные крайним → вычитают по одному экземпляру. Спроси себя: сколько чисел осталось в сумме?подтема 2
- лишняя пара
- проверили только две двойки в частотах → и четыре единицы: 2, 2, 1, 1, 1, 1. Спроси себя: нет ли второй пары или тройки?подтема 3
- пустая группа
- взяли среднее несуществующей группы → сначала структура, потом группы. Спроси себя: есть ли в строке такие числа?подтема 4
- сортировка
- порядок проверили на отсортированной строке → порядок — на исходной. Спроси себя: не переставил ли я числа до проверки?подтема 5
- номер с заголовком
- ответили номером строки листа → вычитают строку заголовков. Спроси себя: с какой строки листа начинаются данные?подтема 5
- формулы не до конца
- формулы протянули не до последней строки → признаков столько же, сколько строк. Спроси себя: совпадает ли число признаков с числом строк?подтема 1
- счётчик не там
answer = 0→ обнуляют до файла, +1 — один раз на строку. Спроси себя: не обнуляется ли счётчик в цикле?подтема 1
Итог
Тема пройдена: задача темы решена от цикла по строкам до ответа 2 на учебной таблице. Вот что взять с собой.
- ПорядокУсловие, одна строка вручную, признак, все строки, ответ.
- ПовторыПолоса частот: СЧЁТЕСЛИ или a.count(x).
- ГруппыОдиночные — частота 1, повторы — больше 1.
- СредниеСравнивают без деления: S₁ · k₂ и S₂ · k₁.
- Задача темыСтроки 1 и 6: 32 > 16 и 92 > 56 — ответ 2.
Проверьте себя
Ответь сначала сам, потом открой ответ.
Подходит ли строка 6, 6, 1, 2, 3, 4 под задачу темы?
ОтветСкрыть ответ
Нет: структура подходит, но 1 + 2 + 3 + 4 = 10, а 4 · (6 + 6) = 48 — среднее одиночных не больше суммы пары.
Какая полоса частот у строки 2, 2, 2, 7, 9, 11? Подходит ли она под «одна пара, остальные различны»?
ОтветСкрыть ответ
3, 3, 3, 1, 1, 1 — двойка встречается трижды, пары нет. Не подходит.
Как сравнить среднее трёх чисел с суммой 20 и среднее двух чисел с суммой 14 без деления?
ОтветСкрыть ответ
20 · 2 = 40 и 14 · 3 = 42: второе среднее больше.
Спрашивают номер первой подходящей строки. Что изменить в программе, которая считает количество?
ОтветСкрыть ответ
Нумеровать строки enumerate с единицы, на первой подходящей напечатать номер и выйти из цикла break.
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Одна пара и четыре одиночных
В каждой строке таблицы 9-3.xlsx, 9-3.txt записаны шесть натуральных чисел. Определи количество строк, в которых только одно число встречается дважды, остальные четыре числа различны, а среднее арифметическое неповторяющихся чисел не больше суммы повторяющихся.
Введите число.
Подсказка
Как в задаче темы, только знак другой: «не больше» включает равенство.
Решение
Структура 2 + 1 + 1 + 1 + 1 (подтема 3), затем сравнение без деления: сумма четырёх одиночных не больше 4 · (сумма пары) (подтема 4). «Не больше» включает равенство. Подходит 185 строк.
Решение программой
from collections import Counter answer = 0with open("9-3.txt") as f: for line in f: a = [int(part) for part in line.split()] counts = Counter(a) repeated = [x for x in a if counts[x] > 1] single = [x for x in a if counts[x] == 1] shape = sorted(counts.values()) if ( shape == [1, 1, 1, 1, 2] and sum(single) <= 4 * sum(repeated) ): answer += 1print(answer)Ответ: 185
Два наибольших и остальные
В каждой строке таблицы 9-1.xlsx, 9-1.txt записаны шесть натуральных чисел. Определи количество строк, в которых сумма двух наибольших чисел строки не больше суммы четырёх остальных.
Введите число.
Подсказка
Два наибольших — два последних числа упорядоченной копии строки.
Решение
Два наибольших с учётом повторов — два последних числа упорядоченной строки (sorted(a)[-2:], в таблице НАИБОЛЬШИЙ(…;1) и НАИБОЛЬШИЙ(…;2)). Остальные — общая сумма минус эти два. Подходит 373 строки.
Решение программой
answer = 0with open("9-1.txt") as f: for line in f: a = [int(part) for part in line.split()] top = sorted(a)[-2:] if sum(top) <= sum(a) - sum(top): answer += 1print(answer)Ответ: 373
Номер последней подходящей строки
В каждой строке таблицы 9-4.xlsx, 9-4.txt записаны семь натуральных чисел. Определи наибольший номер строки, в которой одно число встречается трижды, остальные четыре различны, а повторяющееся число больше среднего арифметического неповторяющихся.
Введите число.
Подсказка
Сравни со средним без деления, а номер перезаписывай в каждой подходящей строке.
Решение
Структура 3 + 1 + 1 + 1 + 1, затем без деления: 4 · (тройное число) больше суммы четырёх одиночных. Номер запоминают в каждой подходящей строке — последний 999.
Решение программой
from collections import Counter answer = 0with open("9-4.txt") as f: for number, line in enumerate(f, start=1): a = [int(part) for part in line.split()] counts = Counter(a) triple = [x for x in counts if counts[x] == 3] single = [x for x in a if counts[x] == 1] shape = sorted(counts.values()) if shape == [1, 1, 1, 1, 3]: if 4 * triple[0] > sum(single): answer = numberprint(answer)Ответ: 999
Сумма чётных номеров
В каждой строке таблицы 9-5.xlsx, 9-5.txt записаны восемь натуральных чисел. Определи сумму чётных номеров строк, в которых все числа различны, а чётных чисел столько же, сколько нечётных.
Введите число.
Подсказка
Чётность номера строки не связана с чётностью чисел в ней: проверь её отдельно.
Решение
Все числа различны — len(set(a)) == len(a); чётных столько же, сколько нечётных, — четыре из восьми. Номер строки прибавляют, только если он чётный: сумма 48552.
Решение программой
answer = 0with open("9-5.txt") as f: for number, line in enumerate(f, start=1): a = [int(part) for part in line.split()] even = [x for x in a if x % 2 == 0] different = len(set(a)) == len(a) if different and len(even) == 4 and number % 2 == 0: answer += numberprint(answer)Ответ: 48552
Сумма чисел последней строки
В каждой строке таблицы 9-8.xlsx, 9-8.txt записаны семь целых чисел. Определи сумму чисел строки с наибольшим номером, в которой числа расположены в порядке строгого возрастания.
Введите число.
Подсказка
В ответе сумма чисел строки, а не её номер.
Решение
Строгое возрастание — a == sorted(a) и нет повторов. Запоминаем сумму чисел каждой подходящей строки; после цикла остаётся сумма последней — 15. В ответе сумма, а не номер.
Решение программой
answer = 0with open("9-8.txt") as f: for line in f: a = [int(part) for part in line.split()] if a == sorted(a) and len(set(a)) == len(a): answer = sum(a)print(answer)Ответ: 15