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 26-10-2011 09:58:32

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

(Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Bonjour,

Exercice, exercice sympathique...

Au sujet  France 4 - 2 Nouvelle Zélande je joins une autre approche « programmatrice » construisant tous les résultats possibles triés par tentatives.
Quelques lignes supplémentaires suffiront pour trouver après combien de tentatives il est possible d'avoir un score choisi

voici:




# usr/bin/env python
#-*- coding: cp1252 -*-

score,scoreprov,l,lprov,n=[0],[0],1,1,0
# initialise les listes nommées 'score' ,'scoreprov' et leur longueur
while n<10:
# n est le nombre de tentative(s) réussie(s) (drops, pénalités, essais, essais transformé)
    for i in xrange(3,8,2):
# points possibles attribués (3,5,7)
        for j in xrange(0,l,1):
            score.append(score[j]+i)
# ajout à la liste 'score' des points possibles pour cette tentative
    score=list(set(score))
# enlève les doublons, triplons et range la liste (croissante)
    for k in xrange(0,lprov,1):
        score.remove(scoreprov[k])
#supprime les scores de la tentative précédente
    scoreprov=score
    l,lprov=len(score),len(scoreprov)
# réinitialisation
# nouveau score provisoire et nouvelle longueur des listes
    n+=1
# compteur des tentatives
    print n,"° tentative réussie =>scores possibles: "
    print score
   
 



A+-*/

PS: Il faudra copier le programme et opérer une dédentation sur son ensemble ...
et puis je remarque (depuis toujours) que la coloration syntaxique de Python disparait après le premier 'run'; y-a-t'il un remède?

Dernière modification par karlun (26-10-2011 10:12:03)


Qui trouve, cherche.

Hors ligne

#2 26-10-2011 10:58:05

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Re,

je remarque (depuis toujours) que la coloration syntaxique de Python disparait après le premier 'run'; y-a-t'il un remède?

1. Il faudrait que je prenne le temps de lettre le nez dans la fichier de configuration de coloration syntaxique dédié à python, si tant est que j'arrive à quelque chose,
2. Cette coloration-ci est due au fichier de configuration (cf point 1.) : avec l'IDLE de Windows, elle est différente.
    La coloration syntaxique n'y disparaît pas si j'enregistre le fichier avec l'extension .py.
    Qu'utilises-tu comme éditeur ?
3. Pour ne pas avoir à désindenter, utilise la version spéciale nerosson  avec code=crypto, mais plus de couleur.
    Nan, même pas, je viens de tester :
    a) j'ai copié les lignes  25 (incluse) à 1 incluse,
    b) puis j'ai ouvert l'IDLE de Windows et j'ai collé le contenu du Presse-Papiers : indentation préservée.
    c) j'ai enregistré ces 25 lignes sous le nom de rugby_scores_karlun.py...
    d) je l'ai lancé 5 fois de suite : après la 5e exécution, la coloration syntaxique propre à l'IDLE de Windows était toujours là...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 26-10-2011 13:10:06

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

re,

Je me suis rendu compte que j'avais oublié de montrer ce que ça donne comme résultat pour 10 tentatives réussies (par ex.).

Voici:

>>>
1 ° tentative réussie =>scores possibles:
[3, 5, 7]
2 ° tentative réussie =>scores possibles:
[6, 8, 10, 12, 14]
3 ° tentative réussie =>scores possibles:
[9, 11, 13, 15, 17, 19, 21]
4 ° tentative réussie =>scores possibles:
[12, 14, 16, 18, 20, 22, 24, 26, 28]
5 ° tentative réussie =>scores possibles:
[33, 35, 15, 17, 19, 21, 23, 25, 27, 29, 31]
6 ° tentative réussie =>scores possibles:
[18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42]
7 ° tentative réussie =>scores possibles:
[21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]
8 ° tentative réussie =>scores possibles:
[24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56]
9 ° tentative réussie =>scores possibles:
[27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63]
10 ° tentative réussie =>scores possibles:
[30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70]
>>>

Merci Yoshi pour les bons conseils; la coloration syntaxique de Python reste permanente grâce à l'ajout de l'extension '.py' au nom du fichier.

A+-*/

Dernière modification par karlun (26-10-2011 13:11:14)


Qui trouve, cherche.

Hors ligne

#4 27-10-2011 10:26:13

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Bonjour,

Bon, bin, vu ce qu'a fait karlun, je ne pouvais pas être en reste, s'pas ?
Donc, v'là un premier jet où je vous propose de choisir un score - limité à 120 points (c'est déjà pas si mal, hein ?) et de voir les répartitions possibles des faits de jeu.

#!/usr/bin/env python
# -*- coding: CP1252 -*-

from operator import itemgetter

def titre():
    esp =' '*28
    etoiles = "*"*23
    print esp + etoiles
    print esp+"*"+' '*21+"*"
    print esp + "*   Scores de Rugby   *"
    print esp + "*   - Répartition -   *"
    print esp+"*"+' '*21+"*"
    print esp + etoiles
    print
    print

titre()    
Scores=[]

# Choix du score du match
sc1,sc2=17,39
S=[max(sc1,sc2),min(sc1,sc2)]
########

NomsMarque=[["Essai transformé","Essais transformés"],["Essai non transformé",\
            "Essais non transformés"],["Drop/Pénalité","Drops/Pénalités"]]

# Constitution de la Base de Données Scores via 3 boucles imbriquées
for m in xrange(0,18):
    for n in xrange(0,25):
        for p in xrange (0,41):
            tot=m*7+n*5+p*3
            if tot <= 120:
                # ajout du score
                Scores.append((tot,m,n,p))

# Tri ascendant de la liste sur le 1er élément des quadruplets
Scores=sorted(Scores,key=itemgetter(0))

no=-1
for sc in S:
    no+=1
    print "*** Répartition(s) possible(s)des","%3i" % sc,"points du","gagnantperdant"[7*no:7*(no+1)],"***"
    # Consultation de la Base de Données Scores
    for u in Scores:
        cpt=-1
        if u[0] == sc:
            a,b,c,d=u
            for i in [b,c,d]:
                cpt+=1
                if i>0:
                    print "  - ", "%2i" % i+" "+NomsMarque[cpt][i>1]
            print
        elif u[0]>sc:
            break

Résultat :

                           ***********************
                           *                     *
                           *   Scores de Rugby   *
                           *   - Répartition -   *
                           *                     *
                           ***********************


*** Répartition(s) possible(s)des  39 points du gagnant ***
  -  13 Drops/Pénalités

  -   3 Essais non transformés
  -   8 Drops/Pénalités

  -   6 Essais non transformés
  -   3 Drops/Pénalités

  -   1 Essai transformé
  -   1 Essai non transformé
  -   9 Drops/Pénalités

  -   1 Essai transformé
  -   4 Essais non transformés
  -   4 Drops/Pénalités

  -   2 Essais transformés
  -   2 Essais non transformés
  -   5 Drops/Pénalités

  -   2 Essais transformés
  -   5 Essais non transformés

  -   3 Essais transformés
  -   6 Drops/Pénalités

  -   3 Essais transformés
  -   3 Essais non transformés
  -   1 Drop/Pénalité

  -   4 Essais transformés
  -   1 Essai non transformé
  -   2 Drops/Pénalités

*** Répartition(s) possible(s)des  17 points du perdant ***
  -   1 Essai non transformé
  -   4 Drops/Pénalités

  -   1 Essai transformé
  -   2 Essais non transformés

  -   2 Essais transformés
  -   1 Drop/Pénalité

Attention pour Python v. 3.x
* print est devenu une fonction et prend des parenthèses : print --> print ()
* xrange a fusionné avec range : xrange --> range.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#5 28-10-2011 19:27:16

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Re,

Je me suis avisé de ce que je pouvais utiliser un compteur intégré tout en parcourant les éléments d'une liste grâce à la fonction enumerate().
Nouveau code, un peu plus succinct :

#!/usr/bin/env python
# -*- coding: CP1252 -*-

from operator import itemgetter

def titre():
    esp =' '*28
    etoiles = "*"*23
    print esp + etoiles
    print esp+"*"+' '*21+"*"
    print esp + "*   Scores de Rugby   *"
    print esp + "*   - Répartition -   *"
    print esp+"*"+' '*21+"*"
    print esp + etoiles
    print
    print

titre()    
Scores=[]

# Choix du score du match
sc1,sc2=17,83
S=[max(sc1,sc2),min(sc1,sc2)]
########

NomsMarque=[["Essai transformé","Essais transformés"],["Essai non transformé",\
            "Essais non transformés"],["Drop/Pénalité","Drops/Pénalités"]]

# Constitution de la Base de Données Scores via 3 boucles imbriquées
for m in xrange(0,18):
    for n in xrange(0,25):
        for p in xrange (0,41):
            tot=m*7+n*5+p*3
            if tot <= 120:
                # ajout du score
                Scores.append((tot,m,n,p))

# Tri ascendant de la liste sur le 1er élément des quadruplets
Scores=sorted(Scores,key=itemgetter(0))

# Recherche des 2 scores dans la BDD et leur composition.
for no,sc in enumerate(S):
    print "*** Répartition(s) possible(s)des","%3i" % sc,"points du","gagnantperdant"[7*no:7*(no+1)],"***"
    for u in Scores:
        if u[0] == sc:
            a,b,c,d=u
            for e,i in enumerate([b,c,d]):
                if i>0:
                    print "  - ", "%2i" % i+" "+NomsMarque[e][i>1]
            print
        elif u[0]>sc:
            break

Je veux encore :
* ajouter une interface de choix de scores (plusieurs, sans relance du script)
* ajouter une recherche dichotomique,
* pouvoir procéder sans BDD (ça, ce n'est pas gagné)

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#6 28-10-2011 21:13:51

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Bonsoir,

Ouch! :-)

Va falloir que j'épluche tout cela...et

« Je suis ».

Sur base du pondu déjà,
Voici:

# usr/bin/env python
#-*- coding: cp1252 -*-


score,scoreprov,ok1,ok2,l,lprov,n,score1,score2=[0],[0],[],[],1,1,0,39.,17.
print score1,score2
while n<15:
    for i in xrange(3,8,2):
        for j in xrange(0,l,1):
            score.append(score[j]+i)
            if score[j]+i==score1:
                ok1.append(n+1)
            if score[j]+i==score2:
                ok2.append(n+1)
    score=list(set(score))
    for k in xrange(0,lprov,1):
        score.remove(scoreprov[k])
    scoreprov=score
    l,lprov=len(score),len(scoreprov)
    n+=1
    ok1,ok2=list(set(ok1)),list(set(ok2))
    lok1,lok2=len(ok1),len(ok2)
print 'pour ',score1,'points','il faut',ok1,'tentatives'
print 'pour ',score2,'points','il faut',ok2,'tentatives'

