Q4 - Nombre de voyelles⚓︎
Le problème
Proposition 1⚓︎
🐍 Script Python
def nombre_de_voyelles(nb_caractère: int, mot: str) -> int:
"""Cette fonction prend en paramètre une chaine de caractères majuscules et minuscules sans accents et le nombre de caractère.
Cette fonction renvoie le nombre de voyelles qu'elle contient.
>>> 8
ProlOgin
3
"""
mot = mot.lower()
nombre_voyelles = 0
liste_voyelles = ["a","e","i","o","u","y"]
for x in range(nb_caractère):
if mot[x] in liste_voyelles:
nombre_voyelles += 1
return nombre_voyelles
# tests
import doctest
doctest.testmod()
# Entrée
nb_caractère = int(input())
mot = input()
# Sortie
print(nombre_de_voyelles(nb_caractère, mot))
- On aurait aimé ne pas voir ni
lower
, niupper
, voire niin
en test d'appartenance à une chaine.
Proposition 2⚓︎
🐍 Script Python
def nombre_de_voyelles(chaine_caractères:str)-> int:
""" Prend une chaine de caractères puis renvoie le nombres de voyelles présent dedans
>>> nombre_de_voyelles("Je voudrais une bonne note en NSI")
13
>>> nombre_de_voyelles("Marseille est en France")
8
"""
# On transforme cette chaine de caractères en une liste de caractères.
liste_caractères = list(chaine_caractères)
def est_voyelle(lettre:str) -> bool:
"""
>>> est_voyelle("a")
True
>>> est_voyelle("X")
False
>>> est_voyelle("Y")
True
>>> est_voyelle("z")
False
"""
# On met tout en minuscule.
lettre = lettre.lower()
voyelles = {"a","e","i","o","u","y"}
return lettre in voyelles
nb_voyelles = 0
for x in range(len(liste_caractères)):
if est_voyelle(liste_caractères[x]):
nb_voyelles += 1
return nb_voyelles
# tests
import doctest
doctest.testmod()
# Entrée
nb_caractères = int(input())
chaine_caractères = input()
# Sortie
print(nombre_de_voyelles(chaine_caractères))
- On peut se passer de
set
et delower
, sinon c'est très bien.
Proposition 3⚓︎
🐍 Script Python
longueur_mot = int(input())
mot = input().upper()
voyelle = [" ","A","E","I","O","U","Y"]
A = 0
for lettre in mot:
if lettre in voyelle:
A += 1
print (A)
- Fonctionne, mais ce n'est pas ce qu'on attend en devoir.
voyelle
: l'identifiant est mal choisi, car tu comptes l'espace aussi.A
: identifiant très mal choisi.print(A)
au lieu deprint (A)
- Contrairement à un problème de FranceIOI, ici on ne voulait pas compter l'espace... Il est donc faux ici !!!
Proposition 4⚓︎
🐍 Script Python
voyelles = "aeiouy"
nombre_caractères = int(input())
chaine_charactère = input()
print(sum(lettre.lower() in voyelles for lettre in chaine_charactère))
- Style fonctionnel, c'est bien, mais à placer dans une fonction, et idéalement en seconde version proposée.
charactère
: c'est du franglais ;-)
Proposition 5⚓︎
🐍 Script Python
def voyelles(mot):
""" Renvoie le nom de voyelle dans une chaine de caractère.
>>> voyelles("Prologin")
3
"""
voyelles = ['a', 'e', 'i', 'o', 'u', 'y']
nb_voyelles = sum(1 for lettre in mot if lettre in voyelles )
return nb_voyelles
# Test
import doctest
doctest.testmod()
# Entrées
nb_lettre = int(input())
mot = input().lower()
if not (0 <= nb_lettre <= 10000):
raise ValueError("Trop de caractères")
# Sortie
print(voyelles(mot))
- Style fonction efficace.
- On peut éviter le
lower
, et lein
.
Proposition 6⚓︎
🐍 Script Python
def cherche_nb_voyelle(chaine_caractère, liste_voyelle, nb_voyelle: int):
""" cherche le nombre de voyelle dans un mots ou phrase
>>> cherche_nb_voyelle('prologin', ['a', 'o', 'u', 'y', 'e', 'i'], 0)
3
"""
for x in chaine_caractère:
for y in liste_voyelle:
if x == y :
nb_voyelle += 1
return nb_voyelle
import doctest
doctest.testmod()
nb_caractère = int(input())
chaine_caractère = input().lower()
nb_voyelle = 0
liste_voyelle = ['a', 'o', 'u', 'y', 'e', 'i']
print(cherche_nb_voyelle(chaine_caractère, liste_voyelle, nb_voyelle))
- La liste de voyelles pourrait rester dans le corps de la fonction, inutile de la passer en paramètre...
Proposition 7⚓︎
🐍 Script Python
""" Cette fonction renvoie renvoie le nombre de voyelles du mot.
Exemple d'entrée : 8
ProlOgiN
Exemple de sortie: 3
"""
# tests
import doctest
doctest.testmod()
#Entrée
nb_caractère= int(input())
mot = input().lower()
#Programme
voyelles = "aeiouy"
fonction_nb_voyelles = sum(mot.count(i) for i in voyelles)
#Sortie
print(fonction_nb_voyelles)
-
Tu aurais pu mettre aussi une fonction...
-
Ton doctest est inutile sans fonction...
-
Utiliser
.count
n'est pas génial ici...
Proposition 8⚓︎
🐍 Script Python
# 0- Coeur du programme
def nombre_voyelles(nb_lettres: int, chaine_mot: str) -> int:
""" Renvoie le nombre de voyelles de chaine_mot.
>>> nombre_voyelles(11, "hello world")
3
>>> nombre_voyelles(8, "prologin")
3
"""
compteur = 0
voyelles = ["a","e","i","o","u","y"]
for lettre in chaine_mot: # On vérifie pour chaque lettre de chaine_mot si elle se trouve dans voyelles
if lettre in voyelles:
compteur += 1 # Si oui, on rajoute 1 au compteur
return compteur # A la fin, on renvoie le compteur
# 1- Tests
import doctest
doctest.testmod()
# 2- Lecture des entrées
nb_lettres = int(input())
chaine_mot = input().lower()
# 3- Appel de la fonction / Sortie
print(nombre_voyelles(nb_lettres, chaine_mot))
- On pouvait se passer de
lower
.
Proposition 9⚓︎
🐍 Script Python
def nb_voyelles(texte : str) -> int :
""" Renvoie le nombre de voyelles que la chaine de caractères 'texte' contient.
>>> nb_caractères = 8
>>> texte = 'ProlOgiN'
>>> nb_voyelles(texte)
3
"""
voyelles = ['a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U', 'y', 'Y']
texte = list(texte)
return sum(1 for lettre in texte if lettre in voyelles)
# tests
import doctest
doctest.testmod()
# Entrée
nb_caractères = int(input())
assert 1 <= nb_caractères <= 10000
texte = input()
# Sortie
print(nb_voyelles(texte))
- Très bien dans l'ensemble.
- Le
assert
est inutile ici. - On peut aussi se passer du
in voyelles
.
Corrigé du professeur⚓︎
On n'utilise pas le in
de l'appartenance à une chaine de caractères ; on fait ici une boucle pour tester chaque voyelle, et exceptionnellement on utilise un break
pour éviter de finir inutilement la boucle sur les voyelles.
🐍 Script Python
"""
author: Franck CHAMBON
problem: https://prologin.org/train/2003/qualification/nombre_de_voyelles
"""
def nb_voyelles(chaine: str) -> int:
"""Renvoie le nombre de voyelles de la chaine.
>>> nb_voyelles("ProlOgiN")
3
"""
def est_voyelle(caractere: str) -> bool:
for voyelle in "aeiuoyAEIOUY":
if caractere == voyelle:
return True
return False
reponse = 0
for caractere in chaine:
if est_voyelle(caractere)
reponse += 1
return reponse
import doctest
doctest.testmod()
taille = int(input())
chaine = input()
print(nb_voyelles(chaine))
- Une version fonctionnelle de
nb_voyelles
en une ligne !
🐍 Script Python
def nb_voyelles(taille: int, chaine: str) -> int:
return sum(1 for c in chaine if c in "aeiuoyAEIOUY")