s'il vous plait je suis un peu bloqué sur l'eexercice ci dessous.
j'ai écrit un programme qui m'a permis de réussir 15tests sur 16
je ne sais pas ce qui cause réellement le problème
voici l'exercice:
Comme dans tout lieu de travail, les employés de la bibliothèque ont pris l’habitude d’utiliser des acronymes (exemples d’acronymes : IOI, RATP, BEPC, LOL...) pour les titres de livres les plus utilisés, ce qui leur permet de parler plus vite !
Seulement vous ne connaissez pas encore tous les acronymes, aussi lorsqu’on vous demande d’aller chercher un livre sans vous donner le titre complet, vous êtes bien embêté(e) !
Étant donné un acronyme, vous devez trouver tous les titres qui correspondent et les afficher "joliment".
Limites de temps et de mémoire (Python)
Temps : 0,1 s sur une machine à 1 GHz.
Mémoire : 8 000 ko.
Contraintes
Tous les titres de livres ainsi que les acronymes contiennent au plus 200 caractères.
Entrée
Sur la première ligne, un acronyme, uniquement constitué de lettres majuscules.
Sur la seconde ligne, un entier nbLivres, le nombre de titres de livres.
Sur les nbLivres lignes suivantes les titres de livres, uniquement constitués de lettres ou d’espaces, sans accents.
Les mots de chaque titre sont toujours séparés par un seul espace.
Sortie
Vous devez afficher chaque titre de livre qui correspond à l’acronyme, en mettant toutes ses lettres en minuscules sauf la première lettre de chaque mot, qui doit être en majuscule.
Exemple
entrée :
PP
7
PEDro paramO
Poemes PALINDROMES
LA Condition HUMAINE
PERE et fils
petite
Promenade Au phare
peter pan
sortie :
Pedro Paramo
Poemes Palindromes
Peter Pan
mon programme est le suivant:
acro=input().lower()
nbLivres=int(input())
for i in range(nbLivres):
titreLivre=input()
mots=titreLivre.lower().split()
compte = 0
if len(acro)==len(mots):
for mot in mots:
for lettre in acro:
if mot[0]==lettre:
compte+=1
if compte==len(acro):
for i in range(len(acro)):
print(mots[i].capitalize(),end=" ")
print()
les résultats:
Test 1
Succès
Exécuté en 0,06 seconde.
100 %
Test 2
Succès
Exécuté en 0,06 seconde.
100 %
Test 3
Succès
Exécuté en 0,06 seconde.
100 %
Test 4
Succès
Exécuté en 0,06 seconde.
100 %
Test 5
Succès
Exécuté en 0,06 seconde.
100 %
Test 6
Succès
Exécuté en 0,06 seconde.
100 %
Test 7
Succès
Exécuté en 0,06 seconde.
100 %
Test 8
Succès
Exécuté en 0,06 seconde.
100 %
Test 9
Succès
Exécuté en 0,06 seconde.
100 %
Test 10
Succès
Exécuté en 0,06 seconde.
100 %
Test 11
Succès
Exécuté en 0,06 seconde.
100 %
Test 12
Succès
Exécuté en 0,06 seconde.
100 %
Test 13
Succès
Exécuté en 0,07 seconde.
100 %
Test 14
Échec
La réponse donnée par votre programme est incorrecte. Il a affiché :
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A B
au lieu de :
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
<input style="font-family: inherit; font-size: inherit; margin: 3px 0px;" type="button" value="Surligner le premier caractère différent" />
Bonjour, Merci d'indiquer un titre de sujet en rapport avec votre problématique.
Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Merci de colorer votre code à l'aide du bouton Code
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: python;">Votre code ici</pre>.
Merci de modifier votre message d'origine en fonction.
Mauvais titre
Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.
Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).
De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.
Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.
Merci de modifier votre titre. Pour cela, éditez le premier message de votre sujet.
Tu as les boucles: for mot in mots: for lettre in acro: Ce n'est pas ça un acronyme. Fais une seule boucle et compare la première lettre du i-ième mot avec le i-ième caractère de l'acronyme.
Le Tout est souvent plus grand que la somme de ses parties.
Pour ceux que ça pourraient intéresser, voici une version plus condensée:
acro = input().lower() for _ in range(int(input())): mots = input().lower().split() if len(acro) == len(mots) and all(mot[0] == c for mot, c in zip(mots, acro)): print(*(mot.capitalize() for mot in mots))
Le Tout est souvent plus grand que la somme de ses parties.
le programme comparait toutes les lettres de l'acro à chaque mot ce qui faisait que le compteur ne trouvait pas le bon nombre.le bon est le suivant:
acro=input().lower()
nbLivres=int(input())
for i in range(nbLivres):
titreLivre=input()
mots=titreLivre.lower().split()
compte = 0
if len(acro)==len(mots):
for i in range(len(mots)) :
if mots[i][0]==acro[i]:
compte+=1
if compte==len(acro):
for i in range(len(acro)):
print(mots[i].capitalize(),end=" ")
print()
@josmiley: alors, tu retournes quand en prison? L'hypothèse dit que l'acronyme sera en majuscules, donc pas de conversion. Merci pour str.title), ça fait le job. le next combiné avec le zip et le split me donne la première lettre de chaque mot. Et ça donne un autre tuple. Si ce n'est pas égal, ce n'est pas bon.¸ J'aime bien ... merci ...
- Edité par PierrotLeFou 6 septembre 2022 à 1:10:10
Le Tout est souvent plus grand que la somme de ses parties.
accr = tuple(input())
for _ in range(int(input())):
titre = input().title()
if accr == next(zip(*titre.split())): print(titre)
Très bon code.
Ligne 1 : effectivement, il faut convertir en tuple car à la ligne 4, zip va produire un tuple
Ligne 3 : bien vu, je l'utilise pas souvent celui-là (mais il est quand même dans mon tuto sur les chaînes de caractères). C'est justifié par le fait que l'acronyme de la ligne 1 est en lettres majuscules. D'un point de vue algorithmique ce n'est pas optimal car on fait la transformation pour des chaînes qui peut-être ne conviennent pas mais c'est un détail.
Ligne 4 : c'est assez compliqué si on connait pas. a) Il faut connaitre le procédé zip(*it) qui finalement dézippe au lieu de zipper, c'est bien expliqué ICI. Dans notre cas, ça crée un itérateur qui génère le tuple des premières lettres de chaque mot de la liste L des mots de la ligne courante, puis le tuple des 2es lettres de chaque mot de L et ainsi de suite jusqu'à ce qu'on ait épuisé les lettres d'un des mots de L. b) Utiliser next(mon_it) procède juste à la première itération de l'itérable mon_it. Par exemple, le code next(c for c in "python") ou encore le code équivalent next(iter("python")) renvoient juste la première lettre p. Dans notre cas, cela génère le tuple des initiales de chaque mot de la liste des mots de la ligne courante.
Tous les codes que j'ai pu essayer sur les tests de france-ioi donnent le même temps, que le code soit astucieux ou pas.
Le code que j'avais écrit :
acro=input()
nl=int(input())
for _ in range(nl):
texte=input().split()
if ''.join(mot[0].upper() for mot in texte)==acro:
print(*(mot.capitalize() for mot in texte))
- Edité par PascalOrtiz 10 septembre 2022 à 18:44:20
@PascalOrtiz: Tu sembles dire que title() n'est pas optimal. Bien sûr, il teste aussi les espaces. Mais pour les mots eux-mêmes, le traitement est le même que capitalize() >>> "ABC".title() 'Abc' >>> "ABC".capitalize() 'Abc'
Le Tout est souvent plus grand que la somme de ses parties.
@PascalOrtiz: Tu sembles dire que title() n'est pas optimal. Bien sûr, il teste aussi les espaces. Mais pour les mots eux-mêmes, le traitement est le même que capitalize() >>> "ABC".title() 'Abc' >>> "ABC".capitalize() 'Abc'
Je ne parle par de l'optimalité de title par rapport à capitalize, qui doit être comparable.
Jo transforme toutes les phrases du test en title alors qu'on ne sait pas si les initiales de la chaîne représentent l'acronyme donc cette transformation peut être faite en pure perte, c'est en ça que ce n'est pas optimal.
Tu extrait le minimum, tu le mets en upper et tu "compresses" avec join.
- Edité par PierrotLeFou 12 septembre 2022 à 0:27:51
Le Tout est souvent plus grand que la somme de ses parties.
exercice sur acronyme
× 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.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Python c'est bon, mangez-en.
Le Tout est souvent plus grand que la somme de ses parties.
Découverte Python Doc Tkinter Les chaînes de caractères
Le Tout est souvent plus grand que la somme de ses parties.
Découverte Python Doc Tkinter Les chaînes de caractères
Le Tout est souvent plus grand que la somme de ses parties.