for w in xrange(0,lok1,1):
    trois,cinq,sept=0.,0.,0.
    trois=(ok1[w]*7-score1)/4
    if (trois*4)%4<>0:
        cinq=1.
    sept=ok1[w]-trois
    print ''
    print 'pour un score de',int(score1)
    print 'et pour',ok1[w],' tentative(s) réussie(s) '
    print ''
    print 'ou'
    print int(trois),'drop(s) ou pénalité(s)'
    print int(cinq),'essai(s)'
    print int(sept),'essai(s) transformé(s)'
    print''
    m=min(int(trois),int(sept))
    for z in xrange(0,m,1):
        trois-=1
        cinq+=2
        sept-=1
        print ''
        print 'ou'
        print int(trois),'drop(s) ou pénalité(s)'
        print int(cinq),'essai(s)'
        print int(sept),'essai(s) transformé(s)'
        print''
for q in xrange(0,lok2,1):
    trois,cinq,sept=0.,0.,0.
    trois=(ok2[q]*7-score2)/4
    if (trois*4)%4<>0:
        cinq=1.
    sept=ok2[q]-trois
    print''
    print 'pour un score de',int(score2)
    print 'et pour',ok2[q],' tentative(s) réussie(s) '
    print ''
    print 'ou'
    print int(trois),'drop(s) ou pénalité(s)'
    print int(cinq),'essai(s)'
    print int(sept),'essai(s) transformé(s)'
    print''
    m=min(int(trois),int(sept))
    for h in xrange(0,m,1):
        trois-=1
        cinq+=2
        sept-=1
        print ''
        print 'ou'
        print int(trois),'drop(s) ou pénalité(s)'
        print int(cinq),'essai(s)'
        print int(sept),'essai(s) transformé(s)'
        print''

beaucoup de 'print' mais algorithme assez simple.

et cela donne:

>>>
39.0 17.0
pour  39.0 points il faut [9, 11, 13, 7] tentatives
pour  17.0 points il faut [3, 5] tentatives

pour un score de 39
et pour 9  tentative(s) réussie(s)

ou
6 drop(s) ou pénalité(s)
0 essai(s)
3 essai(s) transformé(s)


ou
5 drop(s) ou pénalité(s)
2 essai(s)
2 essai(s) transformé(s)


ou
4 drop(s) ou pénalité(s)
4 essai(s)
1 essai(s) transformé(s)


ou
3 drop(s) ou pénalité(s)
6 essai(s)
0 essai(s) transformé(s)


pour un score de 39
et pour 11  tentative(s) réussie(s)

ou
9 drop(s) ou pénalité(s)
1 essai(s)
1 essai(s) transformé(s)


ou
8 drop(s) ou pénalité(s)
3 essai(s)
0 essai(s) transformé(s)


pour un score de 39
et pour 13  tentative(s) réussie(s)

ou
13 drop(s) ou pénalité(s)
0 essai(s)
0 essai(s) transformé(s)


pour un score de 39
et pour 7  tentative(s) réussie(s)

ou
2 drop(s) ou pénalité(s)
1 essai(s)
4 essai(s) transformé(s)


ou
1 drop(s) ou pénalité(s)
3 essai(s)
3 essai(s) transformé(s)


ou
0 drop(s) ou pénalité(s)
5 essai(s)
2 essai(s) transformé(s)


pour un score de 17
et pour 3  tentative(s) réussie(s)

ou
1 drop(s) ou pénalité(s)
0 essai(s)
2 essai(s) transformé(s)


ou
0 drop(s) ou pénalité(s)
2 essai(s)
1 essai(s) transformé(s)


pour un score de 17
et pour 5  tentative(s) réussie(s)

ou
4 drop(s) ou pénalité(s)
1 essai(s)
0 essai(s) transformé(s)

>>>

bel exercice en tous cas.
Meilleure mise en forme est souhaitable mais faut le temps.

A+-*/

PS:     l'algorithme commence comme cecii:
    int((nombre de tentative(s)*7-score)/4)= nombre de drop(s) (trois)
    int(nbre de tentative(s)-nombre de drop(s))= nombre de sept
    et...


Qui trouve, cherche.

Hors ligne

#7 29-10-2011 15:02:12

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Re,

Allez, encore un peu de grain à moudre.
J'ai ajouté une interface de choix du résultat (avec traitement d'erreurs).
Je me suis passé de la recherche dichotomique et de la recherche séquentielle initiale.
L'idée m'est venue, hier soir en repensant aux différents algorithmes de tri que j'avais implémentés et notamment au "tri par casiers".
Les scores 1, 2 et 4 n'existent pas, mais ils figurent quand même par commodité :
- chaque quadruplet enregistré comprend le score et la répartition du nombre de "faits de jeux",
- je crée 121 casiers de 0 à 120 contenant le nombre 0,
- à chaque enregistrement d' un quadruplet, j'incrémente de 1 le contenu du n° de "casier" correspondant :
   * La BDD, une fois bâtie, la liste de casiers NbRes comprendra le nombre de répartitions différentes de chaque score,
   * La somme des nombres des casiers du début jusqu'au score considéré donnera l'index du 1er score dans la BDD
   * l'indice de fin de recherche s'obtient en ajoutant le nombre de répartition du score considéré.

Exemple soit un score de 27 points, la somme obtenue par sum(NbRes[:27]) vaut 61...

Si je cherche Scores[61], j'obtiens le quadruplet (27, 0, 0, 9), 1ere répartition de ma BDD pour obtenir 27 points...
La 1ere ? Oui, vérification : Scores[26] donne le quadruplet (26, 3, 1, 0)...

