Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

faceit com Ученик (184), открыт 1 месяц назад
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 ответов
Арсений Меренов Мыслитель (8794) 1 месяц назад
через itertools сделай, зачем себя мучать
ПапаВысший разум (149125) 1 месяц назад
Здесь вообще никаких циклов и никаких итераций не нужно.
ЖЕПО андернеко Мудрец (17248) 1 месяц назад
Вот исправленный код:

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)

Теперь код будет работать правильно, проверяя количество вхождений букв "Л", "П" и "Р", а также корректно применяя логическое условие для вывода слов.
AlexKurov Мыслитель (9165) 1 месяц назад
 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)
Папа Высший разум (149125) 1 месяц назад
Тут вообще не нужны никакие циклы, элементарная задача на комбинаторику.

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

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

Программа:
 print(4 * 2 * (5 ** 3 + 5 ** 2 * 3 + 5 * 2 ** 2 + 2)) 
Ответ:
 1776 слов 

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

А вот код для проверки как раз можно сделать и перебором:
 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.
Юрий Семыкин Искусственный Интеллект (212031) 1 месяц назад
Вы написали на бейсике и вам предлагают так же. На python:
 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)
Похожие вопросы