Светлана составляет коды из букв своего имени. Код должен состоять из 8 букв,
Светлана составляет коды из букв своего имени. Код должен состоять из 8 букв, и каждая буква в нём должна встречаться столько же раз, сколько в имени Светлана. Кроме того, одинаковые буквы в коде не должны стоять рядом. Сколько кодов может составить Светлана? ОТВЕТ 15120. ЧТО НЕ ТАК?
k=0
for x1 in 'СВЕТЛАНА':
for x2 in 'СВЕТЛАНА':
for x3 in 'СВЕТЛАНА':
for x4 in 'СВЕТЛАНА':
for x5 in 'СВЕТЛАНА':
for x6 in 'СВЕТЛАНА':
for x7 in 'СВЕТЛАНА':
for x8 in 'СВЕТЛАНА':
s=x1+x2+x3+x4+x5+x6+x7+x8
if s.count('А') == 2 \
and s.count('С') == 1 \
and s.count('В') == 1 \
and s.count('Е') == 1 \
and s.count('Т') == 1 \
and s.count('Л') == 1 \
and s.count('Н') == 1 \
and s.count('АА') == 0:
k=k+1
print(k)
Ответы (5 шт):
Анна, вот вам код, исправленный тем же подходом, что и у вас применён. Исключено повторение последовательностей. Теперь результат 15120. Подсказка: вы могли сам это обнаружить, упростив пример до слова "AСA", например, и прогнав в отладчике или на бумажке (что я и сделал:-).
used=[]
k=0
for x1 in 'СВЕТЛАНА':
for x2 in 'СВЕТЛАНА':
for x3 in 'СВЕТЛАНА':
for x4 in 'СВЕТЛАНА':
for x5 in 'СВЕТЛАНА':
for x6 in 'СВЕТЛАНА':
for x7 in 'СВЕТЛАНА':
for x8 in 'СВЕТЛАНА':
s=x1+x2+x3+x4+x5+x6+x7+x8
if s.count('А') == 2 \
and s.count('С') == 1 \
and s.count('В') == 1 \
and s.count('Е') == 1 \
and s.count('Т') == 1 \
and s.count('Л') == 1 \
and s.count('Н') == 1 \
and s.count('АА') == 0 \
and s not in used:
k=k+1
used.append(s)
print(k)
Вместо того, чтобы решать это задание из егэ миллионами циклов, лучше ознакомьтесь с библиотекой itertools https://habr.com/ru/company/otus/blog/529356/. Методов для егэ там - уйма, просто прочитайте статью и потренируйтесь их юзать. Касаемо вашего задания - используйте функцию permutations из модуля itertools. Вот код:
from itertools import permutations
count = 0
for variant in permutations("СВЕТЛАНА", 8):
if "АА" not in "".join(variant):
count += 1
print(count / 2)
В комментариях к другому ответу писал, вот что я имею в виду
from itertools import permutations
a = list("светлана")
temp = permutations(a, 8)
b = set(["".join(i) for i in list(temp)])
counter = 0
for i in b:
if "аа" not in i:
counter += 1
print(counter)
вывод
15120
Советую использовать библиотеку itertools и её функцию product, так код будет выглядеть намного лучше:
from itertools import product
def f(n: str):
return 'АА' not in n and n.count('А') == 2 \
and n.count('С') \
and n.count('В') \
and n.count('Е') \
and n.count('Т') \
and n.count('Л') \
and n.count('Н')
print(sum(map(lambda x: f("".join(x)), product("СВЕТЛАН", repeat=8)))) # Имя подавать без дубликатов букв
print(sum(map(lambda x: f(''.join(x)), set(permutations("СВЕТЛАНА", r=8))))) # Второй вариант решения
Вывод
15120
15120
Данный код применим к любому имени, главное менять функцию проверки, в зависимости от условия. И само имя поданное в функцию.
Давайте посмотрим задачу с другой стороны. Пусть у нас восемь разных букв. Сколько можно сделать перестановок? 8!. Теперь из этих восьми букв две одинаковые. Сколько тогда разных перестановок? 8! / 2, потому что теперь все мы не различаем пары перестановок в которых две одинаковые буквы на одних и тех местах:
светланA, светлAна - если мы различаем буквы аА, \ / это две разные перестановки \ / светлана - если буквы а неразличимы, перестановка одна
Сколько перестановок в которых две буквы а рядом? Каждая такая перестановка соответствует перестановке из семи различных букв, потому что:
светлаан <-> светлан
Таких перестановок 7!.
Из числа всех перестановок вычтем плохие:
8! / 2 - 7! = 8 * 7! / 2 - 7! = 3 * 7! = = 3 * 1 * 2 * 3 * 4 * 5 * 6 * 7 = 3 * 120 * 6 * 7 = 720 * 21 = = 14400 + 720 = 15120