Подтема 5 из 6
Порядок и номер строки
Когда спрашивают номер или сумму подходящей строки — и как проверить порядок чисел в строке.
Что спрашивают
Изменим вопрос задачи темы: найди номер последней подходящей строки и сумму её чисел.
Проверка строки остаётся прежней — меняется только то, что делают с подходящей строкой. Подходят строки 1 и 6, последняя — шестая, сумма её чисел 7 + 7 + 20 + 22 + 24 + 26 = 106. Выбери вопрос, чтобы увидеть, что делать с подходящей строкой в программе:
- количество строк
answer += 1- номер последней строки
last = numberкаждая следующая перезаписывает- номер первой строки
first = numberи сразу break- сумма номеров
total += number- сумма чисел последней строки
row_sum = sum(a)
Поэтому, кроме условий, всегда выделяй заключительный вопрос задачи.
Номер строки
Номер строки — её место в данных, считая с 1: в таблице его видно слева, в Python его даёт enumerate.
Подходящие строки удобно найти : включи фильтр по столбцу «Подходит» и оставь ИСТИНА. Видны только подходящие строки, слева — их номера на листе; сколько строк найдено, программа пишет внизу окна.
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | ч1 | ч2 | ч3 | ч4 | ч5 | ч6 | п1 | п2 | п3 | п4 | п5 | п6 | Одиночные | Пара | Подходит |
| 2 | 2 | 2 | 5 | 7 | 9 | 11 | 2 | 2 | 1 | 1 | 1 | 1 | 32 | 4 | ИСТИНА |
| 7 | 7 | 7 | 20 | 22 | 24 | 26 | 2 | 2 | 1 | 1 | 1 | 1 | 92 | 14 | ИСТИНА |
G2скопирована до L7=СЧЁТЕСЛИ($A2:$F2;A2) M2скопирована до M7=СУММЕСЛИ(G2:L2;1; A2:F2) N2скопирована до N7=СУММЕСЛИ(G2:L2;">1";A2:F2) O2скопирована до O7=И(СЧЁТЕСЛИ(G2:L2;2)=2;СЧЁТЕСЛИ(G2:L2; 1)=4; M2>4*N2)
Первая строка листа — подписи столбцов, поэтому каждая строка данных сдвинулась вниз на одну: строки листа 2 и 7 — это строки данных 1 и 6. Если в вопросе номер строки, вычти строку заголовков.
Без фильтра номер даёт — номер строки листа, где стоит формула. Её ставят в подходящих строках, в остальных — пустой текст ""; затем МАКС даёт последнюю строку, МИН — первую, СУММ — сумму номеров:
=ЕСЛИ(O2;СТРОКА()-1;"")=МАКС(P2:P7) выдаёт строки файла вместе с номерами: в for number, line in enumerate(f, start=1) number — номер, начиная с 1, line — сама строка. Проверка — та же, что в подтеме 4, меняется действие:
last = 0row_sum = 0with open("9.txt") as f: for number, line in enumerate(f, start=1): a = [int(part) for part in line.split()] single = [x for x in a if a.count(x) == 1] repeated = [x for x in a if a.count(x) > 1] if len(single) == 4 and len(repeated) == 2: if sum(single) > 4 * sum(repeated): last = number row_sum = sum(a)print(last, row_sum)Файл читается сверху вниз, и каждая новая подходящая строка заменяет прежний ответ — после цикла в last последняя. Для первой строки после first = number цикл останавливают .
Тонкости:строка с наибольшей суммой и модуль
Чтобы найти строку с наибольшей суммой, хранят и сумму, и номер. Пока подходящих строк не было, лучшей суммы нет — это значение . Ноль вместо него ошибётся, если все суммы отрицательные:
sums = [-7, -3, -9]best_sum = Nonebest_number = Nonefor number, s in enumerate(sums, start=1): if best_sum is None or s > best_sum: best_sum = s best_number = numberprint(best_number, best_sum)При равных суммах сравнение > оставит первую строку, а ≥ — последнюю.
Модуль — расстояние от нуля: равно 8, в таблице — =ABS(A1). Его берут там, где сказано: модуль наименьшего числа −8, −2 — это 8, а наименьший из модулей — 2.
Порядок в строке
Числа строки 2, 5, 5, 9 расположены по возрастанию?
«По возрастанию» — каждое следующее число больше предыдущего, «в неубывающем порядке» — больше или равно. У 2, 5, 5, 9 порядок неубывающий, но не возрастающий: 5 не больше 5. Порядок проверяют на исходной строке — сортировка перед проверкой сделала бы любую строку упорядоченной.
Цепочка сравнений соседей — по возрастанию и в неубывающем порядке:
=И(A1<B1; B1<C1; C1<D1; D1<E1; E1<F1)=И(A1<=B1; B1<=C1; C1<=D1; D1<=E1; E1<=F1)Строка неубывающая, если совпадает со своей упорядоченной копией; возрастающая — если к тому же в ней нет повторов:
a = [2, 5, 5, 9]print(a == sorted(a))print(a == sorted(a) and len(set(a)) == len(a))Тонкости:части строки
Условия о частях строки — «первые четыре числа», «вторая половина» — тоже требуют исходного порядка. В Python часть списка даёт : a[:4] — индексы 0, 1, 2, 3, a[4:] — с индекса 4 до конца. В таблице у частей свои диапазоны, например A1:D1 и E1:H1.
a = [3, 9, 2, 6, 5, 4, 8, 7]first = a[:4]second = a[4:]print(first, second)print(max(a) in first, sum(first) < sum(second))Итого
- Вопроспроверка та же, меняется действие с подходящей строкой
- Фильтрномера листа; заголовок сдвигает на 1
- enumerate
for number, line in enumerate(f, start=1) - Последняя и перваяперезаписывать; первую — с
break - Порядок< — возрастание, ≤ — неубывание; на исходной строке
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
last = number, а для первой нужен ещё break?ОтветСкрыть ответ
last, и после цикла в нём последняя. Без break первая подходящая тоже была бы перезаписана.ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Первая или последняя из равных
Подходящие строки имеют номера 3, 7 и 10, суммы их чисел — 50, 80 и 80. Программа ищет строку с наибольшей суммой и запоминает новую строку, если s >= best. Какой номер она выведет?
Введите число.
Подсказка
Сравнение «больше или равно» заменяет ответ и при равной сумме.
Решение
Наибольшая сумма 80 у строк 7 и 10. Сравнение «больше или равно» заменяет ответ и при равной сумме, поэтому остаётся последняя из них — 10. Со сравнением «больше» осталась бы первая — 7.
Решение программой
rows = [(3, 50), (7, 80), (10, 80)]best = Noneanswer = Nonefor number, s in rows: if best is None or s >= best: best = s answer = numberprint(answer)Ответ: 10
Модуль наименьшего числа
Для чисел −5, −9, 2 найди модуль наименьшего числа.
Введите число.
Подсказка
Сначала найди наименьшее число, потом возьми его модуль.
Решение
Наименьшее число −9, его модуль 9. Наименьший из модулей был бы другим — 2: модуль берут там, где его называет условие.
Решение программой
a = [-5, -9, 2]print(abs(min(a)))Ответ: 9
Первая подходящая строка
Для таблицы 9-8.xlsx, 9-8.txt найди строку с наименьшим номером, в которой одно число встречается дважды, остальные различны, а сумма неповторяющихся чисел меньше повторяющегося числа. В ответе запиши абсолютное значение наименьшего числа этой строки.
Введите число.
Подсказка
Остановись на первой подходящей строке и возьми модуль её наименьшего числа.
Решение
Нужна первая подходящая строка: программа останавливается на ней (break). Структура 2 + 1 + 1 + 1 + 1 + 1, сумма неповторяющихся меньше повторяющегося числа. Модуль берут от уже найденного наименьшего числа строки — 26.
Решение программой
from collections import Counter answer = Nonewith open("9-8.txt") as f: for line in f: a = [int(part) for part in line.split()] counts = Counter(a) pair = [x for x in counts if counts[x] == 2] single = [x for x in a if counts[x] == 1] shape = sorted(counts.values()) if shape == [1, 1, 1, 1, 1, 2]: if sum(single) < pair[0]: answer = abs(min(a)) breakprint(answer)Ответ: 26
Наибольший номер строки
В каждой строке таблицы 9-8.xlsx, 9-8.txt записаны семь целых чисел. Определи наибольший номер строки, в которой числа расположены в неубывающем порядке, одно число встречается трижды, а остальные четыре различны.
Введите число.
Подсказка
Порядок проверяй на исходной строке; номер перезаписывай в каждой подходящей строке.
Решение
Неубывающий порядок проверяют на исходной строке: a == sorted(a). Структура 3 + 1 + 1 + 1 + 1. Номер запоминают в каждой подходящей строке, и после цикла остаётся последний — 992.
Решение программой
from collections import Counter answer = 0with open("9-8.txt") as f: for number, line in enumerate(f, start=1): a = [int(part) for part in line.split()] shape = sorted(Counter(a).values()) if a == sorted(a) and shape == [1, 1, 1, 1, 3]: answer = numberprint(answer)Ответ: 992