Quelques propositions d'élèves, et à la fin un corrigé du professeur.
À la suite de chaque proposition de code, un commentaire de correction du professeur. Le cartouche demandé en introduction a été supprimé ici.
hauteur_marche = int(input()) for x in range(hauteur_marche + 1): # +1 car la hauteur_marche est enclux print("X" * x)
x
: nom de variable peu clair.hauteur_marche
: nom de variable peu clair."X" * x
: facilité du langage non recommandée ici.x = 0
. C'est accepté par le juge Prologin, mais uniquement en début et en fin de la sortie complète.def escalier(nb_marches : int): """ Prend un entier "nb_marches" et renvoie un escalier de "nb_marches", rempli du caractère "X" de manière récursive. """ if nb_marches == 0: return "" else: return escalier(nb_marches -1) + "\n" + "X" * nb_marches # tests import doctest doctest.testmod() # Entrée nb_marches = int(input()) # Sortie print(escalier(nb_marches))
def triangle(nombre_marche): """ Cette fonction prend en paramètre un entier positif et elle affiche un escalier, rempli du caractère X. >>> triangle(4) X XX XXX XXXX """ for i in range(1,nombre_marche+1,1): print(i*"X") # tests import doctest doctest.testmod() # Entrée nombre_marche = int(input()) # Sortie triangle(nombre_marche)
range(1,nombre_marche+1,1)
+
.nb_marches
est un meilleur nom de variable.def triangle(nb_marches : int): """Renvoie un triangle rectangle à la hauteur demandé. >>> triangle(4) X XX XXX XXXX """ if nb_marches == 0: return "" else: return triangle(nb_marches-1) + "\n" + "X"*nb_marches # Test (Ne fonctionne pas) #import doctest #doctest.testmod() # Entrée nb_marches = int(input()) # Sortie print(triangle(nb_marches))
nombre_marches = int(input()) escalier = "" def donne_ligne(longueur: int) -> str: """ Renvoie une chaîne de charactères correspondant à "X" fois `longueur` et le rajout, à la fin de `\n` >>> donne_ligne(5) 'XXXXX\n' >>> donne_ligne(0) '' """ ligne = "".join("X" for _ in range(longueur)) return ligne + "\n" for hauteur in range(nombre_marches): escalier += donne_ligne(hauteur+1) print(escalier)
"".join
pour une valeur constante dans l'itérateur... autant utiliser "X" * longueur
.donne_ligne
devrait plutôt être placée avant la lecture de l'entrée.# 0- Coeur du programme def construire_escalier(nb_marches: int) -> str: """ Renvoie un escalier de hauteur nb_marches rempli du caractère "X". >>> construire_escalier(1) 'X\\n' >>> construire_escalier(5) 'X\\nXX\\nXXX\\nXXXX\\nXXXXX\\n' """ if nb_marches == 1: return("X\n" ) else: return(construire_escalier(nb_marches-1) + "X"*nb_marches + "\n") # 1- Tests import doctest doctest.testmod() # 2- Lecture de l'entrée nb_marches = int(input()) # 3- Appel de la fonction / Sortie print(construire_escalier(nb_marches))
r
avant le triple double guillemet entrant, pour rendre la chaîne brute (raw en anglais) où les caractères ne sont pas échappés.def escalier(nb_marches : int) -> str : """ Renvoie 'nb_marches' lignes avec sur chaque ligne le même nombre de caractere "X" que la nième ligne. >>> nb_marches = 4 >>> escalier(nb_marches) X XX XXX XXXX """ assert 1 < nb_marches < 200 for marche in range (nb_marches): print ('X' * (marche + 1)) # tests import doctest doctest.testmod() # Entrée nb_marches = int(input()) # Sortie escalier(nb_marches)
-> str
est fausse ici.assert
est inutile ici ; un élève doit faire confiance aux données fournies par un juge en ligne.""" auteur : Franck CHAMBON https://prologin.org/train/2003/semifinal/escalier """ def affiche_escalier(nb_marches: int) -> None: """Affiche un escalier qui a `nb_marches`. >>> affiche_escalier(4) X XX XXX XXXX """ for largeur in range(1, nb_marches + 1): for _ in range(largeur): print("X", end="") print() return # Tests import doctest doctest.testmod() # Entrée / Sortie nb_marches = int(input()) affiche_escalier(nb_marches)
Variante fonctionnelle
def affiche_escalier(nb_marches: int) -> None: print("\n".join("X" * i for i in range(1, nb_marches + 1)))
De manière générale, pour un problème simple, on demande de n'utiliser que des outils basiques. Pas d'utilisation de facilité du langage dans un problème simple ; on ne le contourne pas. Ensuite, pour un problème avec d'autres difficultés, on peut naturellement utiliser les facilités du langage, sans qu'elle ne ruine le problème. Encore une fois, la règle étant de ne pas contourner le problème. Enfin, en commentaire, on peut aussi proposer une version qui montre vos connaissances du langage.