1. Введение

В задании №8 нужно работать со словами или числами, составленными из заданного набора символов. Обычно требуется определить количество подходящих вариантов, номер первого или последнего слова либо само слово с нужными свойствами.

Задание проверяет умение:

  • строить все последовательности заданной длины;
  • соблюдать алфавитный порядок;
  • проверять символы и их количество в строке;
  • различать номер объекта в полном списке и количество подходящих объектов;
  • точно переносить несколько условий в одно логическое выражение.

Главная идея: генерируем варианты в правильном порядке, превращаем каждый вариант в строку, проверяем условия и выводим именно ту величину, которую спрашивают.

2. Теория

Библиотека itertools и product

Функция product создаёт все последовательности заданной длины с повторениями. Каждый символ может встречаться несколько раз, если условие задачи это не запрещает.

Параметр repeat=3 означает три позиции. На каждой позиции product независимо выбирает один из символов строки 'АБ'. Результат одного шага — кортеж, например ('А', 'Б', 'А').

product не сортирует алфавит сам. Он сохраняет порядок переданной последовательности. Поэтому при нумерации слов удобно писать product(sorted('АКЦЕНТ'), repeat=5).

1

Как заменить product вложенными циклами

product — это короткая запись вложенных циклов. Для слов длины 3 оба варианта ниже выполняют один и тот же перебор.

# product
for a, b, c in product(alf, repeat=3):
    word = a + b + c

# вложенные циклы
for a in alf:
    for b in alf:
        for c in alf:
            word = a + b + c

Для пятибуквенных слов понадобится пять вложенных циклов, для шестибуквенных — шесть. Поэтому product короче и в нём сложнее ошибиться с отступами.

Если в алфавите m символов, а длина слова равна n, product создаст mⁿ вариантов. Например, для 6 букв и длины 5 получится 6⁵ = 7776 слов.

Работа со строками

product возвращает кортеж символов. Чтобы получить обычную строку, используем ''.join(symbols). После этого доступны индексы, срезы и строковые методы.

1

Номер или количество

ПроверкаЧто она означает
len(s) == 5длина строки равна 5
s[0] == 'А'первый символ — А
s[-1] != 'О'последний символ — не О
s.count('Ц') >= 2буква Ц встречается не менее двух раз
'А' not in sв строке нет буквы А
s[0] not in 'АЕК'первый символ не равен А, Е или К
len(set(s)) == len(s)все символы строки различны
all(s[i] != s[i+1] for i in range(len(s)-1))никакие одинаковые символы не стоят рядом

set(s) оставляет каждый различный символ только один раз. Поэтому равенство len(set(s)) == len(s) означает, что повторов нет. Например, для слова 'ПОБЕДА' обе длины равны 6.

Номер или количество

1
number = 0   # номер в полном списке
count = 0    # количество подходящих

for symbols in product(alf, repeat=5):
    number += 1
    word = ''.join(symbols)
    if условие:
        count += 1

3. Пошаговое решение задачи кодом

Основная волна 2026 (день 1)

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

Код

from itertools import product

n = 0  # номер слова в полном списке
for i in product(sorted('АКЦЕНТ'), repeat=5):
    s = ''.join(i)  # превращаем кортеж букв в строку
    n += 1
    # проверяем чётность номера, первую букву и количество букв Ц
    if n % 2 == 0 and s[0] not in 'АЕК' and s.count('Ц') >= 2:
        print(n)
        break  # найдено первое подходящее слово

Ответ: 3924

Все части условия соединены оператором and, потому что они должны выполняться одновременно. Первым подходящим является слово НААЦЦ под номером 3924.

Частые ошибки

  • Забыть sorted, когда требуется номер слова в алфавитном списке. product перебирает символы ровно в том порядке, в котором они переданы.
  • Перепутать номер слова и количество подходящих слов. Номер увеличивается на каждом слове, а количество — только внутри выполненного условия.
  • При переборе чисел разрешить ведущий ноль. Для строки нужна проверка a[0] != '0'. Запись a[0] != 0 неверна: a[0] — символ строки, а не число.
  • Смешать кириллицу и латиницу. Символы А/A, В/B, С/C, Е/E, Н/H, К/K, М/M, О/O, Р/P, Т/T, Х/X выглядят похоже, но Python считает их разными.

4. Практика

Задача 1. Основная волна 2026

Все шестибуквенные слова, составленные из букв П, Л, А, Н, Е, Р, записаны в алфавитном порядке и пронумерованы.

Вот начало списка:

  1. АААААА
  2. АААААЕ
  3. АААААЛ
  4. АААААН
  5. АААААП
  6. АААААР

