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.
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
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" !
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.
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.
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères