Aller au contenu

Écrire un nombre en chiffres romains⚓︎

On souhaite dans cet exercice écrire des nombres entiers strictement positifs en chiffres romains.

Cette notation a évolué au fil des siècles. On se propose ici d'utiliser la méthode fixée au Moyen-Âge en se limitant aux entiers inférieurs à \(5\,000\).

1. Symboles utilisés

Les symboles valides sont les suivants :

Valeur Symbole
\(1\) I
\(5\) V
\(10\) X
\(50\) L
\(100\) C
\(500\) D
\(1\,000\) M

Ainsi, MMXII (\(2012\)) est une écriture valide, AM non.

2. Ordre d'écriture

La représentation d'un nombre en chiffres romains se lit de gauche à droite. Dans le cas de base, on y rencontre des symboles de valeurs décroissantes.

Ainsi, XVI est l'écriture valide du nombre \(16\), VIX non.

⚠ La règle n°5 autorise toutefois certaines entorses à cette règle.

3. Notation additive

Dans le cas de base, les valeurs des symboles sont additionnées.

Ainsi LXXIII représente \(50+10+10+1+1+1=73\).

4. Répétitions

Le symbole M peut être répété autant de fois que nécessaire.

Tous les autres symboles ne peuvent pas être répétés plus de 3 fois (inclus).

Ainsi, MMMMVI (\(4\,006\)) est une écriture valide, MMMMIIIIII non.

🧐 Cette règle a été fixée au Moyen-Âge. L'écriture MMMMIIIIII était valide dans l'Antiquité !

5. Notation soustractive

Afin d'éviter les répétitions interdites, on s'autorise des entorses à la règle n°2.

On peut ainsi faire précéder les symboles :

  • X et V par un unique symbole I,
  • C et L par un unique symbole X,
  • M et D par un unique symbole C.

Dans ces cas, la valeur qui précède est soustraite à la valeur précédée.

On a donc les correspondances suivantes :

Symboles Valeurs
IV \(4\)
IX \(9\)
XL \(40\)
... ...

Ainsi, MCMXLI représente \(1\,000+900+40+1=1\,941\).

La fonction pour convertir

Écrire la fonction romain qui prend en argument un nombre entier strictement positif valeur et renvoie son écriture en chiffres romains.

