Partage
  • Partager sur Facebook
  • Partager sur Twitter

Suppression éléments chaînes de caractères

Problème dans un exercice sur France IOI : Chaînes de caractères

Sujet résolu
    3 décembre 2020 à 15:27:59

    Bonjour à tous,

    Je suis actuellement en train de résoudre un exercice sur France IOI dans la thématique "Chaînes de caractères" et depuis hier soir, je bloque totalement. L'exercice s'intitule "ngms sns vlls", qui signifie en réalité "énigmes sans voyelles".

    Comme indiqué dans le titre, le but de l'exercice consiste à écrire un programme qui lorsqu'il lit un titre et un auteur de livre en entrée, supprime tous les espaces et toutes les voyelles présentes dans le titre du livre et son auteur. Mes seules contraintes sont de ne pouvoir saisir que des mots en majuscules et avec espaces. 

    Mon idée était la suivante : 

    1) Lire mes deux chaînes de caractères en entrée

    2) Déclarer une liste contenant uniquement les caractères des voyelles (en majuscule) et l'espace.

    3) A l'aide de deux boucles imbriquées, tester sur ma chaîne de caractères (titre du livre ou nom de l'auteur) si un des éléments la liste de voyelles+espace est présent dans ma chaîne.

    4) Si oui, retirer les voyelles et espaces concernés. 

    L'étape 4) me pose problème, j'avais envisagé de remplacer les voyelles et espaces par des espèces de "vide" mais je ne sais pas du tout comment m'y prendre.

    Je veux rester sur des fonctions basiques sans avoir recours à des fonctions Python élaborées pour comprendre comment retirer les caractères que je souhaite supprimer. 

    En pseudo-code, mon algo donnerait ça : 

    Langage Python :

    titreLivre=input()
    nomAuteur=input()
    
    listeVoyelles=['A','E','I','O','U','Y',' ']
    
    for i in range(len(titreLivre)):
       for j in range(listeVoyelles):
          if (titreLivre[i] == listeVoyelles[j]):
    
             ##Et à partir de là, je bloque 
             
                    
    

    Merci. 

    -
    Edité par CircuitBreaker 3 décembre 2020 à 16:17:46

    • Partager sur Facebook
    • Partager sur Twitter

    Restent ceux qui pensent qu'ils savent, bien qu'ils ne sachent pas. -Platon, Alcibiade Majeur

      3 décembre 2020 à 17:39:32

      Évite les range(len), aussi tu peux utiliser l'opérateur "not in"

      for lettre in titreLivre:
          if lettre not in listeVoyelles:
              ...



      • Partager sur Facebook
      • Partager sur Twitter
        3 décembre 2020 à 18:46:49

        Si tu restes avec une chaîne, n'oublie pas qu'une chaîne est immuable, donc pas de remove().
        Par contre, si la lettre est dans la liste des voyelles, tu peux utiliser la méthode index() sans erreur.
        Si index te retourne une valeur dans  i  par exemple, tu peux faire:
        texte = texte[:i] + texte[i+1:]
        et ça marche même pour le dernier caractère.
        Il ne faut pas oublier qu'une voyelle peut se retrouver plus d'une fois dans la chaîne.
        Je remplacerais le if de thelinekioubeur par un while.
        • Partager sur Facebook
        • Partager sur Twitter

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

          3 décembre 2020 à 18:57:37

          pour ta problématique, tu peux transformer ta chaine en liste de caractères et travailler sur le liste avant de la remettre en chaine de caractère.

          soit utiliser la fonction replace en parcourant le tableau des voyelles et remplaçant tour à tour la voyelle de la chaine par un caractère vide.

          • Partager sur Facebook
          • Partager sur Twitter
            3 décembre 2020 à 22:22:03

            On peut écrire le code de multiples façons. Pour qqchose qui se rapproche de l'algorithme que tu as en tête (et qui est plus ou moins correct), tu peux procéder de la manière suivante :

            • Construire la liste L des caractères de chaque phrase, un peu pour obtenir ce que tu as fait pour les voyelles. L'intérêt est qu'une liste est modifiable donc il te suffira d'écraser un caractère
            • Tu parcours L avec ta double boucle et tu écrases  toute voyelle ou espace de L par un caractère vide (comme ceci : "")
            • Une fois sorti de la double boucle, tu transformes ta liste L de caractères en une chaîne avec la méthode join (ou alors en utilisant print et son argument nommé sep ou end)

            Un autre code simple serait du genre :

            # le titre et l'auteur dans une seule chaîne
            texte=input()+'\n'+input()
            
            # la future réponse
            rep=[]
            
            for c in texte:
                if c not in 'AEI OUY':
                    # rajouter c à rep
                    
            # Afficher les caractères de rep
            


            Il est souvent plus léger (et lisible) de parcourir une liste sans indice.

            Si tu acceptes d'utiliser la méthode replace, ça pourrait donner :

            texte=input()+'\n'+input()
            
            for v in 'AEI OUY':
                texte=texte.replace(v, '')
            
            print(texte

            Tu peux aussi afficher à la volée :

            print(*(c if c not in "AEIOUY " else '' for c in input()+'\n'+input()), sep='', end='')





            -
            Edité par PascalOrtiz 3 décembre 2020 à 22:22:54

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              3 décembre 2020 à 22:37:34

              PascalOrtiz a écrit:

              On peut écrire le code de multiples façons. Pour qqchose qui se rapproche de l'algorithme que tu as en tête (et qui est plus ou moins correct), tu peux procéder de la manière suivante :

              • Construire la liste L des caractères de chaque phrase, un peu pour obtenir ce que tu as fait pour les voyelles. L'intérêt est qu'une liste est modifiable donc il te suffira d'écraser un caractère
              • Tu parcours L avec ta double boucle et tu écrases  toute voyelle ou espace de L par un caractère vide (comme ceci : "")
              • Une fois sorti de la double boucle, tu transformes ta liste L de caractères en une chaîne avec la méthode join (ou alors en utilisant print et son argument nommé sep ou end)

              Un autre code simple serait du genre :

              # le titre et l'auteur dans une seule chaîne
              texte=input()+'\n'+input()
              
              # la future réponse
              rep=[]
              
              for c in texte:
                  if c not in 'AEI OUY':
                      # rajouter c à rep
                      
              # Afficher les caractères de rep
              


              Il est souvent plus léger (et lisible) de parcourir une liste sans indice.

              Si tu acceptes d'utiliser la méthode replace, ça pourrait donner :

              texte=input()+'\n'+input()
              
              for v in 'AEI OUY':
                  texte=texte.replace(v, '')
              
              print(texte

              Tu peux aussi afficher à la volée :

              print(*(c if c not in "AEIOUY " else '' for c in input()+'\n'+input()), sep='', end='')





              -
              Edité par PascalOrtiz il y a 7 minutes


              J'adore ta dernière proposition , mais si le PO ne sait pas organiser une boucle et y intégrer des conditions... c'est du charabia pour lui.
              • Partager sur Facebook
              • Partager sur Twitter
                3 décembre 2020 à 22:45:25

                Diablo76 a écrit:


                J'adore ta dernière proposition , mais si le PO ne sait pas organiser une boucle et y intégrer des conditions... c'est du charabia pour lui.


                J'en ai bien conscience et c'est pour cela que je lui ai proposé deux alternatives simples. Ma dernière proposition était là pour élargir le débat :) et inciter à proposer des solutions variées.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  3 décembre 2020 à 22:55:53

                  Oui :) mais avec ta dernière solution, tu lances un concours , je suis sur que @PierrotLeFou  va relevé le défi :D:p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 décembre 2020 à 23:39:45

                    Il y a au moins deux autres façons vraiment différentes d'écrire le code.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 décembre 2020 à 1:30:51

                      Puisqu'on me défie, :)
                      texte = input(">")
                      rep = "".join([c for c in texte if c not in "AEIOUY "])
                      print(rep)
                      On aurait pu tout écrire sur une seule ligne ...
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        4 décembre 2020 à 2:04:44

                        Oui mais c'est assez proche dans l'idée de mon 2e code. Au passage, créer une liste n'est pas nécessaire, l'expression génératrice suffit.

                        Comme j'ai dit, il y a au moins deux autres façons assez différentes de faire.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 décembre 2020 à 2:56:09

                          Une méthode semblable à ce qui a été donnée pour les listes, mais directement avec les chaînes.
                          texte=input(">")
                          rep=""
                          for c in texte:
                           if c not in "AEIOUY ": rep += c
                          print(rep)
                          • Partager sur Facebook
                          • Partager sur Twitter

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

                            4 décembre 2020 à 8:30:22

                            Bonjour,

                            ...

                            import re
                            print(re.sub(r"[AEIOUY ]*", '', input('titre: ')+'\n'+input('auteur: ')))
                            



                            • Partager sur Facebook
                            • Partager sur Twitter
                            • J'aime les bananes, le python, le gnu, le pingouin.
                              • Vive le libre !
                              4 décembre 2020 à 9:37:48

                              __fabien a écrit:

                              Bonjour,

                              ...

                              import re
                              print(re.sub(r"[AEIOUY ]*", '', input('titre: ')+'\n'+input('auteur: ')))
                              




                              C'est en effet une des deux méthodes que j'avais en tête. L'autre est plus pythonique.

                              -
                              Edité par PascalOrtiz 4 décembre 2020 à 9:38:48

                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 décembre 2020 à 10:12:00

                                1110012

                                -
                                Edité par __p_b2cs 6 décembre 2020 à 15:34:50

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 décembre 2020 à 10:18:23

                                  Il a aussi dit "Readability counts" donc nomme mieux tes variables :lol:
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 décembre 2020 à 10:25:51

                                    1100013

                                    -
                                    Edité par __p_b2cs 6 décembre 2020 à 15:35:10

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      4 décembre 2020 à 14:01:53

                                      L'autre solution que j'avais en tête :

                                      s="""AUTANT EN EMPORTE LE VENT
                                      MARGARET MITCHELL"""
                                      print(s.translate(dict(zip(map(ord, 'AEI OUY'), ['']*7)))



                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        4 décembre 2020 à 16:15:44

                                        Simple is better than complex.

                                        J'ai jamais vu un usecase correct de str.translate

                                        -
                                        Edité par thelinekioubeur 4 décembre 2020 à 16:16:13

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          4 décembre 2020 à 17:17:53

                                          Pourquoi faire simple quand on peut faire compliqué ...
                                          J'aurais dû penser au regex, mais je ne connaissais pas la méthode string.translate
                                          Je vais me coucher moins stupide ce soir ...
                                          • Partager sur Facebook
                                          • Partager sur Twitter

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

                                          Suppression éléments chaînes de caractères

                                          × 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