NbRes[27] contient 6. Il y a 6 combinaisons linéaires de 7, 5 et 3 donnant 27 points...
Je vais donc utiliser une boucle pour scruter la BDD de l'indice de départ 61 à l'indice de fin 67 (la boucle s'arrête à 66).
Vérification :
Scores[66] --> (27, 3, 0, 2)
Scores[67] --> (28, 0, 2, 6)

Emploi de enumerate().
Il parcourt une liste d'éléments, tout en étant capable de donner simultanément chaque indice.
Exemple.

>>> L=[3,6,4,1,2,9]
>>> for indice,element in enumerate(L):
        print indice,element

Résultat :

0 3
1 6
2 4
3 1
4 2
5 9

Tris
- Natifs :
   Via la fonction sorted() ou la méthode de  liste sort().
   Différences d'emplois :
   >>> L=sorted(L)
   >>> L
   [1, 2, 3, 4, 6, 9]
   >>>
   Mais :
   >>> L=[3,6,4,1,2,9]
   >>> L.sort()
   >>> L
   [1, 2, 3, 4, 6, 9]
   >>>
- Tris de tuples.
  J'explicite le moyen employé (il y en a d'autres)
  Via le module operator, j'importe itemgetter (("attrapeur d'items")
  Je veux trier mes quadruplets sur le score : 1er item, donc itemgetter(0).
  Par ordre croissant : c'est l'option par défaut.
  D'où Scores=sorted(Scores,itemgetter(0))
  Pour obtenir l'ordre décroissant, je devrais écrire :
  Scores=sorted(Scores,key=itemgetter(0),reverse=True)
  ou
  Scores.sort(key=itemgetter(0),reverse=True)
  Exemple :
  >>> L=[(3,0),(2,5),(5,2),(4,4),(1,7)]
  >>> L=sorted(L,key=itemgetter(0),reverse=True)
  >>> L
  [(5, 2), (4, 4), (3, 0), (2, 5), (1, 7)]
  ou
  >>> L=[(3,0),(2,5),(5,2),(4,4),(1,7)]
  >>> L.sort(key=itemgetter(0),reverse=True)
  >>> L
  [(5, 2), (4, 4), (3, 0), (2, 5), (1, 7)]

Mon code :


#!/usr/bin/env python
# -*- coding: CP1252 -*-

from operator import itemgetter

def titre():
    esp =' '*28
    etoiles = "*"*23
    print esp + etoiles
    print esp+"*"+' '*21+"*"
    print esp + "*   Scores de Rugby   *"
    print esp + "*   - Répartition -   *"
    print esp+"*"+' '*21+"*"
    print esp + etoiles
    print
    print

titre()    
Scores=[]
NbRes=[0]*121

NomsMarque=[["Essai transformé","Essais transformés"],["Essai non transformé",\
            "Essais non transformés"],["Drop/Pénalité","Drops/Pénalités"]]
# 3 boucles imbriquées
for m in xrange(0,18):
    m7=m*7
    for n in xrange(0,25):
        n5=n*5
        for p in xrange (0,41):
            tot=m7+n5+p*3
            if tot <= 120:
                # ajout du score
                Scores.append((tot,m,n,p))
                NbRes[tot]+=1

# Tri ascendant de la liste sur le 1er élément des quadruplets
Scores=sorted(Scores,key=itemgetter(0))

while 1:
    ok=0
    while not ok:
        print "        Entrer un score sous la forme 25 - 39 (par ex)"
        print "Ordre, 25 - 39 ou 39 - 25 indifférent, tiret impératif, maximum 120."
        print
        r=raw_input("              Votre choix : " )
        if r.find("-")==-1:
            print
            print "Veuillez recommencez, il manque le tiret. Merci."
            print
        else:
            print
            st1,st2=r[:r.find("-")],r[r.find("-")+1:]
            try:
                sc1,sc2=int(st1),int(st2)
                if sc1 not in range(0,121) or sc2 not in range(0,121):
                    print
                    print "Veuillez recommencez, entrées attendues entre 0 et 120. Merci."
                    print
                    print
                else:
                    ok=1
            except ValueError:
                print
                print "Vous n'avez pas entré de nombres. Recommencez, s'il vous plaît."
                print
                print
    S=[max(sc1,sc2),min(sc1,sc2)]
    print
    titre()
    for no,sc in enumerate(S):
        print "*** Répartition(s) possible(s)des","%3i" % sc,\
              "points du","gagnantperdant"[7*no:7*(no+1)],"***"
        deb=sum(NbRes[0:sc])
        fin=deb+NbRes[sc]
        for k in xrange(deb,fin):
            a,b,c,d=Scores[k]
            for e,i in enumerate([b,c,d]):
                if i>0:
                    print "  - ", "%2i" % i+" "+NomsMarque[e][i>1]
            print
    print
    while 1:
        print
        rep=(raw_input("  Un autre choix (réponse avec O ou N)? ")).upper()
        if rep not in "ON":
            print
            print
            print "Erreur. Réponse attendue : O ou N"
            print
        else:
            break
    if rep=="N":
        print "      Au revoir !"
        break

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#8 29-10-2011 16:17:03

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Bonjour,

@ Yoshi,
Hier, j'ai un peu regardé ton programme. L'explication d'aujourd'hui conforte ce que j'avais compris; bien que quelques lignes me reste encore obscure. Mais j'analyse encore (print par ci, par là).
L'interface de choix du résultat au départ n'attend que notre action pour instantanément nous donner les possibilités de scores.


La différence entre nos deux approches réside, à mon avis, sur le recours (ou pas) au piochage dans une Base De Données

Cette approche via la BDD permet-elle  de discerner pour chaque combinaisons  combien de tentatives réussies  ont été nécessaires pour  arriver au score choisi?

L'approche du problème que j'ai mise en œuvre se base sur un développement chronologique des scores possibles; la distinction des combinaisons se calcule à partir du nombre de tentatives réussies.


Deux styles (voire trois) pour cerner un problème... d'où l'intérêt de ces échanges.

Merci.

A+-*/


PS: J'hésite à joindre au programme les commentaires explicatifs des grandes étapes;  cela n’alourdirait-t-il pas la lisibilité des commandes?


Qui trouve, cherche.

Hors ligne

#9 29-10-2011 17:51:33

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Re,

Cette approche via la BDD permet-elle  de discerner pour chaque combinaisons  combien de tentatives réussies  ont été nécessaires pour  arriver au score choisi?

Je ne peux pas répondre parce que depuis le début, je ne pige pas ce que tu entends par "tentatives réussies"...
Pourquoi ? Tu tiens compte des tentatives ratées dans ton prog ?
Je ne peux te répondre que sur un exemple :

*** Répartition(s)  possible(s)des  27 points du perdant ***
  -   9 Drops/Pénalités

  -   3 Essais non transformés
  -   4 Drops/Pénalités

  -   1 Essai transformé
  -   1 Essai non transformé
  -   5 Drops/Pénalités

  -   1 Essai transformé
  -   4 Essais non transformés

  -   2 Essais transformés
  -   2 Essais non transformés
  -   1 Drop/Pénalité

  -   3 Essais transformés
  -   2 Drops/Pénalités

Ainsi que tu peux le voir, je dénombre 6 moyens différents seulement pour obtenir 27 points.
Tu peux contrôler ces 6 possibilités et constater que j'arrive à 27 (exemple):
  -   2 Essais transformés        -->   7 * 2 = 14
  -   2 Essais non transformés -->   5 * 2 = 10
  -   1 Drop/Pénalité                    -->    3 * 1 =  3
Et 14 + 10 + 3 = 27 ...
Je peux dire qu'il y a 2 coups de pieds ratés puisque 2 essais non transformés ==> 2 transformations ratées.

C'est cela que tu veux dire ?

Je suis assez content de enumerate() : je connais de nom depuis longtemps, mais je n'y avais jamais prêté attention jusqu'à... hier !
Je suis assez content aussi d'avoir pu trouver l'accès direct à tous les mêmes scores de ma BDD via mes 121 casiers...

key=itemgetter(nb) je l'ai déjà utilisé pour les progr d'analyse statistique des messages codés et du dénombrement et passage aux fréquences d'apparition des lettres en français, progr écrits à l'intention du sieur nerosson...

La BDD, c'est un pis-aller : elle contient quand même 3325 quadruplets, même si ça fonctionne assez vite.
J'ai repris une vieille (pour moi) astuce : planquer les "calculs" après les adressages écrans (qui eux prennent du temps).

Commentaires
Moi, je n'ai pas hésité, alors pourquoi toi ?
Les # c'est bien, mais pas suffisant quand le programme est complexe...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 29-10-2011 22:04:16

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

'soir

Une tentative n'est pas toujours couronnée de succès. (c'est bien le sens du terme)
De là à supputer que les tentatives ratées soient l'objet du sujet... bof! :-)
Une tentative peut se solder par 3, 5 ou 7 points en plus   ou pas.
Une tentative réussie est une tentative qui s'est soldée d'un gain de points (tout simplement).

En partant de ton exemple, voici le résultat que j'obtiens:

pour un score de 27
et pour 9  tentative(s) réussie(s)

ou
9 drop(s) ou pénalité(s)
0 essai(s)
0 essai(s) transformé(s)


pour un score de 27
et pour 5  tentative(s) réussie(s)

ou
2 drop(s) ou pénalité(s)
0 essai(s)
3 essai(s) transformé(s)


ou
1 drop(s) ou pénalité(s)
2 essai(s)
2 essai(s) transformé(s)


ou
0 drop(s) ou pénalité(s)
4 essai(s)
1 essai(s) transformé(s)


pour un score de 27
et pour 7  tentative(s) réussie(s)

ou
5 drop(s) ou pénalité(s)
1 essai(s)
1 essai(s) transformé(s)


ou
4 drop(s) ou pénalité(s)
3 essai(s)
0 essai(s) transformé(s)

 

Tous points acquis ne sont pas obtenus après autant de tentatives (réussies) il me semble...
L'ensemble des résultats obtenus est semblable mais le nombre de tentatives (réussies) pour arriver à ce score est mentionné !   :-)

A+-*/

PS: Commentaires suivront.


Qui trouve, cherche.

Hors ligne

#11 29-10-2011 22:26:19

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Re,

Alors, je prolonge ton raisonnement...
Supposons qu'une équipe marque 3 drops/pénalités.
Comment peux-tu savoir si son taux réussite est de
* 3/3  100%  ?
* 3/4  75%  ?
.............................
* 3/10  30% ?

Quelle que soit l'option choisie, elle a 9 points...
D'autre part, j'ai choisi volontairement de ne pas faire apparaître les 0 même s'ils sont bien présents dans les quadruplets et ce, pour alléger l'écriture des résultats déjà bien assez longue comme ça...

M'enfin, là on rentre dans le coupage de cheveux en 16...

Allez,

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#12 30-10-2011 08:28:01

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Salut,

La nuit m'ayant donné à réfléchir,
1. A propos des "tentatives que tu répertories

Comment peux-tu savoir si son taux réussite est de
* 3/3  100%  ?
* 3/4  75%  ?
.............................
* 3/10  30% ?

  Je me dis que c'est peut-être ça que tu entends par "tentatives"...

2. Je me suis avisé, indirectement grâce à tes critiques, que ma présentation des résultats possibles devait être revue et améliorée...
    J'ai fait un choix, reste à le traduire via programmation...
    Je m'y colle sous peu...

