Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 27-09-2011 11:17:01

karlun
Membre
Inscription : 05-05-2010
Messages : 216

Exercice (Python) sur énigme voisins-voisines.

Bonjour,

J'ai choisi de créer cette nouvelle discussion car j'ai peur qu'on pense que je souhaite m'immiscer dans la discussion (un peu trop ardue pour moi) « Voisins, voisines, (code sur énigme de Freddy) »;

A partir de l'énoncé que Freddy a soumis à notre réflexion, en guise d'exercice, je propose le petit code suivant (qui me trottait dans la tête) qui rend compte que le hasard  du choix des paires à répartir n'influe pas sur le nombre de tirages total.

Voici l’énoncé rappelé:

« Vingt et une personnes, dont Paul et Virginie, du club Med' de Peysey Nancroix, sont assises autour d'une table circulaire pour participer à un jeu "step by step".
Une étape consiste à choisir au hasard une personne qui a au moins deux coquillages ; celle-ci doit alors donner un coquillage à chacun de ses deux voisins (voisines).
Au départ du jeu, une personne a 20 coquillages, les autres n'ont rien.
A l'issue de 384 étapes, Virginie a deux coquillages de plus que Paul.
Combien ont ils respectivement ? »
(La réponse dépendra si  Paul et Virginie sont voisins (on le pense bien) ou pas.)

Voici:


# usr/bin/env python
# -*- coding: cp1252 -*-
from __future__ import division
from math import*
from time import time
import random
voisin,n=[0]*21,0                  
#crée une liste de 21*0 et initialise n (nombre d'étapes)
p = random.randint(0,20)            
#génere une p personne(aléatoire)recevant 20 coquillages
voisin[p]=20
print "étape n°",n,":",voisin
while max(voisin)>1:                
#tant qu'une personne possède plus d'1 coquillage on continue.
    n+=1                            
#compteur d'étape
    r = random.randint(0,20)        
#génere une r position(aléatoire)parmis les 21.
    while voisin[r]<2:              
#tant que le voisin occupant la position r n'a pas au moins
    #2 coquillages, on recommence le tirage.
        r = random.randint(0,20)
    voisin[r]-=2                    
#le voisin r possédant au moins 2 coquillages en donne 1 à ses voisins.
    voisin[r-1]+=1                  
#le voisin de gauche reçois 1 coquillage.
    if r+1>20:                      
#astuce pour rendre voisin la 21° personne avec la première (si besoin).
        r-=20                      
#(bouclage du cercle rendant le tirage au sort initial de la personne recevant
        voisin[r]+=1                
#les 20 coquilages inutile;  mais bon!)
    else:
        voisin[r+1]+=1              
#le voisin de droite reçois 1 coquillage.
    print "étape n°",n,":",voisin  
#résultat de l'opération

Peut-être peut-on encore le condenser?

A+-*/

PS: Merci pour vos conseils #2 #3.
      Moyennant une dédentation sur l'ensemble d'un copier-coller ça fonctionne (chez moi)

Dernière modification par karlun (27-09-2011 12:56:33)


Qui trouve, cherche.

Hors ligne

#2 27-09-2011 12:14:57

totomm
Membre
Inscription : 25-08-2011
Messages : 1 093

Re : Exercice (Python) sur énigme voisins-voisines.

Bonjour,

j'ai essayé votre code : il faut import random en tête
ensuite il ne s'arrête pas à cause de l'imbrication d'un 2ème while dans le premier

Je vous suggère  de mettre votre version de Python en commentaire en-tête de votre code
et de mettre la balise "code=Python" et non simplement la balise code pour avoir la couleur.

Sauf erreurs de ma part.
cordialement

Hors ligne

#3 27-09-2011 12:29:49

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : Exercice (Python) sur énigme voisins-voisines.

Salut karlun,

Ça fait une paie...
Non, pas de problème, je t'engage à ajouter ton code dans la discussion qui est consacrée à ce sujet : tous ces codes sont les bienvenus, pas de problème d'immixtion...
Bon ton code me semble incomplet, non ?
1. J'ai revu l'indentation l'indentation des lignes 2-3-4-5 par ex devraient être nulle, non (alignées avec ligne 1)
2. J'ai ajouté en en-tête "import random" sinon j'ai un message d'erreur
3. Il m'affiche la liste voisin avec ses 21 zéros et depuis j'attends... Ce n'est pas normal (pas dans tes habitudes).

