Anniversaire de chat⚓︎
Lorsqu'un chat souhaite offrir une carte d'anniversaire à un ami chat, il lui offre une carte avec un chat tout mignon avec un texte sur son âge dans sa vie actuelle. Oui, les chats ont plusieurs vies... Ce qui fait de très nombreuses cartes possibles à créer.
La société CatCard propose de personnaliser la carte avec un texte en anglais ("en"
) ou en français ("fr"
) qui dépend de l'age
et du num_vie
; des entiers strictement positifs. Si langue demandée n'est ni "fr"
ni "en"
, la société CatCard propose une réponse 'Je donne ma langue au chat'
Écrire une fonction channiv
qui renvoie le texte demandé comme sur les exemples suivants :
Exemples
>>> channiv(3, 4)
'Joyeux 3e channiversaire de ta 4e vie'
>>> channiv(3, 4, "en")
'Happy purrthday, for 3rd year of 4th life'
>>> channiv(1, 1, "fr")
'Joyeux 1er channiversaire de ta 1re vie'
>>> channiv(1, 1, "en")
'Happy purrthday, for 1st year of 1st life'
>>> channiv(3, 4, "miaou")
'Je donne ma langue au chat'
Paramètre par défaut
On pourra constater que channiv(3, 4)
est équivalent à channiv(3, 4, "fr")
, en effet la majorité des clients de CatCard sont français ; ils veulent que la fonction soit configurée pour renvoyer par défaut un texte en français.
Le mécanisme pour ce faire est le paramètre par défaut lang
dans la définition de channiv
def channiv(age, num_vie, lang="fr"):
Ordinal abrégé
En français, on place seulement un e
après le nombre, sauf pour 1er
(premier) et 1re
(première).
On trouve souvent des abréviations en
ème
, elles ne sont pas recommandées, sauf pour le cas d'une lettre comme nième, ou pième.
En anglais, on place th
après le nombre, sauf pour 1st
(first), 2nd
(second) et 3rd
(third).
def channiv(age, numpy-undvie, lang="fr"):bksl-nl if lang == "fr":bksl-nl ...bksl-nl elif lang == "en":bksl-nl ...bksl-nl else:bksl-nl return "Je donne ma langue au chat"bksl-nlbksl-nlbksl-nl# Testsbksl-nlbksl-nlassert channiv(3, 4) == 'Joyeux 3e channiversaire de ta 4e vie'bksl-nlassert channiv(3, 4, "en") == 'Happy purrthday, for 3rd year of 4th life'bksl-nlassert channiv(1, 1, "fr") == 'Joyeux 1er channiversaire de ta 1re vie'bksl-nlassert channiv(1, 1, "en") == 'Happy purrthday, for 1st year of 1st life'bksl-nlassert channiv(3, 4, "miaou") == 'Je donne ma langue au chat'bksl-nlbksl-nldef channiv(age, numpy-undvie, lang="fr"):bksl-nl if lang == "fr":bksl-nl carte = "Joyeux "bksl-nl carte += str(age)bksl-nl if age == 1:bksl-nl carte += "er"bksl-nl else:bksl-nl carte += "e"bksl-nl carte += " channiversaire de ta "bksl-nl carte += str(numpy-undvie)bksl-nl if numpy-undvie == 1:bksl-nl carte += "re"bksl-nl else:bksl-nl carte += "e"bksl-nl carte += " vie"bksl-nl return cartebksl-nl elif lang == "en":bksl-nl carte = "Happy purrthday, for "bksl-nl carte += str(age)bksl-nl if age == 1:bksl-nl carte += "st"bksl-nl elif age == 2:bksl-nl carte += "nd"bksl-nl elif age == 3:bksl-nl carte += "rd"bksl-nl else:bksl-nl carte += "th"bksl-nl carte += " year of "bksl-nl carte += str(numpy-undvie)bksl-nl if numpy-undvie == 1:bksl-nl carte += "st"bksl-nl elif numpy-undvie == 2:bksl-nl carte += "nd"bksl-nl elif numpy-undvie == 3:bksl-nl carte += "rd"bksl-nl else:bksl-nl carte += "th"bksl-nl carte += " life"bksl-nl return cartebksl-nl else:bksl-nl return "Je donne ma langue au chat"bksl-nlbksl-nl
A
Une solution assez directe, mais non factorisée
Avec un code plus factorisé⚓︎
def ordinal(n, lang, genre=None):
"""Renvoie l'ordinal de n dans la lang, accordé en genre"""
if lang == "fr":
if n == 1:
assert genre is not None, "Il faut préciser le genre en français"
if genre == "féminin":
return "1re"
if genre == "masculin":
return "1er"
else:
return str(n) + "e"
elif lang == "en":
if n == 1:
return "1st"
elif n == 2:
return "2nd"
elif n == 3:
return "3rd"
else:
return str(n) + "th"
def channiv(age, num_vie, lang="fr"):
if lang == "fr":
carte = "Joyeux "
carte += ordinal(age, "fr", "masculin")
carte += " channiversaire de ta "
carte += ordinal(num_vie, "fr", "féminin")
carte += " vie"
return carte
elif lang == "en":
carte = "Happy purrthday, for "
carte += ordinal(age, "en")
carte += " year of "
carte += ordinal(num_vie, "en")
carte += " life"
return carte
else:
return "Je donne ma langue au chat"
Z