3. Base de Données.
    Je suis sur une piste pour obtenir, à partir d'un score, toutes ses décompositions.
    Mais ça va me demander du temps.

@+

[EDIT
Vala le code avec nouvelle présentation des résultats :

#!/usr/bin/env python
# -*- coding: CP1252 -*-

from operator import itemgetter

def titre():
    esp =' '*28
    etoiles = "*"*23
    print esp + etoiles
    print esp+"*"+' '*21+"*"
    print esp + "*   Scores de Rugby   *"
    print esp + "*   - Répartition -   *"
    print esp+"*"+' '*21+"*"
    print esp + etoiles
    print
    print

titre()    
Scores=[]
NbRes=[0]*121

NomsMarque=["Drop/Pénalité","Drops/Pénalités"]
# 3 boucles imbriquées
for m in xrange(0,18):
    m7=m*7
    for n in xrange(0,25):
        n5=n*5
        for p in xrange (0,41):
            tot=m7+n5+p*3
            if tot <= 120:
                # ajout du score
                Scores.append((tot,m,n,p))
                NbRes[tot]+=1

# Tri ascendant de la liste sur le 1er élément des quadruplets
Scores=sorted(Scores,key=itemgetter(0))

while 1:
    ok=0
    while not ok:
        print "        Entrer un score sous la forme 25 - 39 (par ex)"
        print "Ordre, 25 - 39 ou 39 - 25 indifférent, tiret impératif, maximum 120."
        print
        r=raw_input("              Votre choix : " )
        if r.find("-")==-1:
            print
            print "Veuillez recommencez, il manque le tiret. Merci."
            print
        else:
            print
            st1,st2=r[:r.find("-")],r[r.find("-")+1:]
            try:
                sc1,sc2=int(st1),int(st2)
                if sc1 not in range(0,121) or sc2 not in range(0,121):
                    print
                    print "Veuillez recommencez, entrées attendues entre 0 et 120. Merci."
                    print
                    print
                else:
                    ok=1
            except ValueError:
                print
                print "Vous n'avez pas entré de nombres. Recommencez, s'il vous plaît."
                print
                print
    S=[max(sc1,sc2),min(sc1,sc2)]
    print
    titre()
    for no,sc in enumerate(S):
        print "*** Répartition(s) possible(s)des","%3i" % sc,\
              "points du","gagnantperdant"[7*no:7*(no+1)],"***"
        deb=sum(NbRes[0:sc])
        fin=deb+NbRes[sc]
        for k in xrange(deb,fin):
            a,b,c,d=Scores[k]
            ess=b+c
            if ess > 0:
                print " -",ess,"essais"[:5+(ess>1)],
                if b*c != 0:
                    print "dont",b,"transformés"[:10+(b>1)]
                elif c==0:
                    print "transformé"+"s"*(b>1)
                else:
                    print "non transformé"+"s"*(c>1)
            if d > 0:
                print " -",d,NomsMarque[d>1]
            print
    while 1:
        print
        rep=(raw_input("         Un autre choix (réponse avec O ou N)? "))\
             .upper()
        if rep not in "ON":
            print
            print
            print "Erreur. Réponse attendue : O ou N"
            print
        else:
            break
    if rep=="N":
        print "                             Au revoir !"
        break

Et le résultat :

                             ***********************
                            *                     *
                            *   Scores de Rugby   *
                            *   - Répartition -   *
                            *                     *
                            ***********************


*** Répartition(s) possible(s)des  39 points du gagnant ***
 - 13 Drops/Pénalités

 - 3 essais non transformés
 - 8 Drops/Pénalités

 - 6 essais non transformés
 - 3 Drops/Pénalités

 - 2 essais dont 1 transformé
 - 9 Drops/Pénalités

 - 5 essais dont 1 transformé
 - 4 Drops/Pénalités

 - 4 essais dont 2 transformés
 - 5 Drops/Pénalités

 - 7 essais dont 2 transformés

 - 3 essais transformés
 - 6 Drops/Pénalités

 - 6 essais dont 3 transformés
 - 1 Drop/Pénalité

 - 5 essais dont 4 transformés
 - 2 Drops/Pénalités


*** Répartition(s) possible(s)des  25 points du perdant ***
 - 2 essais non transformés
 - 5 Drops/Pénalités

 - 5 essais non transformés

 - 1 essai transformé
 - 6 Drops/Pénalités

 - 4 essais dont 1 transformé
 - 1 Drop/Pénalité

 - 3 essais dont 2 transformés
 - 2 Drops/Pénalités


                      Un autre choix (réponse avec O ou N)? n
                                           Au revoir !

Dernière modification par yoshi (30-10-2011 09:53:50)


Arx Tarpeia Capitoli proxima...

Hors ligne

#13 30-10-2011 13:00:48

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Bonjour,

Ma démarche est de construire « tous les résultats possibles triés par tentatives »(post#1).

« Une tentative réussie est une tentative qui s'est soldée d'un gain de  3, 5 ou 7 points en plus (tout simplement) » (post#10). 

Le programme calcule quel sont les gains possibles après une première tentative réussie (TR), une deuxième TR, une troisième, etc.

Pour la première TR:

Un drop            =>    3 pts
Un essai            =>    5 pts
Un essai transformé    =>    7 pts

Pour la deuxième TR

Un drop            =>    3 pts(TR1) + 3 pts    = 6 pts
                =>    5 pts(TR1) + 3 pts    = 8 pts
                =>    7 pts(TR1) + 3 pts    = 10 pts

Un essai            =>    3 pts(TR1) + 5 pts    = 8 pts
                =>    5 pts(TR1) + 5 pts    = 10 pts
                =>    7 pts(TR1) + 5 pts    = 12 pts

Un essai transformé    =>    3 pts(TR1) + 7 pts    = 10 pts
                =>    5 pts(TR1) + 7 pts    = 12 pts
                =>    7 pts(TR1) + 7 pts    = 14 pts

et ensuite: (cf post #2)

3 ° tentative réussie =>scores possibles:
[9, 11, 13, 15, 17, 19, 21]
4 ° tentative réussie =>scores possibles:
[12, 14, 16, 18, 20, 22, 24, 26, 28]
Etc.
« L'approche du problème que j'ai mise en œuvre se base sur un développement chronologique des scores possibles; la distinction des combinaisons se calcule à partir du nombre de tentatives réussies. » (post#8)

Pour un score choisi je tire après combien de TR il est apparu: =n1,n2,n3

A partir des n connu, je calcule les répartitions possibles des différents  gains (3 pts, 5 pts, 7 pts).

Pour un score de  39  points il faut [9 ou 11 ou13 ou 7] Tentatives Réussies.
Pour 9 TR:
Je commence par supposer que les 9 TR étaient des essais transformés:

9 TR *7 pts = 63 pts

*    *    *    *    *    *    *    *    *
7    7    7    7    7    7    7    7    7

Or le score est de 39 pts => 63 pts – 39 pts = 24 pts.
Le plus grand écart entre deux gains pour une TR est de 4 pts.


24 pts / 4 pts = 6 places où on peut remplacer 7 par (7 – 4 =) 3

rem. : [Si la (différence entre le nbre de TR et le score choisi) divisé par 4 n'est pas entier => on remplace un des trois par un cinq.]

=> 6 * 3 + 3 * 7 = 39 pts .

Première possibilité:

*    *    *    *    *    *    *    *    *
3    3    3    3    3    3    7    7    7

Je remarque qu'on peut convertir un 7 par un 5 à condition d'augmenter un des 3 de 2/

Deuxième possibilité:
*    *    *    *    *    *    *    *    *
3    3    3    3    3    5    5    7    7

Tant qu'il existe un 3 ou un 7 on peut répéter l'opération.

Troisième possibilité:
*    *    *    *    *    *    *    *    *
3    3    3    3    5    5    5    5    7


Quatrième possibilité:
*    *    *    *    *    *    *    *    *
3    3    3    5    5    5    5    5    5

Donc
pour un score de 39 et pour 9  tentative(s) réussie(s) il y a quatre répartitions possibles de drop(s), essai(s) ou essai(s) transformé(s)

Restent: 11 TR, 13 TR et  7 TR

Voilà, tout cela en commandes.

A+-*/


Qui trouve, cherche.

Hors ligne

#14 02-11-2011 20:50:16

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

Re : (Python) Exercice sur "France 4 - 2 Nouvelle Zélande"

Bonsoir à tous.

Un petit contretemps ne m'a pas permis de retravailler mon code aussi vite que je l'aurais souhaité.
M'enfin, c'est fait maintenant, je me passe d'une Base de Données.
Supposons un score de 63 points...
Quelles sont toutes les combinaisons possibles de 7, 5 et 3 points permettant d'obtenir 63 ?
1. Je calcule le nombre maximum d'essais non transformés possibles et j'ajoute 1 pour l'indice de fin de boucle :
     fin5=score//5 + 1
2. Je lance une boucle passant en revue chaque nombre d'essais de 0 à fin5-1 (inclus)
    J'extrais à chaque fois le nombre de points encore nécessaire.
3. Je teste si le "reste" est 0.
    Si oui, j'affiche le nombre d'essais non transformés.
    Si non, je teste si ce reste est un multiple de 3.
        Si oui, j'affiche nombre d'essais et drop(s)/pénalités(s),
            puis je cherche le nombre de transformations possibles (max : nb d'essais) en enlevant 2 au reste jusqu'à avoir un reste
            multiple de 3
        Si non, je cherche le nombre de transformations possibles (max : nb d'essais) en enlevant 2 au reste jusqu'à avoir un reste
            multiple de 3 et j'obtiens le nombre de drops.
Le nombre d'essais est invariable et croissant.
Pour 63 pts
0 essai ---> 21 drops/pénalités
1 essai ---> reste = 63 - 5 *1 = 58 non multiple de 3. 1 transformation passe le reste à 56 qui n'est pas multiple de 3. On passe..
2 essais --> reste = 63 - 5 * 2 = 53 non multiple de 3                   
                   1 transformation passe le reste à 51 qui est multiple de 3 --> 17 drop(s)/pénalités(s).
                   2 transformations passent le reste à 52 qui n'est pas multiple de 3. On passe...
..........................
6 essais --> reste = 63 - 5 *6 = 33 qui est multiple de 3 --> on ajoute 11 drop(s)/pénalités(s)
                    1 transformation passe le reste à 31 qui n'est pas multiple de 3 . On passe.
                    2 transformations passent le reste à 29 qui n'est pas multiple de 3. On passe...
                   3 transformations passent le reste à 27 qui est  multiple de 3 --> 9 drops/pénalités
                    ................................................................................................       
                   6 transformations passent le reste à 21 qui est  multiple de 3 --> 7 drops/pénalités
                   Inutile de tester l'existence d'autres transformations : le maximum est atteint (6).

Reste à améliorer encore légèrement et à supprimer la boucle de recherche des transformations grâce à l'équivalence :
* 3 transfos <--> 2 drops de moins si reste multiple de 3 (1)
* 1 transfo <-->  1 drop de moins si reste = multiple de 3, +2...
ou calcul direct du premier nombre possible de drops en enlevant 4 au reste (2 transfos) pour revenir au point (1)

J'ai finalisé cela, il y a peu, donc, ce ne sera pas pour ce soir...
 

#!/usr/bin/env python
# -*- coding: CP1252 -*-

from operator import itemgetter

def titre():
    esp =' '*28
    etoiles = "*"*23
    print esp + etoiles
    print esp+"*"+' '*21+"*"
    print esp + "*   Scores de Rugby   *"
    print esp + "*   - Répartition -   *"
    print esp+"*"+' '*21+"*"
    print esp + etoiles
    print
    print

def affichage(essais,trsf,drpn):
    if essais > 0:
        phrase=" - "+str(essais) +" essais"[:6+(essais>1)]
        if trsf != 0:
            if trsf != essais:
                phrase+=" dont "+str(trsf)
            phrase+= " transformé"+"s"*(trsf>1)
        print phrase
    if drpn > 0:
        print " -",drpn,["Drop/Pénalité","Drops/Pénalités"][drpn>1]
        print

def cherche_transfo(ii,r,tr):  
    for j in xrange(1,ii+1):
        r-=2
        tr+=1
        if r%3==0 and r >=0:
            affichage(ii,tr,r//3)
            if r//3==0:
                print

titre()    
Scores=[]
NomsMarque=["Drop/Pénalité","Drops/Pénalités"]

while 1:
    ok=0
    while not ok:
        print "        Entrer un score sous la forme 25 - 39 (par ex)"
        print "Ordre, 25 - 39 ou 39 - 25 indifférent, tiret impératif, maximum 120."
        print
        r=raw_input("              Votre choix : " )
        if r.find("-")==-1:
            print
            print "Veuillez recommencez, il manque le tiret. Merci."
            print
        else:
            print
            st1,st2=r[:r.find("-")],r[r.find("-")+1:]
            try:
                sc1,sc2=int(st1),int(st2)
                if sc1 not in range(0,121) or sc2 not in range(0,121):
                    print
                    print "Veuillez recommencez, entrées attendues entre 0 et 120. Merci."
                    print
                    print
                else:
                    ok=1
            except ValueError:
                print
                print "Vous n'avez pas entré de nombres. Recommencez, s'il vous plaît."
                print
                print
    S=[max(sc1,sc2),min(sc1,sc2)]
    print
    titre()
    for no,sc in enumerate(S):
        print "*** Répartition(s) possible(s)des","%3i" % sc,\
              "points du","gagnantperdant"[7*no:7*(no+1)],"***"
        fin5=sc//5+1
        for i in xrange(fin5):
            reste,t=sc-i*5,0
            if reste==0:
                affichage(i,0,0)
                print
            else:              
                if reste%3==0:
                    affichage(i,0,reste//3)
                    cherche_transfo(i,reste,t)
                else:
                    cherche_transfo(i,reste,t)
        print                    

    while 1:
        rep=(raw_input("         Un autre choix (réponse avec O ou N)? "))\
             .upper()
        if rep not in "ON":
            print
            print
            print "Erreur. Réponse attendue : O ou N"
            print
        else:
            break
    if rep=="N":
        print "                             Au revoir !"
        break

Pour un résultat de 63-32, affichage :


                             ***********************
                            *                     *
                            *   Scores de Rugby   *
                            *   - Répartition -   *
                            *                     *
                            ***********************


*** Répartition(s) possible(s)des  63 points du gagnant ***
 - 21 Drops/Pénalités

 - 2 essais dont 1 transformé
 - 17 Drops/Pénalités

 - 3 essais
 - 16 Drops/Pénalités

 - 3 essais transformés
 - 14 Drops/Pénalités

 - 4 essais dont 2 transformés
 - 13 Drops/Pénalités

 - 5 essais dont 1 transformé
 - 12 Drops/Pénalités

 - 5 essais dont 4 transformés
 - 10 Drops/Pénalités

 - 6 essais
 - 11 Drops/Pénalités

 - 6 essais dont 3 transformés
 - 9 Drops/Pénalités

 - 6 essais transformés
 - 7 Drops/Pénalités

 - 7 essais dont 2 transformés
 - 8 Drops/Pénalités

 - 7 essais dont 5 transformés
 - 6 Drops/Pénalités

 - 8 essais dont 1 transformé
 - 7 Drops/Pénalités

 - 8 essais dont 4 transformés
 - 5 Drops/Pénalités

 - 8 essais dont 7 transformés
 - 3 Drops/Pénalités

 - 9 essais
 - 6 Drops/Pénalités

 - 9 essais dont 3 transformés
 - 4 Drops/Pénalités

 - 9 essais dont 6 transformés
 - 2 Drops/Pénalités

 - 9 essais transformés

 - 10 essais dont 2 transformés
 - 3 Drops/Pénalités

 - 10 essais dont 5 transformés
 - 1 Drop/Pénalité

 - 11 essais dont 1 transformé
 - 2 Drops/Pénalités

 - 11 essais dont 4 transformés

 - 12 essais
 - 1 Drop/Pénalité


*** Répartition(s) possible(s)des  32 points du perdant ***
 - 1 essai
 - 9 Drops/Pénalités

 - 2 essais transformés
 - 6 Drops/Pénalités

 - 3 essais dont 1 transformé
 - 5 Drops/Pénalités

 - 4 essais
 - 4 Drops/Pénalités

 - 4 essais dont 3 transformés
 - 2 Drops/Pénalités

 - 5 essais dont 2 transformés
 - 1 Drop/Pénalité

 - 6 essais dont 1 transformé


         Un autre choix (réponse avec O ou N)? n
                             Au revoir !

@+


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)?
quatre-vingt dix-neuf moins soixante 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