Aller au contenu

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é suivant les exemples suivants :

🐍 Console Python
>>> 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

🐍 Script Python
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).

###
# 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-nlbksl-nl# Autres testsbksl-nlbksl-nldef secretpy-undchanniv(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-nlbksl-nlfor age in range(1, 17):bksl-nl for numpy-undvie in range(1, 17):bksl-nl attendupy-undfr = secretpy-undchanniv(age, numpy-undvie)bksl-nl assert channiv(age, numpy-undvie) == attendupy-undfr, f"Erreur avec {age=} et {numpy-undvie=}"bksl-nl attendupy-unden = secretpy-undchanniv(age, numpy-undvie, "en")bksl-nl assert channiv(age, numpy-undvie, "en") == attendupy-unden, f"Erreur avec {age=} et {numpy-undvie=}"bksl-nlbksl-nlassert channiv(1, 1, "rrrr") == 'Je donne ma langue au chat'bksl-nlbksl-nl 5/5

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é⚓︎

🐍 Script Python
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