Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lever et coucher du soleil

    23 septembre 2020 à 0:28:05

    Bonjour à tous

    Je suis en train d'écrire un code qui affiche seulement True ou False selon l'heure de coucher ou de lever du soleil (sur une planète particulière) sur la base des informations suivantes, mais mon code ne convient pas pour certains cas de figure. 

    La fonction qui reçoit trois valeurs entières en argument :
         - l'heure de lever du soleil (entre 0 et 23)
         - l'heure du coucher du soleil (entre 0 et 23)
         - l'heure actuelle (entre 0 et 23)

    et qui renvoie une valeur booléenne vraie si le soleil est levé à l'heure donnée en troisième argument et fausse, s'il est couché.
    On supposera que le soleil ne se lève et ne se couche au plus qu'une seule fois par jour. Il est toutefois possible que le lever ait lieu après l'heure du coucher, ce qui signifie dans ce cas que le soleil est levé au début de la journée, puis qu'il se couche, puis qu'il se lève à nouveau plus tard dans la journée.
    Enfin, si l'heure du lever est la même que l'heure du coucher :
         - soit toutes deux valent 12, cela signifie que le soleil ne se lève pas de la journée
         - soit toutes les deux valent 0, cela signifie que le soleil ne se couche pas de la journée.

    Voici le code que  j'ai écrit:

    def soleil_leve(lever, coucher, actuelle):
        actuelle >= 0 and actuelle <23
        if coucher == lever == 0: # l'heure du lever est la même que l'heure du coucher
            return True
        elif coucher ==  lever == 12: # l'heure du lever est la même que l'heure du coucher
            return False
        elif actuelle >= lever and actuelle < coucher: # L'heure actuelle est entre l'heure du lever et l'heure du coucher
            return True
        else:
            return False
    
    lever = int(input())
    coucher = int(input())
    actuelle = int (input())
    print(soleil_leve(lever, coucher, actuelle))
    

    Ce code marche bien avec les valeurs: (6, 18, 5), (6, 18, 10), (6, 18, 18), (6, 18, 0), (0, 0, 5), (12, 12, 0), (12, 12, 23), (15, 8, 8), (12,13,12), (12,19,8).

    Il ne marche pas avec les valeurs:

    (15, 8, 6) qui devrait afficher "True" mais affiche "False"

    (16, 10, 23) qui devrait afficher "True" mais affiche "False"

    (15, 8, 15)qui devrait afficher "True" mais affiche "False"


    J'espère pouvoir trouver une solution avec votre aide.




    • Partager sur Facebook
    • Partager sur Twitter
      23 septembre 2020 à 3:25:07

      Salut,
      La ligne 2 est censée donner quoi?
          actuelle >= 0 and actuelle <23
      Ensuite:
          elif actuelle >= lever and actuelle < coucher: # L'heure actuelle est entre l'heure du lever et l'heure du coucher
      et si coucher < lever? Je n'ai pas testé ceci:
          if coucher < lever:
              lever -= 24
      Places les lignes avant le elif et remplaces le elif par un if.
      -
      J'ai décidé de faire le test. La bonne solution est de remplacer le elif par ceci:
          elif lever<coucher and lever<=actuelle<coucher or coucher<lever and not coucher<=actuelle<lever:

      -
      Edité par PierrotLeFou 23 septembre 2020 à 4:35:56

      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        23 septembre 2020 à 10:24:20

        PierrotLeFou a écrit:

        Salut,
        La ligne 2 est censée donner quoi?
            actuelle >= 0 and actuelle <23
        Ensuite:
            elif actuelle >= lever and actuelle < coucher: # L'heure actuelle est entre l'heure du lever et l'heure du coucher
        et si coucher < lever? Je n'ai pas testé ceci:
            if coucher < lever:
                lever -= 24
        Places les lignes avant le elif et remplaces le elif par un if.
        -
        J'ai décidé de faire le test. La bonne solution est de remplacer le elif par ceci:
            elif lever<coucher and lever<=actuelle<coucher or coucher<lever and not coucher<=actuelle<lever:

        -
        Edité par PierrotLeFou il y a environ 5 heures


        Bonjour PierrotLeFou
        Merci de votre contribution. Votre code a effectivement résolu les problèmes que j'ai évoqués plus haut, mais il y un autre aspect qui donne un résultat contraire à celui attendu. C'est surtout quand "lever" et "coucher" valent tous 12. On devrait avoir "False" dans ce cas, mais c'est "True" qui s'affiche. Exemples:

        (12, 12, 0), (12, 12, 12) et (12, 12, 23) affichent "True" alors que c'est "False" qui est attendu.

        • Partager sur Facebook
        • Partager sur Twitter
          23 septembre 2020 à 11:43:11

          avec ton code initial, cela devait marcher pour tes cas (12,12,x); tu n'a pas supprimé les 2 premiers tests ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 septembre 2020 à 12:11:36

            1000103

            -
            Edité par __p_b2cs 4 décembre 2020 à 11:03:38

            • Partager sur Facebook
            • Partager sur Twitter
              23 septembre 2020 à 12:59:46

              SeydouWorou a écrit:

              PierrotLeFou a écrit:

              Salut,
              La ligne 2 est censée donner quoi?
                  actuelle >= 0 and actuelle <23
              Ensuite:
                  elif actuelle >= lever and actuelle < coucher: # L'heure actuelle est entre l'heure du lever et l'heure du coucher
              et si coucher < lever? Je n'ai pas testé ceci:
                  if coucher < lever:
                      lever -= 24
              Places les lignes avant le elif et remplaces le elif par un if.
              -
              J'ai décidé de faire le test. La bonne solution est de remplacer le elif par ceci:
                  elif lever<coucher and lever<=actuelle<coucher or coucher<lever and not coucher<=actuelle<lever:

              -
              Edité par PierrotLeFou il y a environ 5 heures


              Bonjour PierrotLeFou
              Merci de votre contribution. Votre code a effectivement résolu les problèmes que j'ai évoqués plus haut, mais il y un autre aspect qui donne un résultat contraire à celui attendu. C'est surtout quand "lever" et "coucher" valent tous 12. On devrait avoir "False" dans ce cas, mais c'est "True" qui s'affiche. Exemples:

              (12, 12, 0), (12, 12, 12) et (12, 12, 23) affichent "True" alors que c'est "False" qui est attendu.

              PierrotLeFou

              Votre code marche bien dans tous les cas de figure. C'est moi qui avait commis une erreur en gardant à la fois "return False" et "return True" après l'instruction 'elif coucher ==  lever == 12:'.

              Merci. 

              • Partager sur Facebook
              • Partager sur Twitter
                23 septembre 2020 à 17:18:08

                Bonjour M. Awk. :)
                Tu aurais dû utiliser ton prénom pour renommer les variables:
                f=lambda lever,coucher,actuelle:[[lever<actuelle<coucher,lever>=actuelle>=coucher][lever>coucher],lever==0][lever==coucher]
                de l'indexage sur l'indexage et booléen, c'est beaucoup pour un débutant ...
                Un re.sub en Python avec fonction aurait fait l'affaire.

                -
                Edité par PierrotLeFou 23 septembre 2020 à 17:28:23

                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  23 septembre 2020 à 19:26:10

                  sedawk a écrit:

                  f=lambda a,b,c:[[a<c<b,a>=c>=b][a>b],a==0][a==b]


                  dans la même idée (mais avec les bons résultats ^^ ).

                  foo = lambda lever,coucher,actuelle: ((lever<coucher)^(coucher>actuelle)^(actuelle>=lever),lever==0)[lever==coucher]



                  -
                  Edité par josmiley 23 septembre 2020 à 20:48:25

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Python c'est bon, mangez-en. 

                    24 septembre 2020 à 8:20:08

                    Je ne comprends pas les == 0 et == 12 de tes premières conditions. Si tes heures de lever et de coucher sont égales, c'est le cas quelle que soit cette heure, pas seulement à midi ou minuit.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 septembre 2020 à 10:37:06

                      entwanne a écrit:

                      Je ne comprends pas les == 0 et == 12 de tes premières conditions. Si tes heures de lever et de coucher sont égales, c'est le cas quelle que soit cette heure, pas seulement à midi ou minuit.


                      c'est dans l'énoncé du problème

                      Enfin, si l'heure du lever est la même que l'heure du coucher : - soit toutes deux valent 12, cela signifie que le soleil ne se lève pas de la journée - soit toutes les deux valent 0, cela signifie que le soleil ne se couche pas de la journée.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 septembre 2020 à 11:38:50

                        Mais il n'y a dans ce cas besoin d'un traitement spécifique que pour le 0, pas pour le 12 qui se comporte comme n'importe quel autre nombre : a &lt;= x &lt; b vaudra toujours False si a == b.

                        C'est d'ailleurs une autre amélioration possible au code, en Python actuelle &gt;= lever and actuelle &lt; coucher peut plus simplement s'écrire lever &lt;= actuelle &lt; coucher.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 septembre 2020 à 12:53:23

                          1111111

                          -
                          Edité par __p_b2cs 4 décembre 2020 à 11:04:02

                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 septembre 2020 à 13:54:04

                            sedawk a écrit:

                            def is_raised(sunrise, sunset, current):
                                if sunrise == sunset:
                                    return sunrise == 0
                                if sunrise > sunset:
                                    return sunrise >= current >= sunset
                                return sunrise < current < sunset

                            c'est toujours pas bon.

                            SeydouWorou a écrit:

                            Ce code marche bien avec les valeurs: (6, 18, 5), (6, 18, 10), (6, 18, 18), (6, 18, 0), (0, 0, 5), (12, 12, 0), (12, 12, 23), (15, 8, 8), (12,13,12), (12,19,8).

                            Il ne marche pas avec les valeurs:

                            (15, 8, 6) qui devrait afficher "True" mais affiche "False"

                            (16, 10, 23) qui devrait afficher "True" mais affiche "False"

                            (15, 8, 15)qui devrait afficher "True" mais affiche "False"

                            -
                            Edité par josmiley 24 septembre 2020 à 14:11:15

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Python c'est bon, mangez-en. 

                              24 septembre 2020 à 23:45:26

                              Bonjour à tous

                              Merci pour vos contributions. Je ne maîtrise pas encore l'utilisation des fonction, mais je dois écrire un autre code à la suite du précédent qui affiche les heures de 0 à 23 et qui marque d'un astérisque (*) les heures où il fait nuit. Cette-ci nous avons deux soleils (E1515 et E666).  Le programme doit lire en entrée:

                              - l'heure de lever du soleil E1515
                              - l'heure du coucher du soleil E1515
                              - l'heure de lever du soleil E666
                              - l'heure du coucher du soleil E666.

                              Ce code va donc  utiliser la fonction soleil_leve pour afficher ligne par ligne chacune des heures de la journée, depuis 0 jusqu'à 23, suivies d'une espace et d'une astérisque s'il fait nuit à cette heure. Voici par exemple ce qu'on doit afficher lorsqu'on utiliser en entrée les valeurs 6n 18, 10 et 21:

                              0 *
                              1 *
                              2 *
                              3 *
                              4 *
                              5 *
                              6
                              7
                              8
                              9
                              10
                              11
                              12
                              13
                              14
                              15
                              16
                              17
                              18
                              19
                              20
                              21 *
                              22 *
                              23 *
                              J'ai commencé à écrire le code ci-dessous, mais je suis bloqué parce que c'est la première fois que j'utilise les fonctions. 
                              def soleil_leve(leve_E1515, coucher_E1515, leve_E666, coucher_E666, actuelle):
                                  actuelle = coucher_E1515 == coucher_E666 # la nuit tombre quand les 2 soleils sont couchés
                                  for actuelle in range(0, 24): # actuelle = heure actuelle pour les deux soleils
                                      actuelle = actuelle + 1
                                      res = actuelle + '*' # pour faire suivre les chiffres où il fait nuit d'une étoile
                                      if coucher_E1515 == leve_E1515 == 0:  # L'heure du lever est la même que l'heure du coucher pour le premier soleil mais il fait nuit
                                          return res
                                      elif coucher_E1515 ==  leve_E1515 == 12: # L'heure du lever est la même que l'heure du coucher mais il fait jour
                                          return ()        
                                      elif leve_E1515<coucher_E1515 and leve_E1515<=actuelle<coucher_E1515 or coucher_E1515<leve_E1515 and not coucher_E1515<=actuelle<leve_E1515:
                                          return ()  #pour le cas où il ne fait pas nuit
                                      else:
                                          return res    # pour le cas où il fait nuit
                                      if coucher_E1515 == leve_E666 == 0:  # L'heure du lever est la même que l'heure du coucher pour le deuxième soleil mais il fait nuit
                                          return res
                                      elif coucher_E1515 ==  leve_E666 == 12: # L'heure du lever est la même que l'heure du coucher
                                          return ()        
                                      elif leve_E666<coucher_E666 and leve_E666<=actuelle<coucher_E666 or coucher_E666<leve_E666 and not coucher_E666<=actuelle<leve_E666:
                                          return () #pour le cas où il ne fait pas nuit
                                      else:
                                          return res  # pour le cas où il fait nuit
                                      return actuelle
                              leve_E1515 = int(input())
                              coucher_E1515 = int(input())
                              leve_E666 = int(input())
                              coucher_E666 = int(input())
                              print(soleil_leve(leve_E1515, coucher_E1515, leve_E666, coucher_E666, actuelle)) # pour afficher les heures de 0 à 23 avec des astérisques '*'
                              J'espère avoir vos contributions pour avancer.
                               

                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 septembre 2020 à 1:28:50

                                Je te conseille de commencer avec le cas où tu as un seul lever et un seul coucher de soleil.
                                Il semble que tu dois afficher un résultat par ligne. Ici, tu ne fais qu'un print.
                                Et tu ne génères pas de liste dans ta fonction.
                                Je pense que le for sur les heures actuelles devrait être    à l'extérieur de la fonction. Le print également.
                                Ensuite, tu additionnes des entiers avec des caractères, ça ne se fait pas de cette façon.
                                Peut-être que ta fonction ne devrait retourner qu'une chaîne vide ou la chaîne '*'.
                                Tu mettrais cette valeur dans ton print.
                                -
                                    # Dans un range, pas besoin de mettre la borne inférieure si c'est 0
                                    for actuelle in range(0, 24): # actuelle = heure actuelle pour les deux soleils
                                        actuelle = actuelle + 1   # On n'incrémente pas la variable d'un for dans la boucle.
                                Si tu peux évaluer le résultat de tes 'if' ou 'elif', je te suggère d'exécuter 'manuellement' ta fonction.
                                Testes toujours ton code avant de le soumettre et essaies de régler les erreurs de syntaxe ou autres erreurs évidentes.
                                Je ne conseille pas de mettre des print dans une fonction sauf pour débogguer. Mets un commentaire pour savoir où tu es:
                                print("je suis apres le premier if", variable_a_afficher)
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Le Tout est souvent plus grand que la somme de ses parties.

                                  25 septembre 2020 à 14:28:52

                                  je crois que tu dois utiliser la fonction précédemment définie et non pas la réécrire.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Python c'est bon, mangez-en. 

                                    25 septembre 2020 à 14:31:15

                                    comme le disent PierroLeFou et josmiley, la fonction soleil_leve, c'est la même qu'à l'étape précédente.

                                    Pour chaque heure, il faut l'appeler une fois pour le 1er soleil, et une seconde fois pour le second soleil. Ensuite, tu regardes si les 2 soleils sont couchés, tu mets un astérisque (astuce qui pourrait te servir False+False=0, True+False=1, True+True=2, sachant que Faux(False) correspond à soleil couché et Vrai(True) à soleil levé)

                                    -
                                    Edité par umfred 25 septembre 2020 à 14:31:49

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      25 septembre 2020 à 23:43:11

                                      Merci à vous tous pour les idées que vous m'avez fournies. Toutefois, je ne vous pas toujours comment faire pour avoir les astérisques à côtés des chiffres (2* par exemple) étant donnée qu'on ne peut pas additionner chiffres et lettres.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        26 septembre 2020 à 1:06:09

                                        Tu peux le faire dans le print
                                           print(heure,asterisque)   # où heure est un nombre et asterisque contient le caractère '*' ou ''
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Le Tout est souvent plus grand que la somme de ses parties.

                                          26 avril 2024 à 15:17:00

                                          Bonjour à tout le monde. Je pense sa question était de savoir comment positionner l'astérisque sur la bonne valeur comme il a montré dans cet exemple

                                           lorsqu'on utiliser en entrée les valeurs 6n 18, 10 et 21:

                                          0 *
                                          1 *
                                          2 *
                                          3 *
                                          4 *
                                          5 *
                                          6
                                          7
                                          8
                                          9
                                          10
                                          11
                                          12
                                          13
                                          14
                                          15
                                          16
                                          17
                                          18
                                          19
                                          20
                                          21 *
                                          22 *
                                          23 *
                                          voila par exemple ma fonction qui fonctionne, maintenant faut le programme qui va avec. 
                                          def soleil_leve(x,  y, z):
                                          
                                              if y == x == 0:  # l'heure du lever est la même que l'heure du coucher
                                                  return True
                                              elif y == x == 12:  # l'heure du lever est la même que l'heure du coucher
                                                  return False
                                              elif x<y and x<=z<y or y<x and not y<=z<x:  # L'heure actuelle est entre l'heure du lever et l'heure du coucher
                                                  return True
                                              else:
                                                  return False
                                          Merci d'avance pour vos précieux conseils et aides

                                          -
                                          Edité par pourtanteltourne 26 avril 2024 à 15:28:27

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            26 avril 2024 à 16:44:41

                                            ça serait mieux en donnant des noms explicites aux variables.

                                            Ton code répond à la demande initiale (qui a été résolu au cours du sujet) mais il y a eu une demande pour un second problème issu du 1er, dans le cas où il y a 2 soleils (en espérant que la personne revienne près de 4 ans après sa demande initiale)

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              27 avril 2024 à 14:40:43 - Message modéré pour le motif suivant : Merci d’utiliser le bouton code pour insérer un code sur le forum


                                              Lever et coucher du soleil

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              • Editeur
                                              • Markdown