Задание 8
Измерение количества информации
Как посчитать слова с условиями на буквы — рассуждением и перебором — и найти номер слова в списке по алфавиту.
6 подтем · 56 задач + 5 дополнительных · базовый · ≈ 4 мин
Подтема 1 из 6
Слова и перебор
Что такое слово и алфавит, как считать слова умножением и сложением и как перебрать их программой.
Как устроена тема
В задании 8 из заданных букв составляют слова и спрашивают, сколько из них подходят под условие, — или какой номер у слова в списке по алфавиту. Вот задача, которую мы будем решать всю тему:
«Все пятибуквенные слова, составленные из букв Т, О, Р, К, А, записаны в алфавитном порядке и пронумерованы, начиная с 1. Сколько слов с нечётными номерами не начинаются с буквы А, содержат ровно две буквы О и не содержат двух букв О подряд?»
Каждое ограничение превращают в отдельное правило, а слова считают рассуждением или перебирают программой. Сначала разберём, что сказано в условии:
| В условии | Что это значит |
|---|---|
| пятибуквенные слова из букв Т, О, Р, К, А | на каждом из пяти мест — любая из пяти букв, повторы можно |
| записаны в алфавитном порядке и пронумерованы с 1 | у каждого слова есть номер в общем списке |
| с нечётными номерами | смотрим только на слова 1, 3, 5, … |
| не начинаются с буквы А | первая буква — не А |
| ровно две буквы О, нет двух О подряд | две О, и они не стоят рядом |
Тема состоит из шести подтем — у каждой своя страница. Идём по ним по порядку:
- Слова и перебор — ты сейчас здесь.
- Сколько раз встречается буква — «ровно две О», «хотя бы одна», «не более».
- Соседние буквы — условия вида «нет двух О подряд».
- Числа в системе счисления — когда слово — это запись числа.
- Нумерованный список — номер слова по алфавиту и ответ задачи темы: 168.
- Когда перебор не успевает — дополнительный урок для очень длинных слов.
Каждый приём показан и рассуждением, и программой. На экзамене подойдёт любой способ, а второй пригодится для проверки.
Алфавит и слово
Слово здесь — любая последовательность букв, смысл не важен, а порядок важен. КОТ и ТОК — разные слова; ООАКР — тоже слово.
Набор разрешённых букв называют алфавитом. В задаче темы алфавит — пять букв Т, О, Р, К, А, длина слова — 5. Если не сказано иное, буквы могут повторяться.
«Из букв слова КОЛОС» значит алфавит из различных букв К, О, Л, С. А «переставить все буквы слова КОЛОС» — другое условие: каждую букву нужно использовать столько раз, сколько она встречается (подтема 2).
Правило умножения
Число слов находят умножением: на каждом месте выбор разветвляется. Двухсимвольный код, где первый символ — А или Б, а второй — 0, 1 или 2, имеет 2 · 3 = 6 вариантов:
Пятибуквенных слов из Т, О, Р, К, А — 5 · 5 · 5 · 5 · 5 = 5⁵ = 3125. Ограничение на одно место меняет только его множитель: слов, которые не начинаются с А, 4 · 5⁴ = 2500.
Сложение и «или»
Непересекающиеся случаи складывают; если случаи пересекаются, общие слова вычитают один раз. Слов длины 2 или 3 из пяти букв — 5² + 5³ = 150: слово не может иметь сразу две длины.
А трёхбуквенных слов из АОБВГ, которые начинаются с А или заканчиваются на А, не 25 + 25: пять слов вида А?А попали в оба случая.
Без повторений
Если буквы не повторяются, каждый следующий множитель на единицу меньше. Трёхбуквенных слов из пяти букв без повторений 5 · 4 · 3 = 60: какие бы буквы ни выбрали раньше, вариантов всегда на одну меньше.
Переставить все пять различных букв можно 5 · 4 · 3 · 2 · 1 = 120 способами. Такое произведение записывают как 5! («пять факториал»).
Перебор product
Программа перебирает те же позиции, что и рассуждение, и проверяет каждое слово. Двухсимвольный код из дерева выше перебирают двумя :
for first in 'АБ': for second in '012': print(first + second)Для пяти мест вместо пяти вложенных циклов берут функцию product из : product('АКОРТ', repeat=5) выдаёт все наборы из пяти букв по очереди. ''.join(letters) склеивает набор в строку, а счётчик растёт на каждом подходящем слове:
from itertools import product count = 0for letters in product('АКОРТ', repeat=5): word = ''.join(letters) if word[0] != 'А': count += 1print(count)Программа дала то же 2500, что и умножение. Первая буква — word[0], последняя — word[-1].
Слова без повторений перебирает permutations из того же модуля:
from itertools import permutations print(len(list(permutations('АОБВГ', 3))))Тонкости:сколько успеет перебор
product из m букв длины n создаёт mⁿ вариантов. Сотни тысяч и миллионы проходят за секунды, а 8¹⁰ ≈ 10⁹ — уже слишком долго. Как считать такие задачи, разобрано в дополнительном уроке.
Итого
- Словопоследовательность букв; порядок важен
- Умножениеmⁿ слов длины n из m букв
- Сложениенепересекающиеся случаи; общие вычесть один раз
- Без повторов5 · 4 · 3; все n букв — n!
- productперебор всех слов, проверка, счётчик
Проверьте себя
Ответь сначала сам, потом открой ответ.
АКОРТ 5⁵, а не 5 · 5 = 25?ОтветСкрыть ответ
КОЛОС, если буквы могут повторяться?ОтветСкрыть ответ
АКОРТ не начинаются и не заканчиваются на А?ОтветСкрыть ответ
АБВ?ОтветСкрыть ответ
ПЛОТ?ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Буквы слова КОЛОС
Слова длины 3 составляются из букв слова КОЛОС, буквы могут повторяться. Сколько таких слов?
Введите число.
Подсказка
Разрешённые буквы — различные буквы слова.
Решение
Различных букв в слове КОЛОС четыре — К, О, Л, С. На каждое из трёх мест — любая из них: 4³ = 64.
Решение программой
from itertools import product count = 0for letters in product('КОЛС', repeat=3): word = ''.join(letters) if True: count += 1print(count)Ответ: 64
Слова из пяти букв длины 4
Сколько существует четырёхбуквенных слов из пяти различных букв, если повторения разрешены?
Введите число.
Подсказка
На каждом месте любая из пяти букв.
Решение
На каждое из четырёх мест можно поставить любую из пяти букв: 5 · 5 · 5 · 5 = 5⁴ = 625.
Решение программой
print(5 ** 4)Ответ: 625
Начинается с А, кончается не на А
Алфавит — буквы А, Б, В, Г, Д. Сколько четырёхбуквенных слов начинается с А и заканчивается любой другой буквой? Повторения разрешены.
Введите число.
Подсказка
Ограничение на место меняет только его множитель.
Решение
Первое место — только А, второе и третье — любая из пяти букв, последнее — любая, кроме А: 1 · 5 · 5 · 4 = 100.
Решение программой
from itertools import product count = 0for letters in product('АБВГД', repeat=4): word = ''.join(letters) if word[0] == 'А' and word[-1] != 'А': count += 1print(count)Ответ: 100
Коды Пети
Петя составляет 5-буквенные коды из букв К, Р, О, Н, А. Каждую букву можно использовать любое количество раз, при этом код не может начинаться с буквы Р и должен заканчиваться гласной. Сколько различных кодов может составить Петя?
Введите число.
Подсказка
Первое и последнее места имеют свои множители.
Решение
Первое место — любая буква, кроме Р (4 варианта), три средних — любые из пяти, последнее — гласная О или А (2 варианта): 4 · 5 · 5 · 5 · 2 = 1000.
Решение программой
from itertools import product count = 0for letters in product('КРОНА', repeat=5): word = ''.join(letters) if word[0] != 'Р' and word[-1] in 'ОА': count += 1print(count)Ответ: 1000
Слова длины от 1 до 3
Сколько существует слов длины от 1 до 3 из букв А, Б, В? Повторения разрешены.
Введите число.
Подсказка
Слова разной длины не пересекаются — складываем.
Решение
Однобуквенных слов 3, двухбуквенных 3² = 9, трёхбуквенных 3³ = 27. Слова разной длины не пересекаются, поэтому 3 + 9 + 27 = 39.
Решение программой
print(sum(3 ** n for n in range(1, 4)))Ответ: 39
Начинается с Б или кончается на О
Сколько четырёхбуквенных слов из АОБВГ начинается с Б или заканчивается на О?
Введите число.
Подсказка
Слова вида Б??О вошли в оба случая.
Решение
Слов на Б — 5³ = 125, слов на О в конце — тоже 125. Слова вида Б??О попали в оба случая, их 5² = 25: 125 + 125 − 25 = 225.
Решение программой
from itertools import product count = 0for letters in product('АОБВГ', repeat=4): word = ''.join(letters) if word[0] == 'Б' or word[-1] == 'О': count += 1print(count)Ответ: 225
Без повторений из шести букв
Сколько четырёхбуквенных слов можно составить из шести различных букв без повторений?
Введите число.
Подсказка
Каждая следующая буква — из оставшихся.
Решение
Первая буква — любая из шести, каждая следующая — из оставшихся: 6 · 5 · 4 · 3 = 360.
Решение программой
from itertools import permutations count = 0for letters in permutations('АБВГДЕ', 4): word = ''.join(letters) if True: count += 1print(count)Ответ: 360
Перестановки слова ПЛОТ
Сколько различных слов получается перестановкой всех букв слова ПЛОТ?
Введите число.
Подсказка
Все буквы различны.
Решение
Все четыре буквы различны, поэтому перестановок 4 · 3 · 2 · 1 = 4! = 24.
Решение программой
from itertools import permutations count = 0for letters in permutations('ПЛОТ', 4): word = ''.join(letters) if True: count += 1print(count)Ответ: 24
Коды Маши
Маша составляет 6-буквенные коды из букв С, Л, И, В, А, Т. Каждую букву нужно использовать ровно один раз, при этом код не может начинаться с гласной и не может заканчиваться буквой Т. Сколько различных кодов может составить Маша?
Введите число.
Подсказка
Разбери случаи: код начинается с Т или с другой согласной.
Решение
Если код начинается с Т, последняя буква — любая из пяти оставшихся, середина — 4! способами: 5 · 24 = 120. Если код начинается с С, Л или В, последняя буква — не Т и не первая (4 варианта): 3 · 4 · 24 = 288. Всего 120 + 288 = 408.
Решение программой
from itertools import permutations count = 0for letters in permutations('СЛИВАТ', 6): word = ''.join(letters) if word[0] not in 'ИА' and word[-1] != 'Т': count += 1print(count)Ответ: 408