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

Python c'est bon, mangez-en. 

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

Python c'est bon, mangez-en. 

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

Python c'est bon, mangez-en. 

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

19 novembre 2022 à 13:31:47 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


19 novembre 2022 à 14:25:34

La prochaine fois, crée ton propre sujet. Donnes ton code dans les balises à cet effet. On pourrait devoir faire un copier-coller pour tester.
  • Partager sur Facebook
  • Partager sur Twitter

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

19 novembre 2022 à 15:03:24

cernunnos! a écrit:

Bonjour, je voulais savoir ce qui n'allait pas avec mon programme et éviter de juste copier celui des autres. L'exercice est le même. Merci d'avance


Il ne faut pas que ton code soit placé dans une image, fais un copier coller de ton code dans une zone de code (bouton </>).

Sinon, ton erreur vient de ta variable poids, tu n'a pas mémorisé les poids dans une liste donc tu travailles en fait avec la dernière occurrence de cette variable.

e

  • Partager sur Facebook
  • Partager sur Twitter
19 novembre 2022 à 15:13:18

@cernunnos! Bonjour, merci de ne pas déterrer d'ancien sujet, créer le votre en postant votre code avec l'outil d'intégration de code du forum soit le bouton code </> de la barre d'outil du forum.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

-
Edité par AbcAbc6 19 novembre 2022 à 15:14:10

  • Partager sur Facebook
  • Partager sur Twitter