Partage
  • Partager sur Facebook
  • Partager sur Twitter

France IOI Repartition du poids - Aide

    26 septembre 2019 à 17:17:37

    Bonjour,

    Je suis bloqué sur cet exercice 

    http://www.france-ioi.org/algo/task.php?idChapter=651&idTask=2074

    Ce que doit faire votre programme :

    On vous décrit les charrettes qui composent une caravane, en vous donnant pour chacune, le poids des marchandises qu'elle transporte.

    Votre programme doit déterminer quel poids ajouter ou retirer à chaque charrette, pour qu'elles transportent toutes ensuite le même poids, et ce sans modifier le poids total transporté par l'ensemble des charrettes de la caravane.

    Entrée

    L'entrée commence par un entier nbCharrettes (nbCharrettes <= 3000) : le nombre de charrettes de la caravane.

    Les nbCharrettes lignes suivantes décrivent chacune une charrette par un nombre décimal : le poids qu'elle transporte initialement.

    Sortie

    Vous devez afficher nbCharrettes nombres décimaux sur la sortie : le poids à ajouter à chaque charrette (ce qui revient à en retirer si ce nombre est négatif), dans le même ordre que celui de l'entrée. Il n'y a pas d'arrondis à faire.

    Exemple

    entrée :

    5
    40.0
    12.0
    20.0
    5.0
    33.0

    sortie :

    -18.0
    10.0
    2.0
    17.0
    -11.0

    Commentaires

    Dans cet exemple, on modifie toutes les charettes pour qu'elles transporte chacune un poids de 22.0, soit un total de 110 pour la caravane, comme au départ.

    Voici mon code et le message d'erreur qui s'affiche :

    nbCharettes=int(input())
    Caravane=[0]*nbCharettes
    PoidsTotal=0
    for idCharette in range (nbCharettes):
       poidsCharette=float(input())
       Caravane[poidsCharette]=Caravane[poidsCharette]+poidsCharette
       PoidsTotal=PoidsTotal+poidsCharette
    Moyenne=PoidsTotal/nbCharettes
    for poidsCharette in range(nbCharettes):
       if Caravane[poidsCharette]>Moyenne:
          Caravane[poidsCharette]= Moyenne - Caravane[poidsCharette]
       if Caravane[poidsCharette]<Moyenne:
          Caravane[poidsCharette]= Moyenne - Caravane[poidsCharette]
       print(Caravane[poidsCharette])  
          
          
    Traceback (most recent call last):
      line 6
        Caravane[poidsCharette]=Caravane[poidsCharette]+poidsCharette
    TypeError: list indices must be integers, not float

    J'imagine que ma liste n'accepte que des nombres entiers? SI quelqu'un peu m'aider sur ce point et éventuellement me dire si je suis sur la bonne voie niveau code? 

    merci

    • Partager sur Facebook
    • Partager sur Twitter
      26 septembre 2019 à 17:31:33

      Ton code est bien, je pense que ligne 6 tu voulais plutôt écrire :

      Caravane[idCharette]=poidsCharette


      Une autre façon d'écrire PoidsTotal est :

      PoidsTotal += poidsCharette

      Ca fait la même chose que toi mais c'est plus d'usage en python, ca fonctionne aussi avec "-" ,"*" et "/"

      -
      Edité par Jojuss 26 septembre 2019 à 17:32:32

      • Partager sur Facebook
      • Partager sur Twitter
        26 septembre 2019 à 17:51:30

        Salut, 

        J'ai un peu modifié le code :

        nbCharettes=int(input())
        Caravane=[0]*nbCharettes
        PoidsTotal=0
        for idCharette in range (nbCharettes):
           poidsCharette=float(input())
           Caravane[idCharette]=poidsCharette
           PoidsTotal+=poidsCharette
        Moyenne=PoidsTotal/nbCharettes
        for idCharette in range(nbCharettes):
           if Caravane[idCharette]>Moyenne:
              Caravane[idCharette]= Moyenne - Caravane[idCharette]
           if Caravane[idCharette]<Moyenne:
              Caravane[idCharette]= Moyenne - Caravane[idCharette]
           print(Caravane[idCharette]) 
        Échec

        Message de l'évaluateur :

        Nombre total de valeurs affichées : 5
        Votre valeur numero 1 (40.0000000000) est à une distance supérieure à 10.0 de la reponse attendue.

        Erreur dans le résultat.

        0 %
        Test 2 Succès

        Exécuté en 0,05 seconde.

        100 %
        Test 3 Succès

        Exécuté en 0,05 seconde.

        100 %
        Test 4 Échec

        Erreur dans le résultat.

        0 %

        Du coup, comment limiter le nombre de 0 après la virgule, si l'erreur ne vient que de là lol... ? Merci

        • Partager sur Facebook
        • Partager sur Twitter
          26 septembre 2019 à 18:14:20

          L'erreur ne vient pas de nombre de 0 après la virgule, j'avais mal lu la fin de ton code, et il est faux :

          Tu veux calculer l'écart qu'il y a entre le poids de ta charrette et ta moyenne,

          for idCharette in range(nbCharettes):   
                Caravane[idCharette] = Caravane[idCharette] - Moyenne #si le poids < moyenne, l'écart sera negatif, sinon positif
          

          Mais dans le début de ton code Caravane[idcharette] c'est le poids de ta charrette et ensuite tu le transforme pour être l'écart entre le poids et la moyenne, c'est pas super, tu devrais plutôt créer une nouvelle liste pour t'y retrouver plus simplement.

          -
          Edité par Jojuss 26 septembre 2019 à 18:15:27

          • Partager sur Facebook
          • Partager sur Twitter
            26 septembre 2019 à 18:43:24

            Mon code jusque la ligne 8 est bon? 

            Ensuite je rentre tes deux lignes de codes pour comparer chaque charette actuel avec le poids moyen qu'elle devrait avoir. 

            Mais ensuite c'est a ce moment que je dois créer un nouvelle liste? pour y mettre quelle valeur....??

            Parce que dans ma logique, si je reprends le cas de l'exemple : 

            if Caravane[idCharette]>Moyenne:
            Caravane[idCharette]= Moyenne - Caravane[idCharette]
            if Caravane[idCharette]<Moyenne:
            Caravane[idCharette]= Moyenne - Caravane[idCharette]

            if 40>22 il va me remplacer le 40 dans ma liste caravanne par : 22-40 soit les -18 à afficher

            if 12<22 il va me remplacer le 12 dans ma liste caravanne par 22-12 soit les 10 à afficher. 

            a la fin de tous ces if j'ai ma nouvelle liste avec -18, 10, etc. et je n'ai plus qu'à l'afficher. 

            -
            Edité par RaphaëlBitoun 26 septembre 2019 à 18:58:16

            • Partager sur Facebook
            • Partager sur Twitter
              27 septembre 2019 à 9:53:53

              Désolé j'ai pas fait gaffe j'ai dis des âneries  Pour le coup dans l'exemple que tu donnes tu voit bien que peu importe ta condition tu fait la même chose, donc ta condition sert à rien. 

              J'ai testé un peu et avec ce code ca fonctionne :

              nbCharettes=int(input())
              Caravane=[0]*nbCharettes
              PoidsTotal=0
              for idCharette in range (nbCharettes):
                 poidsCharette=float(input())
                 Caravane[idCharette]=poidsCharette
                 PoidsTotal+=poidsCharette
              Moyenne=PoidsTotal/nbCharettes
              print(Moyenne)
              for idCharette in range(nbCharettes):
                  Caravane[idCharette]= Moyenne - Caravane[idCharette]
                  print(Caravane[idCharette])

              Ce qui fait que ca marchait pas pour toi c'est que ici :

              if Caravane[idCharette]>Moyenne:
              Caravane[idCharette]= Moyenne - Caravane[idCharette]
              if Caravane[idCharette]<Moyenne:
              Caravane[idCharette]= Moyenne - Caravane[idCharette]

              Tu changes la valeur du poids ligne 2 pour en faire ton écart, et du coup il est possible que ligne 3 ta condition soit remplie et qu'il rechange l'écart. 


              • Partager sur Facebook
              • Partager sur Twitter
                27 septembre 2019 à 11:08:05

                Salut, 

                Super merci de ta réponse, en fait il fallait juste faire la moyenne -  la valeur dans le tableau et afficher chaque valeur du tableau. 

                PS: Ta ligne 9  print(moyenne) est à supprimer

                MERCI!!

                -
                Edité par RaphaëlBitoun 27 septembre 2019 à 11:14:31

                • Partager sur Facebook
                • Partager sur Twitter
                  23 février 2021 à 14:38:51

                  Hello j ai la solution 
                  nbCharrettes=int(input())
                  poids_total=0
                  poids_liste=[]
                  for i in range (nbCharrettes):
                      poids=float(input())
                      poids_total=poids_total+poids
                      poids_liste.append(poids)
                  goal_poids=(poids_total/nbCharrettes)
                  item=0
                  for i in range (len(poids_liste)):
                      print(goal_poids-poids_liste[item])
                      item=item+1
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 février 2021 à 16:47:48

                    un an  et demi plus tard, alors qu'il avait aussi la solution ^^

                    et pourquoi dans le 2nd for utiliser len(poids_liste) et pas nbCharettes pour le range, c'est la même valeur

                    et utiliser i au lieu de item en indice (parce que i et item évolue de la même façon)

                    -
                    Edité par umfred 23 février 2021 à 16:48:14

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 février 2021 à 18:13:53

                      Hello j'ai la solution :)
                      C'est un déterrage.
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        24 février 2021 à 18:16:21

                        Il semble que le sujet n'a pas été fermé par la modération. Le PO s'est connecté en février.
                        Voici donc mon petit grain de sel:
                        -
                        nbCharettes = int(input())
                        charettes = [float(input()) for _ in range(nbCharettes)]
                        moyenne = sum(charettes) / nbCharettes
                        print(*[moyenne - c for c in charettes], sep='\n', end='')
                        • Partager sur Facebook
                        • Partager sur Twitter

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

                          25 février 2021 à 9:50:23

                          PierrotLeFou a écrit:

                          Il semble que le sujet n'a pas été fermé par la modération. Le PO s'est connecté en février.
                          Voici donc mon petit grain de sel:
                          -
                          nbCharettes = int(input())
                          charettes = [float(input()) for _ in range(nbCharettes)]
                          moyenne = sum(charettes) / nbCharettes
                          print(*[moyenne - c for c in charettes], sep='\n', end='')


                          Mon petit grain de poivre :D : 

                          • dans le print, inutile de créer une liste (un générateur suffit) et le end n'est pas utile (pour passer les tests)
                          • écrire un oneliner, sans bien sûr recalculer à chaque fois la moyenne
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 février 2021 à 4:35:56

                            + je n'ai pas trouvé comment ...
                            • Partager sur Facebook
                            • Partager sur Twitter

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

                              26 février 2021 à 5:16:18

                              PierrotLeFou a écrit:

                              + je n'ai pas trouvé comment ...


                              Avec le walrus ...
                              • Partager sur Facebook
                              • Partager sur Twitter

                              "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                                26 février 2021 à 7:26:14

                                tBravo, je viens de sauver une ligne:
                                nbCharettes=len(charettes:=[float(input()) for _ in range(int(input()))])
                                moyenne=sum(charettes)/nbCharettes
                                print(*[moyenne-c for c in charettes],sep='\n')
                                Mais je ne vois pas comment tout mettre dans une ligne sans réévaluer la moyenne.
                                • Partager sur Facebook
                                • Partager sur Twitter

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

                                  26 février 2021 à 9:00:09

                                  PierrotLeFou a écrit:

                                  tBravo, je viens de sauver une ligne:
                                  nbCharettes=len(charettes:=[float(input()) for _ in range(int(input()))])
                                  moyenne=sum(charettes)/nbCharettes
                                  print(*[moyenne-c for c in charettes],sep='\n')
                                  Mais je ne vois pas comment tout mettre dans une ligne sans réévaluer la moyenne.


                                  ben, tu peux encore mettre des walrus, et nbCharette ne sert qu'une seule fois, donc ...

                                  Après je ne sais pas comment a fait PascalOrtiz, moi j'ai "triché" en chaînant le calcul et le print, car on ne peut pas utiliser les walrus dans les générateurs/compréhension.

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                                    26 février 2021 à 11:03:38

                                    josmiley a écrit:

                                    Après je ne sais pas comment a fait PascalOrtiz, moi j'ai "triché" en chaînant le calcul et le print, car on ne peut pas utiliser les walrus dans les générateurs/compréhension.

                                    J'ai fait comme ceci :

                                    print(*[[M - c for c in L]  for L in [[float(input()) for _ in range(int(input()))]] for M in [sum(L)/len(L)]][0], sep='\n')

                                    et que l'on doit pouvoir simplifier. 

                                    Tu pourras montrer ton code avec walrus stp ?

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      26 février 2021 à 11:58:33

                                      PascalOrtiz a écrit:

                                      J'ai fait comme ceci :

                                      print(*[[M - c for c in L]  for L in [[float(input()) for _ in range(int(input()))]] for M in [sum(L)/len(L)]][0], sep='\n')

                                      et que l'on doit pouvoir simplifier. 

                                      Tu pourras montrer ton code avec walrus stp ?

                                      Bien joué le [sum(L)/len(L)]][0], j'avais essayé un truc dans ce genre mais j'arrivais pas à mettre le doigt dessus.

                                      J'ai fait comme ça:

                                      (m:=sum(xs:=[float(input())for i in range(int(input()))])/len(xs)) and print(*(m-x for x in xs),sep='\n')



                                      -
                                      Edité par josmiley 26 février 2021 à 12:02:16

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                                        26 février 2021 à 12:06:06

                                        Intéressant, merci. J'utilise pas souvent walrus mais il peut simplifier pas mal de choses sans trop obscurcir. Pour france-ioi, il est pas encore supporté.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          26 février 2021 à 17:47:02

                                          Je me suis rendu jusque là:
                                          moyenne = sum(charettes:=[float(input()) for _ in range(int(input()))]) / len(charettes)
                                          print(*[moyenne-c for c in charettes],sep='\n')
                                          Mais je fais piètre figure maintenant ...
                                          Je vais regarder attentivement vos solutions. :)
                                          • Partager sur Facebook
                                          • Partager sur Twitter

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

                                            26 février 2021 à 21:43:30

                                            J'ai l'impression que walrus rend plus simple l'écriture de oneliner, voici ce que ça donne chez moi :

                                            (n:=int(input()), L := [float(input()) for _ in range(n)], m:=sum(L)/len(L),print(*(m - c for c in L), sep='\n'))
                                            
                                            $ python3.9 walrus.py < test.in 
                                            -18.0
                                            10.0
                                            2.0
                                            17.0
                                            -11.0




                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              27 février 2021 à 1:51:09

                                              @PascalOrtiz:
                                              Amélioration magistrale :)
                                              Remplacer  len(L)  par  n  tout simplement.
                                              Quand tu me parlais de générateur, faire print(*(...)) au lieu de print(*[...]), c'est ce que tu voulais dire?
                                              • Partager sur Facebook
                                              • Partager sur Twitter

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

                                                27 février 2021 à 2:41:26

                                                PierrotLeFou a écrit:

                                                @PascalOrtiz:
                                                Amélioration magistrale :)

                                                Je n'en mérite pas tant !

                                                PierrotLeFou a écrit:

                                                Quand tu me parlais de générateur, faire print(*(...)) au lieu de print(*[...]), c'est ce que tu voulais dire?


                                                Absolument. Mais les générateurs ont quand même leurs limites : ils sont jetables. Ainsi, dans ton code, on ne pouvait pas remplacer ta première liste par un générateur.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  22 mars 2022 à 21:28:27

                                                  Boinsoooir, perso je l'ai fait de cette manière et ca a fonctionné pour ceux qui veulent:

                                                  nbCharettes = int(input())
                                                  i = [0] * nbCharettes
                                                  b = 0
                                                  c = 0
                                                  for loop in range(nbCharettes):
                                                     i[loop] = float(input())
                                                     b = i[loop] + b
                                                  b = b / nbCharettes
                                                  for loop in range(nbCharettes):
                                                     i[loop] = i[loop] - b
                                                     if i[loop] > 0:
                                                        c = i[loop]
                                                        c = i[loop] - i[loop] - i[loop]
                                                     else:
                                                        if i[loop] < 0:
                                                           c = i[loop]
                                                           c = i[loop] - i[loop] - i[loop]
                                                        else:
                                                           c = 0
                                                     i[loop] = c
                                                     print(c)
                                                  



                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    23 mars 2022 à 10:42:08

                                                    lignes 12 et 16 inutiles, ton bloc condition fait 2 fois la même chose, et revient en fait à tester si i[loop] !=0 (le dernier else correspondant à i[loop]==0)

                                                    la ligne 20 ne sert à rien non plus, puisque loop passe loop+1 en revenant au début de la boucle

                                                    de plus, si on on se penche sur l'opération réalisée au final, on a c = (i[loop]-b) - (i[loop]-b) - (i[loop]-b) = - (i[loop]-b) = b-i[loop] c'est plus simple, non ? :p

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      23 mars 2022 à 21:11:15

                                                      Bonjour.

                                                      Allez, je me permets de proposer ma version avec une petite entorse à l'énoncé :

                                                      NbCharrettes = int(input("Nombre de charrettes : "))
                                                      
                                                      print("")
                                                      
                                                      PoidsCharrettes = []
                                                      for i in range(NbCharrettes):
                                                          PoidsCharrettes.append(float(input(f"Poids de la charrette n° {i + 1} : ")))
                                                      
                                                      PoidsTotal = sum(PoidsCharrettes)
                                                      PoidsUnitaire = PoidsTotal / NbCharrettes
                                                      
                                                      print("")
                                                      
                                                      for i in range(NbCharrettes):
                                                          print(f"Charrette n° {i + 1} :" + "{:>8.2f}".format(PoidsUnitaire - PoidsCharrettes[i]))

                                                      Ce qui, avec les données de l'énoncé, donne :

                                                      Nombre de charrettes : 5
                                                      
                                                      Poids de la charrette n° 1 : 40
                                                      Poids de la charrette n° 2 : 12
                                                      Poids de la charrette n° 3 : 20
                                                      Poids de la charrette n° 4 : 5
                                                      Poids de la charrette n° 5 : 33
                                                      
                                                      Charrette n° 1 :  -18.00
                                                      Charrette n° 2 :   10.00
                                                      Charrette n° 3 :    2.00
                                                      Charrette n° 4 :   17.00
                                                      Charrette n° 5 :  -11.00



                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      PB68

                                                      France IOI Repartition du poids - Aide

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