Top.Mail.Ru
Ответы

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

Вот задание:
Сколько существует восьмеричных пятизначных чисел, не содержащих в своей записи цифру 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 варианта комбинаций чётных / нечётных цифр:
ЧНЧНЧ
НЧНЧН
При этом у нас 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

Но если так хочется кодом, то:

123456
 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 подряд нечётные цифры".

Аватар пользователя
Мудрец

Код не работает, потому что он не учитывает ограничения на расположение четных и нечетных цифр. Чтобы учесть это, необходимо добавить дополнительную проверку для обеспечения чередования четных и нечетных цифр в сгенерированных числах.

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

1234567891011121314
 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'), чтобы гарантировать, что количество четных и нечетных цифр в сгенерированном числе равно. Это гарантирует, что никакие две четные или две нечетные цифры не стоят рядом.