1
votes

HackerRank défi d'écrire une fonction: le cas de test 1 a échoué

c'est mon code pour le défi hackerRank écrire une fonction

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))

Tous les 5 cas de test ont fonctionné sauf un, lorsque l'année = 2100, et j'aimerais savoir pourquoi? Qu'est ce qui ne va pas avec mon code? edit: après avoir exécuté le code, j'ai obtenu ce qui suit:

Message du compilateur: mauvaise réponse

Entrée (stdin): 2100

Sortie attendue: Faux


3 commentaires

veuillez poster l'énoncé du problème dans la question ainsi que les entrées et sorties attendues, et ce que vous obtenez


@pushkin j'ai mis un lien vers l'énoncé du problème (cliquez sur "écrire une fonction" dans ma question ci-dessus).


@pushkin J'ai édité maintenant et inclus l'entrée et la sortie attendues.


4 Réponses :


0
votes

Je ne sais pas exactement pourquoi votre code ne fonctionne pas, mais j'ai la solution:

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

Et pour le tester:

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

De plus, je ne sais pas où vous exécutez ce code, mais la question demande des valeurs booléennes (True ou False) et vous renvoyez les années à la place, donc c'est peut-être pourquoi vous obtenez l'erreur.


7 commentaires

Merci, je vais vérifier la sortie du premier code, mais pourriez-vous expliquer le deuxième?


Qu'entendez-vous par le second ?


parlez-vous de la boucle for i in range ?


C'était juste pour tester la fonction. Cette boucle imprimera toutes les années bissextiles "irrégulières" entre 1000 et 2500


Maintenant je comprends. btw, a essayé votre code et cela a fonctionné. Merci beaucoup.


Vous êtes le bienvenu! Si cela vous a aidé, vous devriez l'accepter comme réponse :)


C'était tellement utile et cela a corrigé de nombreux concepts erronés que j'avais mais je vous le dois toujours xD



1
votes

Le problème est que vous ne testez que les deux derniers chiffres, comme le montre y=int(x[-2:]) , ce qu'il n'y a vraiment aucune raison de faire. Les contraintes du programme vous indiquent déjà que l'entrée sera un entier compris entre 1900 et 1000, vous pouvez donc simplement travailler avec year. De plus, votre déclaration de retour évaluera le or avant le and (voir ici ), donc la dernière chose qu'elle vérifie sera !=100 , le cassant ainsi pour le cas 400 .


1 commentaires

Bonne explication. En guise de remarque, une possibilité correcte d'écrire l'expression logique pourrait être: (y% 4 == 0 and y % 100 != 0) or y % 400 == 0



0
votes

J'aime votre code concis d'évaluation et de retour du résultat en une seule ligne de code! Cependant, deux problèmes avec votre code: 1) Vous regardez les deux derniers chiffres au lieu de tester le nombre entier 2) L'ordre d'évaluation logique est incorrect. Essayez ce code simple

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))


1 commentaires

Merci pour l'aide, appréciez-la. En effet, la vérification des deux derniers chiffres était erronée avec l'évaluation logique.



0
votes
def is_leap(year):
    leap = False

    # Write your logic here
    if year % 400 == 0:
        leap = True
    elif year % 4 == 0 and year % 100 != 0:
        leap = True
    return leap

0 commentaires