Skip to content

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 :

Solution

Voir la solution