Partage
  • Partager sur Facebook
  • Partager sur Twitter

France IOI problème La bataille

Sujet résolu
    27 janvier 2020 à 11:33:20

    Bonjour je suis actuellement bloqué sur ce problème.

    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 :

    1. A contre A, égalité ;
    2. A contre A, égalité ;
    3. B contre B, égalité ;
    4. B contre B, égalité ;
    5. 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:

    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) and len(joueurDeux)==0:
             print("1")
             break
             
          elif len(joueurUn)<len(joueurDeux) and len(joueurUn)==0:
             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)      

    Je suis à 11 test réussi sur 14

    et le résultat du premier crash est :

    Test 9 Échec

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

    13
    

    au lieu de :

    1
    13
    
     
           
         



    • Partager sur Facebook
    • Partager sur Twitter
    Coucou !
      27 janvier 2020 à 12:02:28

      Je ne vais pas te donner la solution, mais tu peux tester les configurations suivantes :

      entrée1 :

      A
      AA

      sortie1 :

      2
      1

      entrée2 :

      AA
      A

      sortie2 :

      1
      1

      entrée3 :

      A
      A

      sortie3 :

      =
      1








      -
      Edité par thelinekioubeur 27 janvier 2020 à 12:02:53

      • Partager sur Facebook
      • Partager sur Twitter
        27 janvier 2020 à 12:26:55

        Est-ce que mon probleme vient de la recherche de min(len(joueurUn),len(joueurDeux))?

        Je t'avoue que j'ai pas mal la tete dans le guidon et que j'ai du mal a voir le probleme.

        • Partager sur Facebook
        • Partager sur Twitter
        Coucou !
          27 janvier 2020 à 14:26:19

          Ça vient surtout du fait que tu n'as pas considéré le cas où les deux joueurs n'ont pas le même nombre de cartes.

          Voir la règle : "Si un joueur n’a plus de carte, il perd ! Et oui, ce n’est pas très juste !"

          • Partager sur Facebook
          • Partager sur Twitter
            27 janvier 2020 à 14:37:48

            De nombreuses confusions dans ton algorithme. De la ligne 7 à 17, tout est plus ou moins inutile. Ligne 20-21 : idem, la condition ne dépend pas de x.

            Par contre, il est pertinent d'utiliser le minimum des longueurs. Voici comment je reprendrais ton code :

            joueurUn = input()
            joueurDeux = input()
            carteMinimum = min(len(joueurUn), len(joueurDeux))
            
            for x in range(carteMinimum):
                if joueurUn[x] != joueurDeux[x]:
                    break


            Autrement dit tu parcours les deux listes jusqu'à ce que cela diffère, à moins que cela ne diffère jamais (si on ne break pas)

            Et ensuite, sans boucle, tu testes juste si joueurUn[x] != joueurDeux[x].

            Si oui, x est un indice valide, à tous les indices précédents, les valeurs sont égales donc tu sais ce qu'il faut afficher (il y a deux cas).

            Si non, cela veut dire qu'on a épuisé une des deux listes et tu as alors trois cas.


            • Partager sur Facebook
            • Partager sur Twitter
              27 janvier 2020 à 17:01:49

              Merci pour ces conseils j'ai reussi en commencant par ton code :D

              PascalOrtiz a écrit:

              Par contre, il est pertinent d'utiliser le minimum des longueurs. Voici comment je reprendrais ton code :

              joueurUn = input()
              joueurDeux = input()
              carteMinimum = min(len(joueurUn), len(joueurDeux))
              
              for x in range(carteMinimum):
                  if joueurUn[x] != joueurDeux[x]:
                      break




              • Partager sur Facebook
              • Partager sur Twitter
              Coucou !
                28 août 2022 à 23:03:23 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


                  29 août 2022 à 2:06:48

                  Et c'est un déterrage.
                  Le forum ne donne plus les dates d'inscription et de dernier accès dans le profil.
                  Ça pouvait aider pour savoir si les intervenants étaient encore actifs.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                  France IOI problème La bataille

                  × 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