Top.Mail.Ru
Ответы

Что не так в этом коде

s="ЕЛОПЕР"
k=0
for c1 in s:
for c2 in s:
for c3 in s:
for c4 in s:
for c5 in s:
p=c1+c2+c3+c4+c5
if ("Л" in p)<=3 or ("П" in p)<=3 or ("Р" in p)<=3:
k+=1
if k%3==0 and p[4]=="Е" or p[4]=="О":
print(k,p)

По дате
По рейтингу
Аватар пользователя
Высший разум
5мес

Тут вообще не нужны никакие циклы, элементарная задача на комбинаторику.

Всего согласных - 5, а гласных - 2. Есть
4 × 5³ × 2 способа разместить согласные на 3-х местах из первых 4-х,
4 × 3 / 2 × 5² × 2² - на двух местах,
4 × 5 × 2³ - на одном месте
и 2⁴ способов составить слово без согласных.
Сумму этих способов умножаем на 2, т.к. на последнем месте стоит гласная, а их - две.

И нечётность номера означает, что нужно взять только каждое второе из получившегося множества слов. Почему каждое второе? Потому что букв - 7, это число нечётное, поэтому гласные будут попеременно попадать то на чётные, то на нечётные индексы. Так что итог делим на 2.

Программа:

1
 print(4 * 2 * (5 ** 3 + 5 ** 2 * 3 + 5 * 2 ** 2 + 2)) 

Ответ:

1
 1776 слов 


P.S. И какое отношение имеет слово "ЕЛОПЕР", скопированное двумя ботами в их "ответы", к слову "ПРЕСТОЛ" из условия задачи? Вопрос - риторический.
Условие в твоём внутреннем цикле также никакого отношения к условию задачи не имеет.

А вот код для проверки как раз можно сделать и перебором:

123456789101112
 s = "ЕОЛПРСТ"
k = 0

for c1 in s:
    for c2 in s:
        for c3 in s:
            for c4 in s:
                p = c1 + c2 + c3 + c4
                if p.count("Л") + p.count("П") + p.count("Р") + p.count("С") + p.count("Т") <= 3:
                    k += 1

print(k) 

Видим, что ответ тот же.
Перебираем только 4 позиции, т.к. последняя добавляет множитель 2, а требование к нечётности индекса убирает множитель 2.

Аватар пользователя
Искусственный Интеллект
5мес

Вы написали на бейсике и вам предлагают так же. На python:

12345678910
 from itertools import combinations_with_replacement 
k,m=0,0 
s=set(list('ПРСТЛ')) 
for i in combinations_with_replacement(sorted(list('ПРЕСТОЛ')),5): 
    k +=1 
    if not k%2: continue # чётный номер 
    if i[-1] in s: continue # посл. согласная 
    if len(set(i)& s) >3: continue # согл больше 3х 
    m +=1 
print(m)     


from itertools import combinations_with_replacement
k,m=0,0
s=set(list('ПРСТЛ'))
for i in combinations_with_replacement(sorted(list('ПРЕСТОЛ')),5):
k +=1
if not k%2: continue # чётный номер
if i[-1] in s: continue # посл. согласная
if len(set(i)& s) >3: continue # согл больше 3х
m +=1
print(m)

Аватар пользователя
Мудрец
5мес
12345678910111213141516171819
 s = "ЕЛОПЕР" 
k = 0 
 
for c1 in s: 
    for c2 in s: 
        for c3 in s: 
            for c4 in s: 
                for c5 in s: 
                    p = c1 + c2 + c3 + c4 + c5 
                    # Проверяем количество символов "Л", "П" или "Р" 
                    count_l = p.count("Л") 
                    count_p = p.count("П") 
                    count_r = p.count("Р") 
                     
                    if count_l <= 3 and count_p <= 3 and count_r <= 3:  # Условие на количество символов 
                        k += 1 
                        # Условие на кратность 3 и символы на позиции 5 
                        if k % 3 == 0 and (p[4] == "Е" or p[4] == "О"): 
                            print(k, p)  
Аватар пользователя
Мудрец
5мес

Вот исправленный код:

s = "ЕЛОПЕР"
k = 0
for c1 in s:
for c2 in s:
for c3 in s:
for c4 in s:
for c5 in s:
p = c1 + c2 + c3 + c4 + c5
if p.count("Л") <= 3 or p.count("П") <= 3 or p.count("Р") <= 3:
k += 1
if k % 3 == 0 and (p[4] == "Е" or p[4] == "О"):
print(k, p)

Теперь код будет работать правильно, проверяя количество вхождений букв "Л", "П" и "Р", а также корректно применяя логическое условие для вывода слов.

Аватар пользователя
Мыслитель
5мес

через itertools сделай, зачем себя мучать