1. Введение
В задании №8 нужно работать со словами или числами, составленными из заданного набора символов. Обычно требуется определить количество подходящих вариантов, номер первого или последнего слова либо само слово с нужными свойствами.
Задание проверяет умение:
- строить все последовательности заданной длины;
- соблюдать алфавитный порядок;
- проверять символы и их количество в строке;
- различать номер объекта в полном списке и количество подходящих объектов;
- точно переносить несколько условий в одно логическое выражение.
Главная идея: генерируем варианты в правильном порядке, превращаем каждый вариант в строку, проверяем условия и выводим именно ту величину, которую спрашивают.
2. Теория
Библиотека itertools и product
Функция product создаёт все последовательности заданной длины с повторениями. Каждый символ может встречаться несколько раз, если условие задачи это не запрещает.
Параметр repeat=3 означает три позиции. На каждой позиции product независимо выбирает один из символов строки 'АБ'. Результат одного шага — кортеж, например ('А', 'Б', 'А').
product не сортирует алфавит сам. Он сохраняет порядок переданной последовательности. Поэтому при нумерации слов удобно писать product(sorted('АКЦЕНТ'), repeat=5).
Как заменить 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). После этого доступны индексы, срезы и строковые методы.
Номер или количество
| Проверка | Что она означает |
|---|---|
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.
Номер или количество
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
Все шестибуквенные слова, составленные из букв П, Л, А, Н, Е, Р, записаны в алфавитном порядке и пронумерованы.
Вот начало списка:
- АААААА
- АААААЕ
- АААААЛ
- АААААН
- АААААП
- АААААР
...
Определите, под каким номером в этом списке стоит последнее слово с нечётным номером, в записи которого не содержится ни одной из букв П или Р и при этом имеется ровно две буквы А и ровно одна буква Н.
Примечание. Слово — последовательность идущих подряд букв, не обязательно осмысленная.
Решение на 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.
Все пятибуквенные слова, составленные из букв С, Т, Р, О, К, А, записаны в алфавитном порядке и пронумерованы.
Вот начало списка:
- ААААА
- ААААК
- ААААО
- ААААР
- ААААС
- ААААТ
Определите, под каким номером в этом списке стоит последнее слово с чётным номером, которое не начинается с букв А, С или Т и при этом содержит в своей записи ровно две буквы О.
Примечание. Слово – последовательность идущих подряд букв, не обязательно осмысленная.
Решение на 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.
Ниже приведено начало списка.
- АААААА
- АААААБ
- АААААД
- АААААЕ
- АААААО
- АААААП
...
Определите последний чётный номер слова, которое начинается с буквы О и в котором каждая буква встречается ровно один раз.
Примечание. Слово – последовательность идущих подряд букв, не обязательно осмысленная.
Почему здесь подходит 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