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
Restent ceux qui pensent qu'ils savent, bien qu'ils ne sachent pas. -Platon, Alcibiade Majeur
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.
Le Tout est souvent plus grand que la somme de ses parties.
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
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.
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.
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 ...
Le Tout est souvent plus grand que la somme de ses parties.
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)
Le Tout est souvent plus grand que la somme de ses parties.
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 ...
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.
Restent ceux qui pensent qu'ils savent, bien qu'ils ne sachent pas. -Platon, Alcibiade Majeur
Le Tout est souvent plus grand que la somme de ses parties.
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
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.
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
Le Tout est souvent plus grand que la somme de ses parties.