Romans¶
But de l’exercice¶
Le but de l’exercice est d’écrire une classe RomanNumeral, dans un fichier romans.py dont le but est de permettre de manipuler des chiffres en notation romaine.
Et voila le script de tests unitaires : test_romans.py
La numération romaine¶
La numération romaine est un système de numération additive utilisé par les anciens Romains. Les nombres sont représentés à l'aide de symboles combinés entre eux, notamment par les signes I, V, X, L, C, D et M, appelés chiffres romains, qui représentent respectivement les nombres 1, 5, 10, 50, 100, 500 et 1 000. (source wikipedia)
Plus d’informations dans la page wikipedia dédiée
Exercice de base¶
Écrire une classe RomanNumeral qui permet de manipuler des nombres en notation romaine. Cet exercice est assez classique dans le monde des développeurs, et ici nous allons nous en servir pour découvrir (ou redécouvrir) des possibilités des classes en Python.
Pour l’exercice de base, il va falloir faire en sorte de convertir un texte en entier en se basant sur la numération romaine.
>>> five = RomanNumeral("V")
>>> int(five)
5
>>> year = RomanNumeral("MMXX")
>>> int(year)
2020
Simple, mais pour gérer les chiffres comme le 4 cela demande déjà un peu de réflexion.
>>> four = RomanNumeral("IV")
>>> int(four)
4
Attention, il faudra lever une exception de type ValueError si une forme non autorisée de chiffre romain est entrée:
>>> four = RomanNumeral("IIII")
ValueError: 'IIII' is not allowed in RomanNumeral
Bonus numéro 1¶
Ajouter une représentation en chaîne de caractères qui aide l’utilisateur :
>>> four = RomanNumeral("IV")
>>> four
RomanNumeral('IV')
>>> str(four)
'IV'
>>> print(four)
IV
Bonus numéro 2¶
Ajouter une fonction qui permette de créer un chiffre romain à partir d’un entier :
>>> best_year = RomanNumeral.from_int(1978)
>>> print(best_year)
'MCMLXXVIII'
Bonus numéro 3¶
Support de l’addition, la soustraction et la multiplication avec un entier, ou une autre instance de RomanNumeral :
>>> RomanNumeral('VI') + RomanNumeral('II')
RomanNumeral('VIII')
>>> RomanNumeral('X') * RomanNumeral('X')
RomanNumeral('C')
>>> RomanNumeral('IV') - 3
RomanNumeral('I')
Bonus numéro 4¶
Supporter l’ordonnancement selon les règles suivantes :
- un RomanNumeral peut être comparé à un autre RomanNumeral
- un RomanNumeral peut être comparé à un entier
- un RomanNumeral peut être testé pour l’(in)égalité avec une chaîne de caractères, mais pas les relations d’ordre.
>>> twentyfour = RomanNumeral('XXIV')
>>> twentyfour2 = RomanNumeral('XXIII') + 1
>>> fifteen = RomanNumeral('XV')
>>> twentyfour == twentyfour2
True
>>> twentyfour == fifteen
False
>>> twentyfour > fifteen
True
>>> twentyfour < fifteen
False
>>> twentyfour >= fifteen
True
>>> twentyfour == "XXIV"
True
>>> twentyfour < "XIV"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'RomanNumeral' and 'str'
Aide¶
Si vraiment vous êtes bloqué·e·s, vous pouvez regarder ces articles :
- Recipes for converting numbers to/from Roman numerals
- converting objects to integers
- customizing the string representation for a class
- How to implement from_int
- operator overloading
- overloading addition
- implementing ordering
- making your own integers