Возврат Не поворачивайся как печать

У меня проблема в ката кодварс https://www.codewars.com/kata/58cbfe2516341cce1e000001/train/python

def count_zeros_n_double_fact(n): 
    res = []
    oddeven = []
    revers = []
    result = 1
    c = 0
    for i in range(n+1):
        if i % 2 == 0 and i != 0:
            oddeven.append(i)
    for x in oddeven:
        result = result * x
    for z in reversed(str(result)):
        if z == '0':
            c+=1
        else:
            break
    return c

Я прошел тесты, но при попытках любого большого числа он возвращает ноль

тесты с возвратом: Возврат Не поворачивайся как печать

попытки с возвратом: Возврат Не поворачивайся как печать

Но когда я использовал печать, все ответы были правильными

def count_zeros_n_double_fact(n): 
    res = []
    oddeven = []
    revers = []
    result = 1
    c = 0
    for i in range(n+1):
        if i % 2 == 0 and i != 0:
            oddeven.append(i)
    for x in oddeven:
        result = result * x
    for z in reversed(str(result)):
        if z == '0':
            c+=1
        else:
            break
    print (c)

попытки с печатью

Возврат Не поворачивайся как печать Пожалуйста, помогите мне!

Подсказка: посмотрите на тестовые примеры, которые не прошли. Введенные числа нечетные или четные? А теперь хорошенько подумайте над своей логикой. Если введено число 9, какие числа будут умножены вашим кодом? (Вы проверяли? Можете ли вы придумать способ проверки? Что, если вы попытаетесь отобразить oddeven перед выполнением умножения?) Какие числа должны быть умножены вместе? Вы понимаете, почему это вызывает проблему?

Karl Knechtel 14.08.2023 20:36

«Но когда я использовал печать, все ответы были правильными» - это не так. Вы не правильно поняли отзыв тестировщика. Числа, которые вы получаете от print, такие же, как те, которые возвращаются return, но вы должны return, чтобы удовлетворить тестер. Тестер не может прочитать то, что отображается на экране, когда он вызывает вашу функцию. Он должен использовать возвращаемое значение.

Karl Knechtel 14.08.2023 20:39

@KarlKnechtel Он делает return c в первой версии, которую, я полагаю, он отправляет тестировщику. Вторая версия - просто посмотреть, что она возвращает.

Barmar 14.08.2023 20:42

@ Бармар ... да, я понимаю. В вопросе говорится: «Когда я использовал печать, все ответы были правильными», но это явно не так. Он печатает ответы, которые были бы возвращены в противном случае, и эти ответы явно неверны в половине случаев. (Тестер терпит неудачу при использовании печати, но это отдельная проблема.)

Karl Knechtel 14.08.2023 20:44

@KarlKnechtel Ты прав, я не смотрел на этот скриншот.

Barmar 14.08.2023 20:46

@KarlKnechtel Спасибо за ваш комментарий, я действительно пытался понять проблему, но не смог, спасибо за ваше время, и я постараюсь быть более точным.

Marwan Rabi 15.08.2023 07:54

@Barmar спасибо братан

Marwan Rabi 15.08.2023 07:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
8
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема

Ваша логика неверна, вы всегда используете нечетные числа, но как говорится

  • если n нечетное, умножьте нечетные числа до n
  • если n четное, умножьте четные числа до n

Исправить

Возьмите требуемые значения, как указано в упражнении

def count_zeros_n_double_fact(n): 
    res = []
    oddeven = []
    revers = []
    result = 1
    c = 0
    for i in range(1, n+1):
        if (i % 2 == 0 and n % 2 == 0)  or (i % 2 == 1 and n % 2 == 1):
            oddeven.append(i)
    for x in oddeven:
        result = result * x
    for z in reversed(str(result)):
        if z == '0':
            c+=1
        else:
            break
    return c

Улучшать

Зацикливайте только на каждых двух значениях и умножайте их напрямую, не сохраняйте их в списке

def count_zeros_n_double_fact(n):
    result = 1
    c = 0
    for i in range((n + 1) % 2 + 1, n + 1, 2):
        result *= i
    for z in reversed(str(result)):
        if z == '0':
            c += 1
        else:
            break
    return c

Другой путь

from functools import reduce
from operator import mul

def count_zeros_n_double_fact(n):
    result = str(reduce(mul, range((n + 1) % 2 + 1, n + 1, 2)))
    return len(result) - len(result.rstrip("0"))

Большое спасибо за ваш отличный ответ, я ценю ваши усилия

Marwan Rabi 15.08.2023 07:50

Другие вопросы по теме