Partage
  • Partager sur Facebook
  • Partager sur Twitter

exercice sur acronyme

Sujet résolu
    4 septembre 2022 à 12:55:06

    bonjour à tous

    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" />

    0 %
    Test 15 Succès

    Exécuté en 0,06 seconde.

    100 %
    Test 16 Succès

    Exécuté en 0,06 seconde.

    100 %
     
    TOTAL Échec Vous avez réussi 15 tests sur 16. 94 %

    je ne sais vraiment plus quoi faire

    merci de votre aide

    -
    Edité par EmmanuelKona 5 septembre 2022 à 23:41:48

    • Partager sur Facebook
    • Partager sur Twitter
      4 septembre 2022 à 13:56:39

      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 Code 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.

      (titre originel : france ioi)

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        4 septembre 2022 à 15:33:17

        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.
        • Partager sur Facebook
        • Partager sur Twitter

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

          5 septembre 2022 à 18:03:40

          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))
          • Partager sur Facebook
          • Partager sur Twitter

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

            5 septembre 2022 à 23:36:14

            Merci beaucoup

            j'ai finaleament compris

            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()
            

            Merci pour tout

            • Partager sur Facebook
            • Partager sur Twitter
              6 septembre 2022 à 0:12:54

              ma contribution

              accr = tuple(input())
              for _ in range(int(input())):
                  titre = input().title()
                  if accr == next(zip(*titre.split())): print(titre)



              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                6 septembre 2022 à 1:05:15

                @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

                • Partager sur Facebook
                • Partager sur Twitter

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

                  10 septembre 2022 à 18:42:55

                  josmiley a écrit:

                  ma contribution

                  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

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 septembre 2022 à 2:37:34

                    @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'
                    • Partager sur Facebook
                    • Partager sur Twitter

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

                      11 septembre 2022 à 23:48:23

                      PierrotLeFou a écrit:

                      @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.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 septembre 2022 à 0:26:37

                        OK je comprend.

                        Tu extrait le minimum, tu le mets en upper et tu "compresses" avec join.

                        -
                        Edité par PierrotLeFou 12 septembre 2022 à 0:27:51

                        • Partager sur Facebook
                        • Partager sur Twitter

                        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é.
                        • Editeur
                        • Markdown