Partage
  • Partager sur Facebook
  • Partager sur Twitter

La bataille France IOI python

Erreur d'execution

Sujet résolu
    27 juillet 2019 à 18:41:44

    Bonjour,

    Je suis bloqué sur ce problème, j'ai essayé pas de solutions mais rien n'y fait, en voici l'énoncé :

    La bataille.

    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

    Et voici mon code :

    joueur1 = str(input())
    joueur2 = str(input())
    
    j1 = joueur1.upper()
    j2 = joueur2.upper()
    
    jeu = j1 + j2
    
    alpha = "ABCDEFGHIJKLMNOPQRSTUVWWXYZ"
    eg = 0
    egalite = [0] * 26
    x = 0
    if len(jeu) == 52:
    
        if len(j1) > len(j2):
            rg = len(j2)
            x = 1
            print("1")
        elif len(j1) < len(j2):
    
            rg = len(j1)
            x = 2
            print("2")
    
        elif j1 == j2:
            print("=")
    
        else:
            rg = 26
            x = 3
    
        for i in range(0, rg):
    
            if x == 3 and (j1[i] < j2[i] and j1[i] < alpha[13] and j2[i] < alpha[13]):
    
                print("1")
                break
    
            elif x==3 and (j1[i] > j2[i] and j1[i] < alpha[13] and j2[i] < alpha[13]):
    
                print("2")
                break
    
            elif j1[i] == j2[i] and j1[i] < alpha[13] and j2[i] < alpha[13]:
                eg += 1
                egalite[i] = eg
    
            else:
                break
    
        print(max(egalite))
    



    J'ai une erreur d’exécution avec une réussite à 71%:

    1
    0

    au lieu de :

    2
    0

    Une aide sera vraiment la bienvenue !




    • Partager sur Facebook
    • Partager sur Twitter
      27 juillet 2019 à 20:22:27

      La logique de ton code est assez compliquée alors que la question est simple. Des choses inutiles (mettre en majuscule, concaténer les chaînes, la disjonction de cas lignes 15, 19 et 25).

      La logique du code à écrire est un bon exemple de boucle while et pas une boucle for, cf. ta ligne 32, c'est non seulement inutile mais ça te masque la bonne méthode, donc reprend presque de 0.

      Le principe est simple : avec un indice i tu te mets en début de chacune des listes et tu compares les cartes une après l'autre  jusqu'à ce que tu sois en mesure de conclure, cad que 

      - les cartes n'ont pas même valeur (donc un des deux joueurs l'emporte) OU

      - un des deux jeux est épuisé.

      Tant qu'aucune de ces conditions n'st réalisée tu fais avancer i de 1 autrement dit, tu passes à la carte suivante. Tu vas donc avoir une boucle while avec une condition qui s'exprime avec des booléens. Une fois sorti de la boucle tu analyses et tu affiches en conséquence.

      -
      Edité par PascalOrtiz 27 juillet 2019 à 22:59:37

      • Partager sur Facebook
      • Partager sur Twitter
        29 juillet 2019 à 10:58:39

        Merci , pour ta réponse PascalOrtiz j'ai modifié mon code en insérant "while" comme tu me l'a dit, mais rien n'y fait, je reste toujours bloqué avec l'égalité.

        j1 = str(input())
        j2 = str(input())
        
        jeu = j1 + j2
        
        i = 0
        t = 0
        
        if len(jeu) == 52:
        
            if len(j1) < len(j2):
                n = len(j1)
            else:
                n = len(j2)
                
            while i < n:
               
                if j1[i] == j2[i]:
                    t += 1
                    i += 1
                 
                else:
                    break
        
            if j1 == j2:
                print("=")
                print(len(j1))
            elif t == n and len(j1) > n:
                print("1")
                print(t)
            elif t == n and len(j2) > n:
                print("2")
                print(t)
            elif j1[i] > j2[i]:
                print("2")
                print(t)
            else:
                print("1")
                print(t)
        

        Le resultat :

        2
        1
        


        La boucle ne continue pas malgré la progression de "i" !



        • Partager sur Facebook
        • Partager sur Twitter
          29 juillet 2019 à 11:40:20

          Ton résultat est inutilisable si tu ne donnes pas j1 et j2, rajoute les en EDIT. Sinon, ton code est nettement en progrès.

          EDIT : ton code passe les test de fioi

          -
          Edité par PascalOrtiz 29 juillet 2019 à 12:05:49

          • Partager sur Facebook
          • Partager sur Twitter
            29 juillet 2019 à 14:03:11

            J'ai résolu le problème, mais avec la boucle "for".

            Avec un tableau j'ai exploité les données "égalités" de cette boucle avec le chiffre "0" et fixé une limite :

            tab[i] == 0

            Que j'ai reporté ensuite dans la seconde partie de mon code.

            Merci.

            • Partager sur Facebook
            • Partager sur Twitter

            La bataille France IOI python

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown