Подтема 3 из 6
Соседние буквы
Условия на соседние буквы: «не рядом», «нет двух подряд», блок и чередование.
Соседние пары
Последнее условие задачи темы о буквах: в слове нет двух О подряд.
Соседние — буквы на позициях 1 и 2, 2 и 3, …: в слове длины n их n − 1 пар. Первая и последняя буквы соседними не считаются.
Запреты «нет двух одинаковых букв подряд», «нет двух А подряд», «нет двух гласных подряд» и «А и Б не стоят рядом» — четыре разных условия. Выбери запрет, чтобы увидеть, нарушает ли его слово АООБ:
- одинаковые подряд
- нарушает: О и О стоят рядом
- две А подряд
- не нарушает: А в слове одна
- две гласные подряд
- нарушает: рядом А и О, О и О
- А и Б рядом
- не нарушает: между А и Б две буквы
Промежутки
Чтобы одинаковые буквы не стояли рядом, сначала ставят остальные буквы, а данные — в разные промежутки между ними.
В пятибуквенном слове с двумя О остальных букв три. Вокруг них четыре промежутка, и две О должны попасть в разные — C₄² = 6 способов. Две О в разных промежутках никогда не окажутся рядом.
Посчитаем слова задачи темы. Если первая буква — О (вторая О — в одном из трёх несоседних промежутков), остальные три места — по 4 варианта: 3 · 4³ = 192. Если первая — К, Р или Т (3 варианта), две О ставят на несоседние места из 2–5: (2, 4), (2, 5) или (3, 5) — три способа, и ещё два места — по 4 варианта: 3 · 3 · 4² = 144. Всего 192 + 144 = 336.
from itertools import product count = 0for letters in product('АКОРТ', repeat=5): word = ''.join(letters) if ( word[0] != 'А' and word.count('О') == 2 and 'ОО' not in word ): count += 1print(count)'ОО' not in word проверяет фрагмент из двух О подряд. Если в слове ровно две О, этого достаточно, чтобы они не стояли рядом.
Проверка всех пар
Если запрещённых пар много, например любые две гласные подряд, проверяют все соседние пары циклом. Нажми «Запуск» и пройди программу по шагам:
word = 'БАОВГ'good = Truefor i in range(len(word) - 1): if word[i] in 'АО' and word[i + 1] in 'АО': good = False breakprint(good)Переменная good — флаг: сначала считаем, что слово подходит, а найдя запрещённую пару, меняем на False. прекращает цикл: одной плохой пары достаточно. range(len(word) - 1) даёт левые позиции всех пар: у слова из 5 букв это 0, 1, 2, 3.
Одинаковые соседи
Слов без двух одинаковых букв подряд m · (m − 1)ⁿ⁻¹: первая — любая, каждая следующая — любая, кроме предыдущей. Пятибуквенных слов из АБВГ — 4 · 3⁴ = 324. Это не запрет повторов вообще: АБАБА подходит.
from itertools import product count = 0for letters in product('АБВГ', repeat=5): word = ''.join(letters) good = True for i in range(len(word) - 1): if word[i] == word[i + 1]: good = False break if good: count += 1print(count)Блок
Буквы, которые должны стоять рядом, объединяют в один блок. Переставим АБВГ так, чтобы А и Б стояли рядом: блок, В и Г расставляются 3! = 6 способами, а внутри блока два порядка — АБ и БА. Всего 12.
Тонкости:блок при повторах букв
Если буквы повторяются, блок считают осторожно: трёхбуквенных слов из АБ с фрагментом АА три — ААА, ААБ, БАА, а не 2 · 2 = 4: слово ААА содержит фрагмент дважды. Метод count тоже не видит наложений: 'АААА'.count('АА') даёт 2, хотя фрагмент начинается на трёх местах.
Чередование
Если гласные и согласные чередуются, сначала выбирают схему типов, потом заполняют её. У пятибуквенного слова из АОБВГ две схемы: «г‑с‑г‑с‑г» — 2³ · 3² = 72 и «с‑г‑с‑г‑с» — 3³ · 2² = 108. Всего 180.
from itertools import product count = 0for letters in product('АОБВГ', repeat=5): word = ''.join(letters) good = True for i in range(len(word) - 1): if (word[i] in 'АО') == (word[i + 1] in 'АО'): good = False break if good: count += 1print(count)Если обе соседние буквы одного типа, проверки word[i] in 'АО' и word[i + 1] in 'АО' дают одинаковый результат — такая пара запрещена.
Итого
- Соседних парn − 1 в слове длины n
- Не рядомостальные буквы, данные — в разные промежутки
- Проверкафрагмент
'ОО' not in wordили цикл по парам с флагом - Одинаковые соседиm · (m − 1)ⁿ⁻¹
- Рядомблок; чередование — схемы типов
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
АБВ без двух одинаковых букв подряд?ОтветСкрыть ответ
print('АБ' in 'АВБ')?ОтветСкрыть ответ
False: in ищет буквы подряд, а в АВБ между А и Б стоит В.АБВГ так, чтобы А и Б стояли рядом?ОтветСкрыть ответ
АБ, содержащих ББ, нельзя найти как «три места для фрагмента, умноженные на 2²»?ОтветСкрыть ответ
ББББ — трижды, БББА и АБББ — дважды. Верный ответ — 8.Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Две А не рядом
Сколько пятибуквенных слов из АБ содержит ровно две А, которые не стоят рядом?
Введите число.
Подсказка
Две А вставляют в разные промежутки вокруг трёх Б.
Решение
Три Б создают четыре промежутка, две А ставят в разные из них: C₄² = 6 способов.
Решение программой
from itertools import product count = 0for letters in product('АБ', repeat=5): word = ''.join(letters) if word.count('А') == 2 and 'АА' not in word: count += 1print(count)Ответ: 6
Коды Иры
Ира составляет 6-буквенные коды из букв К, А, Т, Е, Р, И. Каждую букву нужно использовать ровно один раз, при этом нельзя ставить рядом две гласные. Сколько различных кодов может составить Ира?
Введите число.
Подсказка
Согласные, затем гласные в промежутки.
Решение
Согласные К, Т, Р расставляются 3! = 6 способами. Вокруг них четыре промежутка, три гласные ставят в разные — C₄³ = 4 способа — и переставляют 3! способами: 6 · 4 · 6 = 144.
Решение программой
from itertools import permutations count = 0for letters in permutations('КАТЕРИ', 6): word = ''.join(letters) if all(not (word[i] in 'АЕИ' and word[i + 1] in 'АЕИ') for i in range(5)): count += 1print(count)Ответ: 144
Коды Димы
Дима составляет 5-буквенные коды из букв Д, О, М, И, К. Буква М должна встретиться ровно один раз, и рядом с ней не может стоять гласная. Остальные буквы можно использовать любое количество раз. Сколько различных кодов может составить Дима?
Введите число.
Подсказка
Проверь обоих соседей М.
Решение
Если М с краю, её единственный сосед — Д или К, остальные три места — из четырёх букв без М: 2 · 2 · 4³ = 256. Если М на одном из трёх средних мест, оба соседа — Д или К: 3 · 2² · 4² = 192. Всего 448.
Решение программой
from itertools import product count = 0for letters in product('ДОМИК', repeat=5): word = ''.join(letters) if word.count('М') != 1: continue i = word.index('М') near = word[max(i - 1, 0):i] + word[i + 1:i + 2] if not any(c in 'ОИ' for c in near): count += 1print(count)Ответ: 448
Без одинаковых соседей
Сколько четырёхбуквенных слов из АБВ не содержит двух одинаковых букв подряд?
Введите число.
Подсказка
Каждая следующая буква — любая, кроме предыдущей.
Решение
Первая буква — любая из трёх, каждая следующая — любая, кроме предыдущей: 3 · 2³ = 24.
Решение программой
from itertools import product count = 0for letters in product('АБВ', repeat=4): word = ''.join(letters) if all(word[i] != word[i + 1] for i in range(3)): count += 1print(count)Ответ: 24
С А и без одинаковых соседей
Сколько шестибуквенных слов из АБВГ начинается с А и не содержит двух одинаковых букв подряд?
Введите число.
Подсказка
Первое место — одна буква, остальные — по три.
Решение
Первая буква — только А, каждая из пяти следующих — любая, кроме предыдущей: 1 · 3⁵ = 243.
Решение программой
from itertools import product count = 0for letters in product('АБВГ', repeat=6): word = ''.join(letters) if ( word[0] == 'А' and all(word[i] != word[i + 1] for i in range(5)) ): count += 1print(count)Ответ: 243
П и Л рядом
Сколькими способами можно переставить буквы слова ПЛАСТ так, чтобы П и Л стояли рядом?
Введите число.
Подсказка
Блок ПЛ или ЛП и ещё три буквы.
Решение
Блок ПЛ или ЛП и ещё три буквы — четыре объекта, они расставляются 4! = 24 способами, внутри блока два порядка: 24 · 2 = 48.
Решение программой
from itertools import permutations count = 0for letters in permutations('ПЛАСТ', 5): word = ''.join(letters) if 'ПЛ' in word or 'ЛП' in word: count += 1print(count)Ответ: 48
Гласные и согласные чередуются
Сколько шестибуквенных слов из АОБВГ, в которых гласные и согласные чередуются?
Введите число.
Подсказка
Две схемы типов: с гласной и с согласной в начале.
Решение
Схем две: с гласной в начале и с согласной. В каждой три места для гласных (2³) и три для согласных (3³): 2 · 8 · 27 = 432.
Решение программой
from itertools import product count = 0for letters in product('АОБВГ', repeat=6): word = ''.join(letters) if all((word[i] in 'АО') != (word[i + 1] in 'АО') for i in range(5)): count += 1print(count)Ответ: 432