IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Probleme algorithmie et chaines de caracteres


Sujet :

Python

Vue hybride

loosemade Probleme algorithmie et... 27/01/2020, 14h12
wiztricks Salut, Est ce que les... 27/01/2020, 14h27
loosemade Il y a 52 cartes au total... 27/01/2020, 14h35
wiztricks Salut, Essayez de... 27/01/2020, 14h47
wiztricks Salut, Normalement,... 27/01/2020, 16h33
loosemade J'ai enfin réussi merci du... 27/01/2020, 16h59
wiztricks Tant mieux! Notez que le... 28/01/2020, 08h38
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Père
    Inscrit en
    Mai 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Père
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2019
    Messages : 3
    Par défaut Probleme algorithmie et chaines de caracteres
    Bonjour,
    Je suis en train d'apprendre le language python via le site france ioi
    Je suis bloqué a un exercice sur de l'alorithmie...

    Voici l'énoncé:

    Vous avez sûrement déjà joué, étant enfant, au jeu de cartes appelé la « bataille ». Les enfants algoréens aiment aussi beaucoup jouer à une variante bien plus simple de ce jeu, et vous devez faire l’arbitre des parties. Comme il y a beaucoup d’enfants souhaitant jouer en même temps et que vous ne pouvez pas tout surveiller, vous décidez d’écrire un programme informatique pour déterminer le vainqueur de chaque partie.

    Une partie se déroule ainsi :

    On part d’un jeu contenant 52 cartes, chaque carte étant une lettre entre A et M, et chaque lettre étant présente 4 fois (avec différentes couleurs, mais on ne s’en occupera pas ici).
    Les cartes, face cachée, sont mélangées et séparées en deux paquets (pas forcément de même taille !).
    Les deux joueurs retournent la première carte de leur paquet : si les deux cartes sont identiques ils continuent à jouer, sinon celui qui a la carte la plus forte, c’est-à-dire la plus petite selon l’ordre alphabétique, gagne la partie.
    Si un joueur n’a plus de carte, il perd ! Et oui, ce n’est pas très juste !
    Si les deux joueurs n’ont en même temps plus de cartes, alors il y a égalité complète.

    Étant donnés les deux paquets de cartes, à vous de déterminer le gagnant.
    Entrée

    L'entrée contient deux lignes, correspondant respectivement aux cartes du joueur 1 et du joueur 2, dans l'ordre. Un jeu de cartes est constitué uniquement de lettre majuscules entre A et M (sans espaces).
    Sortie

    Sur la première ligne, il faut indiquer « 1 », « 2 » ou « = » selon que le gagnant est le premier ou le second joueur, ou bien qu’il y a égalité complète.

    Sur la seconde ligne, il faut indiquer le nombre d’égalités qui ont eu lieu avant que le jeu ne se termine.
    Exemples
    Exemple 1

    entrée :

    AABBDCCDEEFFGGHHIIJJKKLLMM
    AABBCCDDEEFFGGHHIIJJKKLLMM

    sortie :

    2
    4

    Exemple 2

    entrée :

    AA
    AABBCCDDEEFFGGHHIIJJKKLLMMBBDCCDEEFFGGHHIIJJKKLLMM

    sortie :

    2
    2

    Commentaires

    L'exemple 1 se déroule comme suit :

    A contre A, égalité ;
    A contre A, égalité ;
    B contre B, égalité ;
    B contre B, égalité ;
    D contre C : le C l'emporte.

    C'est donc le joueur 2 qui remporte la partie, après 4 égalités.

    Dans l'exemple 2, après deux égalités, le joueur 1 n'a plus de carte et donc perd la partie.

    Mon code actuel est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    joueurUn=input()
    joueurDeux=input()
    egalite=0
    for x in range(52):
       if joueurUn[x]==joueurDeux[x]:
          egalite = egalite + 1
     
       elif joueurUn[x]>joueurDeux[x]:
          print("2")
          break
       elif joueurUn[x]<joueurDeux[x]:
          print("1")
          break
       elif joueurUn==joueurDeux:
          print("=")
          break
    print(egalite)
    Le resultat m'indique une erreur:
    Erreur d'exécution. Voici ce qui a été affiché :

    Traceback (most recent call last):
    line 5
    if joueurUn[x]==joueurDeux[x]:
    IndexError: string index out of range

    Je suis sur ce problèmes depuis plusieurs heures( 2 jours) et je n'arrive pas à le passer... Un petit peu d'aide ne serait pas de refus
    Merci d'avance
    Paul

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Citation Envoyé par loosemade Voir le message
    Je suis sur ce problèmes depuis plusieurs heures( 2 jours) et je n'arrive pas à le passer... Un petit peu d'aide ne serait pas de refus
    Est ce que les deux joueurs partent avec 52 cartes?
    Sinon, il va falloir comparer en fonction du plus petit nombre de cartes qu'à chaque joueur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Père
    Inscrit en
    Mai 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Père
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2019
    Messages : 3
    Par défaut
    Il y a 52 cartes au total mais les deux joueurs partent avec un nombre de cartes au hasard.

    a la base j’étais parti sur ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    joueurUn=input()
    joueurDeux=input()
    egalite=0
    carteMinimum=min(len(joueurUn),len(joueurDeux))
     
    for x in range(carteMinimum):
       if joueurUn[x]==joueurDeux[x]:
     
          if len(joueurUn)>len(joueurDeux):
             print("1")
             break
     
          elif len(joueurUn)<len(joueurDeux):
             print("2")
             break
          else:
             egalite= egalite + 1
     
     
       elif joueurUn==joueurDeux:
          print("=")
     
     
       elif joueurUn[x]>joueurDeux[x]:
          print("2")
          break
       elif joueurUn[x]<joueurDeux[x]:
          print("1")
          break
    print(egalite)
    pour savoir qui a la moins de carte des deux joueurs mais les résultats n’était pas bon non plus :

    Échec

    La réponse donnée par votre programme est incorrecte. Il a affiché :

    1
    0

    au lieu de :

    1
    13

    et je sais que ça vient du fais que je n'ai pas pris en compte que les deux joueurs n'ont pas le même nombre de cartes. mais je buche sur ça...

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Citation Envoyé par loosemade Voir le message
    mais je buche sur ça...
    Essayez de faire l'exercice par étapes sur une feuille de papier avant de coder (et un petit nombre de cartes!). Ce sont vos tests qui ne vont pas et vous donner la solution ne vous aidera pas à comprendre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Citation Envoyé par loosemade Voir le message
    je sais que ça vient du fais que je n'ai pas pris en compte que les deux joueurs n'ont pas le même nombre de cartes. mais je buche sur ça...
    Normalement, lorsque les deux chaines de caractères ont la même longueur, c'est bien plus "facile" car on s'évite plein de tests. Une idée de simplification pourrait être l'ajout de caractères à la plus petite chaîne.
    Si on fait çà "bourrin" on ajoute autant de caractères qu'il faut pour que les deux chaines soient de longueur égale... mais en réfléchissant un peu, un seul devrait suffire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Candidat au Club
    Homme Profil pro
    Père
    Inscrit en
    Mai 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Père
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2019
    Messages : 3
    Par défaut
    J'ai enfin réussi merci du conseil de couché ca sur papier
    Bonne journée

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Citation Envoyé par loosemade Voir le message
    J'ai enfin réussi merci du conseil de couché ca sur papier
    Tant mieux! Notez que le programmeur Python écrirait cela ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from itertools import zip_longest
     
    def jouer(j1, j2):
        for i, (a, b) in enumerate(zip_longest(j1, j2, fillvalue='n')):
            if a < b:
                return '1', i
            elif a > b:
                return '2', i
        return '=', i
     
     
    print(jouer('AABBDCCDEEFFGGHHIIJJKKLLMM', 'AABBCCDDEEFFGGHHIIJJKKLLMM'))       
    print(jouer('AA', 'AABBCCDDEEFFGGHHIIJJKKLLMMBBDCCDEEFFGGHHIIJJKKLLMM'))
    zip_longest étant la fonction qui lorsque j1 et j2 sont de taille différentes ajoutera fillvalue='n' à la plus petite chaine. 'n' ayant été choisi plus grand que 'm', histoire qu'on arrête les comparaisons (si on n'est pas sorti de la boucle avant).

    Et si on ne connaît pas zip_longuest, c'est juste un peu plus long d'ajouter 'n' à la chaine la plus courte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def jouer(j1, j2):
        d = len(j1) - len(j2)
        if d < 0:
            j1 = j1 + 'n'
        elif d > 0:
            j2 = j2 + 'n'
     
        for i in range(len(j1)):
            if j1[i] < j2[i]:
                return '1', i
            elif j1[i] > j2[i]:
                return '2', i
        return '=', i

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme avec les chaines de caracteres
    Par jesuscrie dans le forum C
    Réponses: 5
    Dernier message: 30/06/2006, 22h56
  2. probleme avec les chaines de caracteres
    Par snake77350 dans le forum C
    Réponses: 11
    Dernier message: 25/04/2006, 18h29
  3. Probleme avec une chaine de caractere
    Par Jim_Nastiq dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2006, 09h56
  4. probleme sur les chaines de caractere
    Par foufi5 dans le forum C
    Réponses: 8
    Dernier message: 22/12/2005, 15h30
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo