Светлана составляет коды из букв своего имени. Код должен состоять из 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)
→ Ссылка
Автор решения: headswillroll

Вместо того, чтобы решать это задание из егэ миллионами циклов, лучше ознакомьтесь с библиотекой 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)
→ Ссылка
Автор решения: Dmitry

В комментариях к другому ответу писал, вот что я имею в виду

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
→ Ссылка
Автор решения: Bol4onok

Советую использовать библиотеку 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

Данный код применим к любому имени, главное менять функцию проверки, в зависимости от условия. И само имя поданное в функцию.

→ Ссылка
Автор решения: Stanislav Volodarskiy

Давайте посмотрим задачу с другой стороны. Пусть у нас восемь разных букв. Сколько можно сделать перестановок? 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
→ Ссылка