Задача HackerRank написать функцию: тестовый пример 1 не пройден

это мой код для задачи hackerRank написать функцию

def is_leap(year):
    x=str(year)
    y=int(x[-2:])

    return y%4==0 or y%400==0 and y%100!=0


year = int(input())
print(is_leap(year))

Все 5 тестовых случаев работали, кроме одного, когда year=2100, и я хотел бы знать, почему? что не так с моим кодом? редактировать: после запуска кода я получил следующее:

Сообщение компилятора: неправильный ответ

Ввод (стандартный): 2100

Ожидаемый результат: ложь


person manel bouazza    schedule 17.03.2019    source источник
comment
пожалуйста, опубликуйте описание проблемы в вопросе, а также ожидаемый ввод и вывод, а также то, что вы получаете   -  person pushkin    schedule 18.03.2019
comment
@pushkin я разместил ссылку на постановку задачи (нажмите «написать функцию» в моем вопросе выше).   -  person manel bouazza    schedule 18.03.2019
comment
@pushkin Сейчас я отредактировал и включил ожидаемый ввод и вывод.   -  person manel bouazza    schedule 18.03.2019


Ответы (3)


Проблема в том, что вы тестируете только две последние цифры, как видно из y=int(x[-2:]), для чего на самом деле нет причин. Ограничения программы уже говорят вам, что ввод будет целым числом от 1900 до 10000, поэтому вы можете просто работать с годом. Кроме того, ваш оператор return будет оценивать or перед and (см. здесь), поэтому последнее, что он проверяет, будет !=100, тем самым разбивая его на случай 400.

person Travis Williamson    schedule 17.03.2019
comment
Правильное объяснение. В качестве примечания, одна из правильных возможностей написания логического выражения может быть такой: (y% 4 == 0 and y % 100 != 0) or y % 400 == 0 - person FlorianDe; 18.03.2019

Я не совсем уверен, почему ваш код не работает, но у меня есть решение:

def is_leap(year):
    if year%4 == 0:
        if year%100 == 0:
            if year%400 == 0:
                return True #divisible by 4, divisible by 100, and divisible by 400
            else:
                return False #divisible by 4 and divisible by 100
        else:
            return True #divisible by 4 and not divisible by 100
    else:
        return False #not divisible by 4

И чтобы проверить это:

for i in range(1000, 2501, 4):
    if not is_leap(i):
        print(str(i)) # this will print all the "irregular" leap years between 1000 and 2500

Кроме того, я не уверен, где вы запускаете этот код, но в вопросе действительно запрашиваются логические значения (True или False), и вместо этого вы возвращаете годы, поэтому, возможно, поэтому вы получаете Ошибка.

person Lord Elrond    schedule 17.03.2019
comment
Спасибо, я проверю вывод первого кода, но не могли бы вы объяснить второй? - person manel bouazza; 18.03.2019
comment
Что вы подразумеваете под вторым? - person Lord Elrond; 18.03.2019
comment
вы говорите о цикле for i in range? - person Lord Elrond; 18.03.2019
comment
Это было просто для проверки функции. Этот цикл напечатает все нерегулярные високосные годы между 1000 и 2500 годами. - person Lord Elrond; 18.03.2019
comment
Теперь я понимаю. Кстати, попробовал ваш код, и он сработал. большое спасибо. - person manel bouazza; 18.03.2019
comment
Добро пожаловать! Если это помогло, вы должны принять это как свой ответ :) - person Lord Elrond; 18.03.2019
comment
Это было так полезно, и это исправило многие ошибочные концепции, которые у меня были, но я все еще в долгу перед вами xD - person manel bouazza; 18.03.2019

Мне нравится ваш лаконичный код оценки и возврата результата в одной строке кода! Однако есть две проблемы с вашим кодом: 1) вы смотрите на последние две цифры вместо проверки целого числа 2) неверный порядок логической оценки. Попробуйте этот простой код

def is_leap(year):
    y=int(year)
    return  y%400==0 or (y%100 != 0 and y%4==0)
year = input()
print(is_leap(year))
person RebornCodeLover    schedule 18.03.2019
comment
Спасибо за помощь, ценю это. Действительно, проверка двух последних цифр была ошибочной вместе с логической оценкой. - person manel bouazza; 19.03.2019