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

Помогите с кодом

Сукин Сын Ученик (100), открыт 1 неделю назад
Вот задание:
Сколько существует восьмеричных пятизначных чисел, не содержащих в своей записи цифру 1, в которых все цифры различны и никакие две чётные или две нечётные цифры не стоят рядом?

Почему этот код выдает неправильный ответ?
from itertools import *

k = 0

for x in product('01234567', repeat = 5):
s = ''.join(x)

if '1' not in s and len(set(s)) == 5 and s[0] != 0:
s = s.replace('2', '0').replace('4', '0').replace('6', '0')\
.replace('5', '3').replace('7', '3').replace('1', '3')
print(s)

if '00' not in s and '33' not in s:
k += 1
print(k)
2 ответа
HELPER ㅤ Гуру (3253) 1 неделю назад
Код не работает, потому что он не учитывает ограничения на расположение четных и нечетных цифр. Чтобы учесть это, необходимо добавить дополнительную проверку для обеспечения чередования четных и нечетных цифр в сгенерированных числах.

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

k = 0

for x in product('0234567', repeat=5):
s = ''.join(x)

if '1' not in s and len(set(s)) == 5 and s[0] != '0':
s = s.replace('2', '0').replace('4', '0').replace('6', '0')\
.replace('5', '3').replace('7', '3').replace('1', '3')
print(s)

if '00' not in s and '33' not in s and s.count('0') == s.count('3'):
k += 1
Исправленный код добавляет проверку s.count('0') == s.count('3'), чтобы гарантировать, что количество четных и нечетных цифр в сгенерированном числе равно. Это гарантирует, что никакие две четные или две нечетные цифры не стоят рядом.
Андрей Высший разум (433062) 1 неделю назад
Для задачи вообще не требуется программирования. Банальная комбинаторика.

Существует всего 2 варианта комбинаций чётных / нечётных цифр:
ЧНЧНЧ
НЧНЧН
При этом у нас 3 нечётные цифры (1 исключается) и 4 чётные. Но при этом на первом месте не может стоять чётная цифра 0.

НЧНЧН = (3 * 2 * 1) * (4 * 3)
ЧНЧНЧ = 3 * (3 * 2) * (3 * 2)

Ответ: (3 * 2 * 1) * (4 * 3) + 3 * (3 * 2) * (3 * 2) = 180

Но если так хочется кодом, то:
 import re 
cnt = 0
for i in range(8 ** 4, 8 ** 5):
s = oct(i)[2:]
cnt += len(set(s)) == 5 and not re.search(r'1|[0246]{2}|[357]{2}', s)
print(cnt)
Перебираем только пятизначные восьмеричные числа и увеличиваем cnt на 1, если восьмеричная запись очередного числа удовлетворяет условию: "все цифры различны" и НЕ удовлетворяет условию: "содержит цифру 1 или содержит 2 подряд чётные цифры или содержит 2 подряд нечётные цифры".
Сергей БивисМастер (1580) 1 неделю назад
феерический бред
Андрей Высший разум (433062) Сергей Бивис, Спасибо, неуч, повеселил.
Похожие вопросы