К содержанию

Подтема 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.

Таблица

Подходящие строки удобно найти : включи фильтр по столбцу «Подходит» и оставь ИСТИНА. Видны только подходящие строки, слева — их номера на листе; сколько строк найдено, программа пишет внизу окна.

O7=И(СЧЁТЕСЛИ(G7:L7;2)=2;СЧЁТЕСЛИ(G7:L7;1)=4;M7>4*N7)
ABCDEFGHIJKLMNO
1ч1ч2ч3ч4ч5ч6п1п2п3п4п5п6ОдиночныеПараПодходит
22257911221111324ИСТИНА
777202224262211119214ИСТИНА
Формулы в ячейках
  • 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. Если в вопросе номер строки, вычти строку заголовков.

Без фильтра номер даёт — номер строки листа, где стоит формула. Её ставят в подходящих строках, в остальных — пустой текст ""; затем МАКС даёт последнюю строку, МИН — первую, СУММ — сумму номеров:

P2=ЕСЛИ(O2;СТРОКА()-1;"")
P8=МАКС(P2:P7)
Python

выдаёт строки файла вместе с номерами: в 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)
6 106

Файл читается сверху вниз, и каждая новая подходящая строка заменяет прежний ответ — после цикла в 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)
2 -3

При равных суммах сравнение > оставит первую строку, а ≥ — последнюю.

Модуль — расстояние от нуля: равно 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)
Python

Строка неубывающая, если совпадает со своей упорядоченной копией; возрастающая — если к тому же в ней нет повторов:

a = [2, 5, 5, 9]print(a == sorted(a))print(a == sorted(a) and len(set(a)) == len(a))
True False
Тонкости:части строки

Условия о частях строки — «первые четыре числа», «вторая половина» — тоже требуют исходного порядка. В 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))
[3, 9, 2, 6] [5, 4, 8, 7] True True

Итого

  • Вопроспроверка та же, меняется действие с подходящей строкой
  • Фильтрномера листа; заголовок сдвигает на 1
  • enumeratefor number, line in enumerate(f, start=1)
  • Последняя и перваяперезаписывать; первую — с break
  • Порядок< — возрастание, ≤ — неубывание; на исходной строке

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Подходят строки с номерами 2, 5 и 9. Назови номер последней, номер первой и сумму номеров.
ОтветСкрыть ответ
Ответ
9, 2 и 16.
Вопрос 2
На листе первая строка — заголовки. После фильтра подходящая строка видна под номером 15. Какой это номер в данных задачи?
ОтветСкрыть ответ
Ответ
14: заголовок сдвигает номера строк данных на единицу.
Вопрос 3
Числа 3, 5, 5, 8 расположены в неубывающем порядке? По возрастанию?
ОтветСкрыть ответ
Ответ
В неубывающем — да, по возрастанию — нет: 5 не больше 5.
Вопрос 4
Почему для последней подходящей строки достаточно last = number, а для первой нужен ещё break?
ОтветСкрыть ответ
Ответ
Каждая следующая подходящая строка перезаписывает last, и после цикла в нём последняя. Без break первая подходящая тоже была бы перезаписана.
Вопрос 5
Для чисел −5, −2, 4 найди модуль наименьшего числа и наименьший из модулей.
ОтветСкрыть ответ
Ответ
5 и 2: |−5| = 5, а модули 5, 2, 4 дают наименьший 2.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Первая или последняя из равных

Подходящие строки имеют номера 3, 7 и 10, суммы их чисел — 50, 80 и 80. Программа ищет строку с наибольшей суммой и запоминает новую строку, если s >= best. Какой номер она выведет?

Введите число.

Модуль наименьшего числа

Для чисел −5, −9, 2 найди модуль наименьшего числа.

Введите число.

Первая подходящая строка

Для таблицы 9-8.xlsx, 9-8.txt найди строку с наименьшим номером, в которой одно число встречается дважды, остальные различны, а сумма неповторяющихся чисел меньше повторяющегося числа. В ответе запиши абсолютное значение наименьшего числа этой строки.

9-8.xlsxТаблица чисел — Excel-файл, как на экзаменеExcel · 33,0 КБ9-8.txtТа же таблица текстом: строка файла — строка таблицы, числа через пробелТекстовый файл · 22,6 КБ

Введите число.

Наибольший номер строки

В каждой строке таблицы 9-8.xlsx, 9-8.txt записаны семь целых чисел. Определи наибольший номер строки, в которой числа расположены в неубывающем порядке, одно число встречается трижды, а остальные четыре различны.

9-8.xlsxТаблица чисел — Excel-файл, как на экзаменеExcel · 33,0 КБ9-8.txtТа же таблица текстом: строка файла — строка таблицы, числа через пробелТекстовый файл · 22,6 КБ

Введите число.