Un conseil : les retours à la ligne des commentaires mettent le bazar : donc commence sur une ligne vide et si tu vas au delà du 79e caractère, coupe, va à la ligne et écris une suite du commentaire...

Condenser ton code ? Il est déjà bien serré, non ?
On verra ça (pas grand espoir), quand je saurais ce qui cloche dans mon adaptation...

@+

[EDIT]
Encore une fois trop bavard.
totomm m'a devancé.

(...) et de mettre la balise "code=Python" et non simplement la balise code pour avoir la couleur

Pas d'erreur sauf que la colorisation ne me convient pas, elle n'est pas satisfaisante.
Mais, ce problème est sur ma liste des choses à faire : je dispose (en théorie) des infos nécessaires et du fichier qui commande la couleur que m'a envoyé Fred : je vais avoir le temps de me pencher sur le correctif à apporter maintenant que mariage et déménagement sont passés...
Serais-je capable de faire les modifs ? Ça, comme aurait dit Kipling, c'est une autre histoire....

[EDIT2]karlun
je viens de faire un copier/coller dans Python et j'ai lancé le programme : il plante...
Message d'erreur :
Syntax error.
there's an error in your program : unexpected indent

Et le curseur est placé devant voisin, ligne 7.

Désolé, tovarich
[EDIT 3] Indenntations toutes corrigées : ça marche !
Bizarre un copier/coller  devrait suffire...
Peut-être est-ce la faute de chrome (FF merde sérieusement chez moi avec BibMath, donc j'utilise Chrome pour bibmath).

[EDIT4]C'est un peu Chrome et beaucoup la balise code...
Avec FF, après copier/coller l'indentation n'est pas fantaisiste comme dans Chrome, mais tout est décalé de 4 caractères vers la droite : c'est la place occupée avant par la numérotation (même si elle n'apparaît plus) qui met le bazar.
Je transmets à Fred.
Affaire à suivre...

Dernière modification par yoshi (27-09-2011 12:57:33)


Arx Tarpeia Capitoli proxima...

Hors ligne

#4 27-09-2011 18:35:19

totomm
Membre
Inscription : 25-08-2011
Messages : 1 093

Re : Exercice (Python) sur énigme voisins-voisines.

Bonsoir,

C'est du Python 2.7, mais qui est OK sous Python 3.2 si on ajoute les parenthèses aux print()

Inutile de tirer au sort le placement des 20 coquillages du  début : toutes les positions étant équivalentes, il suffit de les placer en position 10 (ligne 11 voisin[10]=20)

On voit aussi que la position du 0 final est toujours celle des 20 initiaux et que le bouclage en cercle est inutile
mais voir les démonstrations dans l'énigme "voisins voisines" en laissant de coté ce qui serait trop difficile.

et n'hésitez pas à poser des questions de compréhension...

Cordialement

@yoshi : Je ne faisais pas la course, surtout que je me suis référé à votre code pour voir ce qui clochait :-)
En plus j'ai dit une bétise sur l'imbrication des while !

Hors ligne

#5 27-09-2011 20:14:54

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : Exercice (Python) sur énigme voisins-voisines.

RE,

Je ne faisais pas la course,

Quelle course ? Où ça ? Quand ça ?
Je n'ai rien vu, : trop occupé à comprendre pourquoi l'indentation clochait après copier/coller !
Maintenant, je sais...
Fred va sûrement trouver et moi je vais devoir mettre le nez dans le fichier de configuration des couleurs et ça, ça ne va pas être du gâteau...

Karlun nous la joue à la nerosson : il se dévalorise.
Dans mes souvenirs, question programmation, il tenait la route !

Alors, si on est 3, 3 styles différents dans le forum programmation, c'est bien...
Je me suis fait longtemps l'effet d'être Saint Simon prêchant dans le désert !
Sur tout ce que j'ai publié, jamais un retour : ce n'était pas très encourageant...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
soixante trois plus soixante dix
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums