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 20-12-2011 13:55:18

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

(Python) Distributions d'éléments.

Bonjour,

Voici le programme Python capable (sauf erreur toujours possible) de résoudre l'énigme proposée ici: http://www.bibmath.net/forums/viewtopic.php?id=5111

J'imagine qu'on peut faire plus condensé.


# -*- coding: cp1252 -*-

def b(nbre_elem,nj,joueurs,sol):
    c=nbre_elem[0]
    j,b=1,0
    while b<c:      
        nbre_elem[0]-=1
        nbre_elem[j]+=1
        j+=1
        b+=1
        if j>nj-1:
            j=0
    joueurs.append('joueur 0')
    nbre_elem.append(0)  
    joueurs[-1]=joueurs[0]
    nbre_elem[-1]=nbre_elem[0]
    del(joueurs[0])
    del(nbre_elem[0])
    return joueurs,nbre_elem,sol

def tot(ne,nj,nd):
    def c(nbre_elem,nj,y):
        c=nbre_elem[y]
        j,b=1,0
        if y==nj-1:
            j=-nj+1
        while b<c:    
            nbre_elem[y]-=1      
            nbre_elem[j+y]+=1
            j+=1
            b+=1
            if j+y>=nj:
                j=-nj+(nj-y)
        return nbre_elem

    y,i=-1,0
    joueurs,nbre_elem,sol,tot=[],[0]*nj,[],[0]*nj
    nbre_elem[0]+=ne
       
    while i<nd:
        y+=1
        if y>=nj:
            y=0
        s=c(nbre_elem,nj,y)
        for z in xrange(0,nj,1):
            tot[z]+=s[z]
        i+=1
    return tot

p=input('entrez le nombre maximum de joueurs : ')
q=input("entrez le nombre maximum d'éléments à distribuer disponibles: ")
print
a1,a2,a3,a4=[],[],[],[]

for nj in xrange(3,p+1,1):
    for ne in xrange(1,q+1,1):
        joueurs,nbre_elem,sol=[],[0]*nj,[]
        nbre_elem[0]+=ne              #au départ, j0 a en main tous les éléments

        for n in xrange(0,nj,1):
            joueurs.append(('j ',str(n)))
            joueurs[n]=''.join(joueurs[n])  # J0,J1,J2,J3
        i,d,nbre_de_cycles=0,20,1   #d=nombre de distributions possibles
                                    #nbre_de_cycles avant répétition
        while i<=d:
            sol.append(str(b(nbre_elem,nj,joueurs,sol)[1]))

            if i>=nj:                       #Les comparaisons commencent après le
                for e in xrange(nj,0,-1):
                    if sol[i]==sol[i-e]:
                        if len(sol[i-e:i])==nbre_de_cycles: # nombre de cycle(s)
                                                # différents voulus avant répétition.
                            nd=i-e+1
                            gagnant=tot(ne,nj,nd)
                            a1.append( max(gagnant))
                            a2.append(gagnant.index(max(gagnant)))
                            a3.append(ne)
                            a4.append(nj)
                           
                        d=i                 # met fin à while
            i+=1
print 'Le gagnant a un score de',max(a1),'''et occupe la place n°''',a2[a1.index(max(a1))]
print 'avec',a3[a1.index(max(a1))],'éléments et',a4[a1.index(max(a1))],'participants'                          
 

et qui donne après exécution:


>>>
entrez le nombre maximum de joueurs : 6
entrez le nombre maximum d'éléments à distribuer disponibles: 52

Le gagnant a un score de 160 et occuppe la place n° 0
avec 46 éléments et 4 participants
>>>
 

A+-*/

PS: En modifiant  code (entre crochets) par code=python (entre crochets) c'est plus joli.

Dernière modification par karlun (22-12-2011 08:44:59)


Qui trouve, cherche.

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)?
quatre-vingt neuf plus dix-sept
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