Toutes les explications en vidéo ici
À la maternelle, l’instituteur a donné des bonbons aux enfants. Le nombre de bonbons que chaque enfant reçoit n’est pas toujours le même. Voici par exemple une distribution possible : [10,2,8,22,16,4,10,6,14,20]
L’instituteur a demandé aux enfants de faire un cercle et de jouer à un jeu : chaque enfant donne la moitié de ses bonbons à l’enfant sur sa droite (en même temps). Si le nombre de bonbons est un nombre impair, l’enseignant lui donne un bonbon supplémentaire pour que le partage tombe juste.
On répète cette procédure jusqu’à ce que les enfants aient le même nombre de bonbons.
Vous devez créer une fonction distrib qui, à partir de la distribution initiale de l’instituteur, affiche les différentes étapes jusqu’à ce que tous les enfants aient le même nombre de bonbons.
>> distrib([ 1,2,3,4,5 ])
[ 4,2,3,4,5 ]
# Le 1er enfant qui n'a qu'un bonbon reçoit de l'instit un autre bonbon qu'il donne au 2e
# Le dernier qui en a 5 reçoit de l'instit un autre bonbon et donne donc 6/2 = 3 au premier enfant
# L'enfant n°1 a donc bien 1+3 = 4 bonbons à la première étape
[ 5,3,3,4,5 ]
[ 6,5,4,4,5 ]
[ 6,6,5,4,5 ]
[ 6,6,6,5,5 ]
[ 6,6,6,6,6 ]
Dans cet exemple ont voit que tous les enfants auront 6 bonbons à la fin du jeu.
def moitie(n): if n%2==0: return n/2 return (n+1)/2 # ou juste : return (n+1)//2 def distrib(bb): while not(all(b==bb[0] for b in bb)): # ou while len([b for b in bb if b!=bb[0]])>0: suiv=[0]*len(bb) for i,b in enumerate(bb): suiv[i]+=moitie(b) if i+1<len(bb): suiv[i+1]+=moitie(b) else: suiv[0]+=moitie(b) bb=suiv print(bb) return "FIN" # Version 2 def distrib2(bb): while not(all(b==bb[0] for b in bb)): decal = bb[-1:]+bb[:-1] bb = [moitie(decal[i]) + moitie(v) for i,v in enumerate(bb)] print(bb) return "FIN"