Задание 8:
перебор слов и чисел

Из заданных букв составили все слова — сколько из них подходит и под каким номером нужное стоит в списке.
Всё задание — один перебор и пара строк условий.

Базовый уровень, один балл. Ответ — одно целое число.

условие

Как это выглядит на экзамене

Все пятибуквенные слова из букв А, К, Ц, Е, Н, Т записаны в алфавитном порядке и пронумерованы:

1. ААААА   2. ААААЕ   3. ААААК
4. ААААН   5. ААААТ   6. ААААЦ   …

Под каким номером стоит первое слово с чётным номером, которое не начинается с букв А, Е или К и содержит хотя бы одну букву Т?

Что дано

Набор букв, длина слова и условия. Слов 65 = 7776 — руками не перебрать, машине — доля секунды.

Где теряют балл

Не в условиях, а в порядке букв и в номере: буквы в условии идут вразнобой, а список — по алфавиту.

Вторая половина задач — про числа: «сколько семеричных пятизначных чисел…». Это те же слова, только из цифр.

формы

О чём спрашивают

Сколько чиселусловие на состав цифр: ровно две чётные, не более двух цифр 7, не оканчиваются на 2 или 6
Сколько чиселусловие на соседей: нет одинаковых подряд, нечётная не стоит рядом с нулём
Сколько словкодовые слова: не начинается с гласной, не оканчивается согласной
Номер первогопервое подходящее слово в алфавитном списке, часто — с чётным номером
Номер последнегопоследнее подходящее, часто — с нечётным номером
Сколько в спискесколько подходящих слов с нечётными номерами

Замер по 14 задачам экзаменов 2024–2027: числа — 7, список — 6, кодовые слова — 1. Шесть форм — шесть задач практикума.

инструмент

product перебирает все слова

from itertools import *
for w in product('АБ', repeat=3):
    w = ''.join(w)
    print(w)

product даёт кортеж букв ('А', 'Б', 'А'), ''.join склеивает его в строку 'АБА'.

ААА
ААБ
АБА
АББ
БАА
БАБ
ББА
БББ

Это и есть алфавитный список

Последняя буква меняется быстрее всех — как в словаре. Номер слова — просто счётчик.

ловушка №1

Буквы — по алфавиту

Как в условии: 'АКЦЕНТ'

1. ААААА
2. ААААК   # а в условии ААААЕ
3. ААААЦ

Порядок другой — и все номера другие. Ответ выйдет 2598 вместо 3914.

По алфавиту: 'АЕКНТЦ'

1. ААААА
2. ААААЕ
3. ААААК

Совпало с началом списка в условии. Сверяй всегда: условие само показывает первые строки.

номер

Номер слова — счётчик n

n = 0
for w in product('АЕКНТЦ', repeat=5):
    w = ''.join(w)
    n += 1         # ДО проверки
    if ...:
  • n += 1 стоит до проверки: у первого слова номер 1, как в списке;
  • «с чётным номером» — n % 2 == 0, «с нечётным» — n % 2 == 1;
  • чётность — свойство номера, а не слова и не счёта подходящих.
разбор

Демоверсия 2027: по шагам

Буквы А, К, Ц, Е, Н, Т, слова из 5 букв, алфавитный список.

Первое слово с чётным номером, которое не начинается с А, Е или К и содержит хотя бы одну Т.

инструмент

То же самое в Python

Все пятибуквенные слова из букв А, К, Ц, Е, Н, Т записаны в алфавитном порядке и пронумерованы.

Под каким номером стоит первое слово с чётным номером, которое не начинается с букв А, Е или К и содержит хотя бы одну букву Т?

from itertools import *
n = 0                                  # номер слова в списке
for w in product('АЕКНТЦ', repeat=5):  # буквы ПО АЛФАВИТУ
    w = ''.join(w)
    n += 1
    if (n % 2 == 0 and                 # номер чётный
            w[0] not in 'АЕК' and      # не начинается с А, Е, К
            w.count('Т') >= 1):        # хотя бы одна Т
        print(n)                       # первое — и сразу стоп
        break
3914

Длинное условие удобно разбить по строкам в скобках — по условию на строку, с комментарием.

конец программы

Первое, последнее, сколько

Первое

    if ...:
        print(n)
        break

Нашли — печатаем и выходим.

Последнее

    if ...:
        last = n
print(last)

Запоминаем каждое, в конце в last — последнее.

Сколько

    if ...:
        k += 1
print(k)

Считаем. k = 0 до цикла.

В демоверсии «последнее» вместо «первого» дало бы 7770 — перепутать концы программы стоит балла.

числа

Число — это слово из цифр

Сколько существует восьмеричных пятизначных чисел, которые не начинаются с нечётной цифры и содержат ровно две цифры 7?

k = 0
for w in product('01234567', repeat=5):
    w = ''.join(w)
    if (w[0] != '0' and          # без нуля впереди
            w[0] not in '1357' and
            w.count('7') == 2):
        k += 1
print(k)
882

Ноль впереди

'00717' — не пятизначное число. У 15-ричной цифры — '0123456789ABCDE'.

числа

Соседние цифры: флаг ok

Сколько шестеричных пятизначных чисел, в записи которых ровно одна цифра 0, при этом никакая нечётная цифра не стоит рядом с нулём?

    ok = True
    for i in range(len(w) - 1):
        a, b = w[i], w[i + 1]
        if ((a == '0' and b in '135') or
                (b == '0' and a in '135')):
            ok = False
    if w[0] != '0' and w.count('0') == 1 and ok:
        k += 1
550