...

Определите, под каким номером в этом списке стоит последнее слово с нечётным номером, в записи которого не содержится ни одной из букв П или Р и при этом имеется ровно две буквы А и ровно одна буква Н.

Примечание. Слово — последовательность идущих подряд букв, не обязательно осмысленная.

Решение на Python

from itertools import product

alf = sorted('ПЛАНЕР')  # алфавитный порядок
nomer = 0               # номер слова
otv = []                # номера подходящих слов

for i in product(alf, repeat=6):
    slovo = ''.join(i)
    nomer += 1
    # переносим в код все условия задачи
    if nomer % 2 != 0 and slovo.count('П') == 0 and slovo.count('Р') == 0 and slovo.count('А') == 2 and slovo.count('Н') == 1:
        otv.append(nomer)

print(max(otv))  # номер последнего подходящего слова

Ответ: 26425

Задача 2.

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

Вот начало списка:

  1. ААААА
  2. ААААК
  3. ААААО
  4. ААААР
  5. ААААС
  6. ААААТ

Определите, под каким номером в этом списке стоит последнее слово с чётным номером, которое не начинается с букв А, С или Т и при этом содержит в своей записи ровно две буквы О.

Примечание. Слово – последовательность идущих подряд букв, не обязательно осмысленная.

Решение на Python

from itertools import product

alf = sorted('СТРОКА')  # алфавитный порядок
nomer = 0
o = []

for i in product(alf, repeat=5):
    slovo = ''.join(i)
    nomer += 1

    # чётный номер, допустимая первая буква и ровно две буквы О
    if nomer % 2 == 0 and slovo[0] not in 'АСТ' and slovo.count('О') == 2:
        o.append(nomer)

print(max(o))  # последнее подходящее слово

Ответ: 5058

Задача 3. Шестнадцатеричные числа

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

Ключевой момент

Мы перебираем строки, изображающие числа. Поэтому первый символ сравнивается со строкой '0'. Проверка соседей рассматривает пары с индексами 0–1, 1–2 и 2–3.

Решение на Python

from itertools import product

k = 0
for i in product('0123456789ABCDEF', repeat=4):
    a = ''.join(i)
    # нет ведущего нуля, цифра 3 одна, соседние цифры различны
    if a[0] != '0' and a.count('3') == 1 and all(a[j] != a[j+1] for j in range(3)):
        k += 1

print(k)

Ответ: 11564

Задача 4. Все буквы различны

Все шестибуквенные слова, в составе которых могут быть только буквы П, О, Б, Е, Д, А, записаны в алфавитном порядке и пронумерованы начиная с 1.

Ниже приведено начало списка.

  1. АААААА
  2. АААААБ
  3. АААААД
  4. АААААЕ
  5. АААААО
  6. АААААП

...

Определите последний чётный номер слова, которое начинается с буквы О и в котором каждая буква встречается ровно один раз.

Примечание. Слово – последовательность идущих подряд букв, не обязательно осмысленная.

Почему здесь подходит set

set(word) оставляет каждый символ только один раз. Слово имеет длину 6. Если len(set(word)) == 6, значит после удаления повторов длина не уменьшилась и все шесть букв различны.

Решение на Python

from itertools import product

alf = sorted('ПОБЕДА')
nomer = 0
for i in product(alf, repeat=6):
    slovo = ''.join(i)
    nomer += 1
    # set оставляет каждую букву в одном экземпляре
    if slovo[0] == 'О' and len(set(slovo)) == 6 and nomer % 2 == 0:
        print(nomer)  # берём последний вывод

Ответ: 38306

Задача 5. Чередование чётности

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

Ключевой момент

Если рядом не могут стоять две цифры одинаковой чётности, то чётность соседних цифр должна чередоваться. Сумма чётной и нечётной цифры нечётна, поэтому для каждой соседней пары проверяем остаток 1 при делении суммы на 2.

Решение на Python

from itertools import product

k = 0
for i in product('0123456789', repeat=4):
    a = ''.join(i)
    if a[0] != '0' and len(set(a)) == len(a):
        # заменяем чётные на 0, нечётные на 1
        a2 = a.replace('2','0').replace('4','0')\
              .replace('6','0').replace('8','0')
        a2 = a2.replace('3','1').replace('5','1')\
               .replace('7','1').replace('9','1')
        # одинаковые цифры рядом означают одинаковую чётность
        if a2.count('00') == 0 and a2.count('11') == 0:
            k += 1

print(k)

Ответ: 720