Exemples
🐍 Console Python
>>> romain(4)
'IV'
>>> romain(5)
'V'
>>> romain(6)
'VI'
>>> romain(5042)
'MMMMMXLII'

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013.129300.128203Cy1-{ê]/wi_}qP+r%» 79fI;g2RçàE(Ohz)îpnD0ldT,*4ALkéUebmc:35a«=Xo[.8tV6sSMèu?xv050S0$0^0-0m0R0{0v0)0R0-0{0{0/010^0m0N010406050{0 0(0(0-0s0e040|0;0R0 1j0;0O0v020-0(0N0A0v0D0$1t0s0p0 0$0{050k1q1s1u1w1o0N04051#1U1(0k1#1o0S0m121b1d1f1h0J0m0B0J0R1_0J0^1m05160%0R0$1;1e1g011^1`1|1`0^2224200^0s1$0^0J1b1z0{0N0-0O1h0C01261?010y180$0O1H0$202p2r2w282z242C0(2E040a0v0q0s0;0N0;0{0m1C1E142n0s0s0$0)2Z1U2G0O1$0k2l2/2i2k2j210S2I1h1|0O2B2W201.1:1c272|0m2~0O0;32200N2(1$2-2/3g1p2q1E342x390s1t0R1m0v0f2,3k1n3j2H3m283o3q3s0C3v2r3x2-2{013C0-3r040v0+3G2.1o3J3A1h3M3O0v0W3S3I3k3K3Y3s0,3$3U3(3W3L0;3p3N3s0`3-3y3l1=3B3=3D3P0w3`3V3}3X3 3@3P0@433/453;3?3Z0x4b3z4d3*040f0Q4i3|354e400f3u1V3w3.4j4r4l0f3F4w3H4y4q3n473O0f3R4E3T3{3)4J1m0f3#4N3%4z4I4f4S3,4V4G4Q4Z4m3_4$4P3:4B424,444A4R4m4a4;4c4?4)0f4h4`4X3~4)0C4o504H52400C4v3g4%4.4@0C4D5c4-4k5f4M5i4=4Y594U3i1+3e1U322=0S2k2`3:0)3a2O131/1$3d0$3f3w3$055C145K513X1m0_0X0Y0G0#0D0|3$0v5j4r0;1m0/5#5%2x1l040=3-0v5?5$5o285/0H5M5_1h0(0m4S0Q635}4{5.1m0U5,5~010{2u04021Q0;0^0A0}6g0 6i0A655R015/0L694$5@5^665`1m5|4V5-28601m0x646D6b5/6v3g6y6r6d1m6m6o0d6l6h6j6q571h6t6N4x6x6E6#6B6Z3K6G040,6J3i6L686a6z1h6R6f6X0A0P6T6Y6K6`6s1m6u5=5@6*75046C6?746/0W6=5L6@046%3H6P6!6c6e710A0d706~6-3:6$785?7a5{7x4d6/4n557e6r6M6_6Q7r6~0d7s7E4r7z6w797k7d7j7f61046I7S677l7M7p6|7s0:7Q7w737K767m3T6)7X7(6F7#6;7|6+7*4V7o3K7-6~0Y7R7=7p7U5c7`747D8a6.7#7h807b7^3P7a866n6j0:887;7J8b7@7A847y6,8h3:7G7I7Z7?826O8p7O8r0A0:898w3K8c6(7W8f8C8R8E7#4 8Y4d7L838L6S6~0z8P8v8H8x04777V7B7{8D7F7~8l8(8K6b8q6o0_8Q8:8S8y8@8A8%8X958Z1m5r9c9a8J3w994r916j0z938/3H7C978d8V8I7Y9r6b7G8}6^8)908M6o0z949y8W8=8n5d9h0j3-069N4r0Z1m140y7+3)0y1m2T1t379B7c8l0O1m123N0$0 0s9)0L0*8z7a9,042(1q0R160^9Y3:5)045+9D749m0A9I7_9v7p9U040y3=a24k1m2B1j0$9=8`7T9C8 749{0{0e0(0%1z0$aj5(0l1m9(a76r9{5U5W5Y5!aq7)9^988e6raf0l1^24aC3n9-9/9;aY28a4020B6ja6ataIal0Oanap8$ar04aQ9u6xa|9kaZ049.24a$aH7pa40ga-9j9`a:a=8za}8^au9#1S0 9 0-a1b43Ka40rb87nba04awayaA9_6baf2(0^9;0Oa%5S9|bibkbm5i0k5O5J1)5u0k5w1U0^5ybT2^2:0-23bObR5G1!5Q7p2(0(0n0y0-0Z0$0n0J0+1m1M1O1Q1S0va`5L1+3x323K0-0S0(1D2Y0m1D0v37ah1m1!c3c5c72Z0g1j0^2g040#1E3N0B3=2Y0J2N0v0B0R0;1B1D1)3x1#0I1E3d0;0)0~2#2#b.0Eca2r3N0;0B1R0v0-0 0v0.1L2B0ScY2#c60O2C0m250ub}cWcY1|9:0v2#2(0O0S2(0v2B0v3dc90s2Y0!0v241ac!0N0m0~0)b|c/d7d01A1a0B0s2r140{0Ucb0)0mdpca0!0)d30^c~cHd3ct0^d5dgc!b19:0s1adfb|0Ndicxdlc{1S0?cD1-1/3K2a1{1}1 b)3K2K2B2D1m0c0v0G11dN0m0)blc90O1T6D5Ib)3h5LbN040d0s0!ao0v0 2~1b0J0-0Me72#d=dl2*0~c}120m2#15d602030+0x0A0-0y0y2)0^e40Fd60-0v9.d3bZ240ve29~a0060qcA0se80-b{0v39ayc}1B180m0{eF250*066x0T2rdyeR1deCa#eOez5C0O12ao1jeO1Sdy1q0N0!d3dI25cA0v0!0B9/0ve;25eT0%c}e$be0v0d1Dd=dD2~eO0Reoeq0Advdx9;259$17ec25ddeS0;eU25cXeH0!eJble%be1y0 0{2i17c}fzfbc}eze-dH9;f82ne?e^0m0s1obM5D2/d{5vb%5F334dc4c*c8ca0l1u0O370Bce1%cgf?cjclcnb_1ub{dU1%040_cA1a0-e@0Kd09:0^0g0i2i25eW1|0{d5e6c^d;2Zc,c}5Nf*aK5X5Z0/0v0h7H0Q0*0v010}dp6IgH016V01dp6;gHgJ0PgR3!630*gPgW0v0?g(0o1Ud 05fc0v0k1n0bfg0$e-eBah0O2*d@0Od5g(dTg.g:060X2eamd@dp140N0 eYdhfMc-9;1ae@dJd@doc^2r1a0N0e2lcadg1.g|1Dgwb|0{1Ddy2q0s5C9;fMhnd^d6003=c|250Shod60$b{0Rcb190vhAa;gJfr2Y0{2vf3eZeYeY0?0v0|0meCgc0vfO9.1824gg1qeOe625hj2XcadNhH2rdr2Bfxd0hr0J1DdpfR00e{d01ehR1b1eh-cpgthwc+fPfaiffNih1a1p2i1D0B04hMhx0!2,iy0OiAc:0RhL0shNhI1a24hThXhBf4dwh$hR1ahFdNb|0H1c0!dpfW0s0LeS00eBcX0)h~cb1I3=16g{0$h-gbhHe72V9;2(gg2q1agoeYe4ddh60v0(0!hs2#ge2)c^i.1B9}eAiH0-0BdS0v0zhUb.1Be51jgpe4j0h}cq0Rcsdxcv25cycA0^cai=fN0s0 2*ft0viCc+e3dTc0f(5wjYf.c23:f=cid@cb0OcdcEg0j)1Dck2Ycn0}jdibjfjFjc1jg7jXg9cGghjvcX1fh:cI0)0!14e`1Ej6eZhZdngteji1hJ9:1cekc-c+b|et37c^fa25j4iUd3c}2#azjPeGgyed4ddY2c1~2F74aUaWaB6Df)5Ph-k2dl0N0Ng@eGc 0$euemeRaQ1,05bj3x1|1$bNdX1}kJd#7a7G0w0W4_a.b51m0k0kbF018F7i9rkR5Jc~iu0!b10 d5ezkFfykHk=d!kL6r9AkQd iditdyeG6Xkpdy2#e-32h+cakm1|1.i7hO257a1ucu1tex111m090H0f090Uk`0@090L5#hDa~28lJ2llL0$lN04lPlR0U630QlW5#6p0kk.1ok.lgk;2blkd$9d4mlUl2a40t5#l!5 7#gG5Ml73Piglb3NldfYl{3:kIl~k^7#m2lof*lqigeG9}exku1b15mw0(0icwlzkkjWl^1Uk,dVf:4rml2dll7pd(2M2O2Q0|iV0Ndy0qiacCd`5u5s3ig,bz9Vk#l2j,9#fBfw9)9x2.bti*9?b~4FaS7p9{9}bja0m35*l2a9ab1nm~3Kafaha?b96b9{h7ao9)8nm73L1mbvazaXbna3aE04aGk}3)5T5VgBaNa@aPbdadny04luamn4a5m.a!b2nebs6ba4l0nN04ninQaca}m_e/nLbr2.nm9{m`ns4dm4nVnXnFbfa/bHfHbKnf74bpn(8ongnoaxnqkPnxa31m0VnVnJa;m67a0)0f1m03fZfj0!2C2Zmxee0-eg9}bykMbhbC0sbEn-4Abhn_3`mcbPb#jZf-12c1dWj%chf{om39exf~0Nj/oNd@j=cm2O0Gdy0-3d0~1a10g81#0Yb|nX1ae}e hgdJjScYf5cX11mi6bl$cvbll)lO0H0,lSl/l;830{00h#e@hZc kee*e5e70%1uc}ibd30KhBf7371.1Qpg1Q00180vjudy0(n21kc?fm25b.2*dIoiaog~iheOlIj|p0l*l,p563p73gjWk*1#0q1uc~111Ni!nmo~l(pS0H090;hj2}0$0h09lM0^0h0_0z0o0op_l)p{0dq4p}0zp~pW9j2(3dfGamlHo}pQlMp20`lS0+0QlVlX83eeijpPlKpRp2p:p=37p@q111p{p}p q97nigpB9 pD0md5lZqtl%qvl+lQpUl:qppXg8b$oIjY15171904.
Astuce (1)

Penser à un algorithme glouton.

Astuce (2)

On pourra utiliser la liste VALEURS = [..., (4, "IV"), ...] après l'avoir complétée.

Astuce (3)

On pourra utiliser la liste VALEURS = [(1000, "M"), (900, "CM"), (500, "D"), ...] après l'avoir complétée.