Тот же флаг ok, что в задании 1: одна плохая пара — и число выбывает. Нет двух Ц рядом — короче: 'ЦЦ' not in w.

числа · второй способ

Соседи короче: замена

Все нечётные цифры заменяем одной — '1'. Тогда «нечётная рядом с нулём» — это просто кусок '01' или '10' в строке.

    s = w                    # копия: w ещё нужен
    for c in '135':
        s = s.replace(c, '1')
    if (w[0] != '0' and
            w.count('0') == 1 and
            s.count('01') == 0 and
            s.count('10') == 0):
        k += 1
550
ws
2405324011есть '01' — мимо
3042210422есть '10' — мимо
3402214022подходит

Меняем копию

После замены в s не видно, какие были цифры. Поэтому w[0] и w.count('0') проверяем по исходной строке w.

Ответ тот же, 550. Оба способа верны — выбирай, какой понятнее.

слова

Каждая буква ровно один раз

Шестибуквенные слова из букв Л, И, С, Т, О, К по алфавиту. Номер первого слова с нечётным номером, которое начинается с С и в котором каждая буква встречается ровно один раз?

слова

Что выдаёт permutations

product('ИКЛОСТ', repeat=6) — все слова из 6 букв: 66 = 46 656. Буквы в слове могут повторяться: ИИИИИИ, ИИИИИК, СИКОТС…

permutations('ИКЛОСТ') — только перестановки: слова, где каждая из шести букв стоит ровно один раз, ни одна буква в слове не повторяется: ИКЛОСТ, ИКЛОТС, ИКЛСОТ… Таких 6! = 720.

Номера у них разные

Слово СИКЛОТ в полном списке из условия стоит под номером 31 416, а у permutations — под номером 481: перед ним нет слов с повторами. Даже чётность номера другая.

Поэтому номер — только через product

Перебираем весь список и оставляем слова без повторов условием len(set(w)) == len(w) — как на прошлом слайде.

слова

Когда permutations можно

Сколько существует шестибуквенных слов из букв Л, И, С, Т, О, К, которые начинаются с С и в которых каждая буква встречается ровно один раз?

Номера в вопросе нет — нужно только количество.

Правило

В вопросе есть номер (первое, последнее, чётный номер) — только product. Номера нет, спрашивают «сколько», и буквы не повторяются — годится и permutations.

k = 0
for w in permutations('ИКЛОСТ'):
    w = ''.join(w)
    if w[0] == 'С':
        k += 1
print(k)
120

permutations выдаёт каждое слово без повторов ровно один раз — их можно просто посчитать. product с условием len(set(w)) == len(w) даст те же 120.

сравнение

Одна задача — два перебора

Сколько шестибуквенных слов из букв Л, И, С, Т, О, К начинаются с С, и каждая буква в слове встречается ровно один раз?

product: все слова, лишние отсеиваем

k = 0
for w in product('ИКЛОСТ', repeat=6):
    w = ''.join(w)
    if w[0] == 'С' and len(set(w)) == len(w):
        k += 1
print(k)
120

permutations: только слова без повторов

k = 0
for w in permutations('ИКЛОСТ'):
    w = ''.join(w)
    if w[0] == 'С':
        k += 1
print(k)
120
productpermutations
сколько слов перебирает66 = 46 6566! = 720
условие «буквы не повторяются»пишем сами: len(set(w)) == len(w)не нужно — повторов там нет
номер слова nкак в списке из условиясвой, с условием не совпадает
шпаргалка

Что писать под условие

В условииВ программе
ровно две буквы Т · не более одной Сw.count('Т') == 2 · w.count('С') <= 1
не начинается с букв А, Е или Кw[0] not in 'АЕК'
оканчивается цифрами 2 или 6w[-1] in '26'
ни одной из букв В, Е, К'В' not in w and 'Е' not in w and 'К' not in w
ровно две чётные цифрысчётчик even в цикле по w
каждая буква ровно один разlen(set(w)) == len(w)
кодовое слово не начинается с гласнойw[0] not in 'АЕ' — гласные из этого набора
ловушки

Пять ловушек

  1. Буквы не по алфавиту. Сверь первые строки перебора с началом списка в условии.
  2. Номер с нуля. n += 1 до проверки.
  3. Ноль впереди. w[0] != '0' у любых «N-значных чисел».
  4. Чётность. n % 2 — номер, а не буква.
  5. Первое или последнее. break против last = n.

Страница практикума узнаёт эти ошибки по ответу и подсказывает, какая из них случилась.

практикум

Что дальше

Шесть задач — по одной на каждую форму вопроса, все на экране сразу, порядок свой. Ошибся — появится разбор и программа, которая решает именно эту задачу, а кнопка «Новые числа» даст такую же с другими буквами.

Числасостав цифр · соседние цифры
Словакодовые слова · номер первого · номер последнего · сколько в списке

Отметка практикума: шесть задач — «5», пять — «4», четыре — «3».

дома

Домашняя работа

Те же шесть форм вопроса, по одной задаче на каждую. Тип закрывается одним верным ответом; ошибся — придёт такая же задача с другими буквами.

Как сдать

От четырёх закрытых типов появится код работы вида SL-XXXX-XXXX и кнопка «Сдать работу».

Вторая кнопка открывает письмо: к коду прикладываются снимки своих программ и того, что они напечатали.

Зачем снимок

Число можно получить и не написав программу. Снимок кода показывает, что приём ваш, — поэтому он и просится вместе с ответом.

Отметка: шесть типов — «5», пять — «4», четыре — «3». В начале следующей пары — проверочная из пяти задач.

Материалы подготовлены с использованием технологий искусственного интеллекта. Пробел раскрыть и дальше · ← → слайды