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
Python Console Session
>>> 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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.129300.128203.128013qnié4 p0Cts5{Vvb(»A;)gI%wLah:+xT2ce},*fd67m?=]3y_9àçu8U«M[î/è1PlEo-OzXRrSêkD.050Q0L0m0D0f0=0n0i0K0=0D0n0n0V010m0f0j010406050n0%0T0T0D0}0Y040~0@0=0%1j0@0e0i020D0T0j0w0i0|0L1t0}0d0%0L0n050.1q1s1u1w1o0j04051#1U1(0.1#1o0Q0f0r1b1d1f1h1d0e0y0%0D0y0L0^0j0Y0m0E1D0i0E0f0y0E0=270E0m1m05160s0=0L1;1e1g0126282a280m2g2i2e0m0}1$221b1z0n0j0D0e1h0J012k1?010P180L0e1H0L2e2C2E2J2m2M2i2P0T2R040c0i0;0}0@0j0@0n0f1C1E142A0}0}0L0K2:1U2T0e1$0.222 2w2y2x2f0Q2V1@0f0e2O2-2e1.1:1c2l393b0e0@3f2e0j2^1$2}2 3s1p2D1E3h2K3l0}1t0=2e0D252^0P1h030Z0Z0K3m0L2a3k0@0^0:3T1m0i0:1U0D3t3w1n3v2U3y2m3A3C3E3G0L3I013K3M3O3Q3c3T0^2H040i0J3Z3#2E3%2}38013,0D3D1$3F0E3H3J3L3N143_3l3{0X3W0X412|3$1o453*1h484a054c4e3=4g3^3a3`3U0h3W0h4p1V4r3(3x1=3+0@3B493.4d3:4f3@4i4E4k3U0o3W0o4K3s4s3w464w4U4A3?4h3P4!3S3U0R3W0R4*4M4t4P4v4R3-4b3/3;4=4D3R3{0S3W0S4~434,3)5147534T554V574C4Z5a3U0(3W0(5f2~5h4O3i5k4S4x4z4W4B4Y4@5s0^0!3W0!5x444-4u5C544y564X4?4j4_3T0k1m0:0k5P5z4.5l5E5W5H5Y4^3{0:0:5%3Y0.3!4q5g4N5,5D4:5G585r4F3T3}0:405{425y5 5S4/5n4;5q5J660:4m046m5*6e5j6g5V5o5X596l4H6o4J6b5}6d505B6t5F5p5I5Z5?4%6o4)6C4L5~6F3z5-626J5;5K0:4{6o4}6Q4+6r6G6V6h636j6L3U0:5c6o5e6(4 5R6s6,6u6i6K5=6;5u6o5w6_6S6{6+616-6X6x4#3T5M6o5O766E786U7a6~6.705K0J5$047s6q6T4Q7n6I6w657e0J5^7u5`5|6R7k5i795U7A5:7d5!0J3}7S7w7l7y7N5/646k7D6n0J4o7j5Q7L7m7Y6v7P7C7R6z0J6B7I3u1+3q1U3f320Q2y375S4?3e1/1$3p0L3r3$6D1$4?8a2U0f0Q1h3L2}5?3.8h8j7q6l2I2Z0L8p6Y8r2 5|7x4v1m0q0v0C0?0)0|0~8c0i6*2K0@1m0V8K8M2m1l040,8c1o7J8f1E8o018k3w3{3}5V8$6/713|8s2Q8v7Q8*2e6b0i8{8L8A018U0t8c8S1h0T0f5%0k98928~8U0N8R8~0n3}021Q0@0m0w0+9i0%9k0w9a7W1h8U0x9d8Z8Y3u458-0Z8l3U6n8,8i8%8q7e4m0i8t8?7;4l8_3!8|8}9t8 1m918Z9301951m0!999!9b1m9x3s9V7,2m9g1m9o9q0l9n9j9l9s9;9u1m9w8X9~8#9I8(2E3{6z9H9P7#5!4H9N8=9J8w7eaa8`8|9#90a4469%040o9*9A9W9c9e9W9?049^9l11aD9r9+axa19.4MaI8ga69D8)4$8naPaj5!4%ag2!ac6:0^6N419Uao9Yaq5Sas0hav8b9,04aL439:5A2KaBaG0laF9|aHaw9 9X04a29yaq9C9E0^6#abai8@4`8;aZbe9Qbg8y3~ana=9Zb2a`2mas5(5)aNbsa0a?azb3a|b00laGa,5j9va@6dbx0ib9aR0^6?bd8.5K5caY8ubjad5b9Sbn8{a*04bqa;9Was9)bH5Bay8Za_46bD9p9l0{bFb0b/2KbJa3bMbOa85taTa!8/5ubWc75K73a(boaJb)b~bt96atbwbr46b;9/9#b^9q0CbGbM5Sc0b7c2aPba7gbS9K5!5McabYa#cDamb%bpci94cka/cPb4bK3~cr9hb00{cub}cwbIaKc1cnc30e5?7tcEaVc.bhbXbT6lc/cMb?cxa+c%5Bbucmb+b3cp3$c|5jcsb`cvcnc}b5cV9zd3a58pba5@c6cJ8/dlcIc^7edlbma)cOc 2Kb-cTd5a^cX9@b00z0{dbdhcoc)czc+cBbP69dmdr5!dQdqcF5?8+c{b(b*439#as6Pdcc(bAb=dDaCb00qdId$a=b66)cAdjdP9G3F9Cc;6;9M9Odn6Z9GdZdwd*d0cRdA9-bBby01d90w0zd;c$e9b dLd_dNd{c43Taad~aUbfetc?cb6yb#dvcgd#2~d%ck5`em8Tedd-9fcYb_eid=eGd@dfb8dOes0:a%eveAdsaXe3dS6Mb#b(0Wc*dJc,5?bce#e46l4{dVe03Tbc6bdgd?4-e;6;bRe@e*f4eze^dsbRe eWerc-72dRdWfhe{ex0:cd6C8~101m140PcT0B3WcT0e0P1m2*1t3aecchdx3+1m0r490L0%0}fF0x0Fe/f1aOff5?cDf6fj7ff9f7f!ducfb30efB1S0%0=160mee468O048QeNaAeP9qeS3%d`9Jba7sfie|g3flbk3|c`9Tf)effr040P4Rf=6f1m2O1j0LfOfHbzcVd76G1m0n0Y0T0s1z0Lgi5j0@fw04fEf`f*8C8E8G8IfFfRdMe:eXfg3|7Fc:ex7Ef#fZgXf(9UcN9Wge0B262igBgt04fK2ifNg-8N9@0y9lf_cq8~f+04gl0fgngNfSeTf2gR8*8+fYg52Hg7bZ3U7SeCg$hi9#g~g:fMgog|9Wf@0^g{d6hkgk0egmhoaMeqg1bP7(g4gWe2ahf$hEg#higc4.f,1qf/0Df;gHeff@0GhtdCg}gugwgyg,gPfTdihCes7@hFg8h.hda#h.hL9#ge2^0mfN0eg?fI042^hQf:h42 8e1)7|0.7~1U0m80ic35300D2h897}861!8!462^0T0Z0P0D100L0Z0E6n1M1O1Q1S0igO7`1,131/460D0Q0T1D2/0f243agg1m1!iKiMiO2:0^1j0m2u040)1E490y4R2/0E2!0i0y0=0@1B1D1)3%1#0_1E3p0@0K0/2=2=it0$242E490@1`2j0D0%0i0*1L2O0Qje2=iN0e2Ph10i0uiE0ijd0i2afM0i2=2^0e0Q2^0i2O0i3piQ0}2/0gjviDjg0j0f0/0KiDjr2i1a0j1A1a0y0}2E140n0NbN0K0fj)240g0KjJ0mjEi~jJi-0mjLjVjf0ihmfN1ajUiDjX0%jZj#jB1S12i`1-iJ5S1^1`1|1~0m0L0Hj=2o292b2dio5S2X2O2Q1m0b0i0?0HjX0f0KhSiQ0e1T9!888!6c8d3Oioe;0J3V55d 8@kQ5^h=5=kV2I7/7!6LkZbm0l0}0ggn0i0%3b1b0E0D0-k:2=kDj#2`0/jD0r8h2j15jv02030X0!0w0D0P0P2_kj0}0i0#jv3FfKjJii2i0ik+i3hSf0h5fUh,c-kQh9bNew9QlwgYc;lB7Ze*lBbm0;i@le0Kk=iC9N0@gxjD1B180f0nll2j0FlrkOh7kQd}lye$3Sl%lCkU0^9Mk#lGl/hh8{0I2Ej=lO1dj~fLfNlf2A0e0rgn1jle1Sj=1q0j0gjJhn2ji@0i0g0yfLm1jSlPlRlYl!5 kP0^eul)fal+mtl-lAmylFdWkQalgbhi0l1DkDj`3ble0=l4l60wj/j;fN2jfC17k^2jmm3lmojtjelof.f:mq9Bl$a$h/bZkQe(hImDm/mClDm/hL9U1yk52w17jDm!lQ0sjDlgl}j lelg3Nm3m50f0}mq0.i77{ikiaimiI3g5jiLjmiP240B1u0e3a0yiU1%iWntiZi#i%iA1uiCkb1%040qi@1a0Dm40`jGfM0m0^0 2w2jlT2a0njLk/jykC2:jojD058e8D8F8H0~0V0i0pbv0k0F0i010+j)9)n|019`01j)aun|n~11o60ia/o3a~2I12oi0M1Ui7n60i0.1n0a0i0l3P3F3Fgg0e2`kF0ejLoikaonop060v2sh01Dj)140j0%lVjGjYh1k0j~gn2.1Dj(jy2EjW21231Ej|1.oz1Dn-iD0n1Dj=2D0}3NfNk5o!kGjv004RjC2j0Qo#jMiC0=bN190io:hxn~mS2/0n2ImglWlVlV120i0~0fj~nP0in1fK182inT1qlek/2jm40}oXi~jYjtoyh1jnp12j2022oL1b2j0e00m8jG1ejM1b1epli)n*o,jnn2pQpS0no=pV1p2w1D0y04o o-0g2|p/1_3~n}0=o~0}p0o{1a2ip5p9o;mhj:pejM1ao^jXiD0t1c0gj)na0x9N00ov0%0KpzbN1I4R16oy0LplnOo`k:2,fN2^nT2D1an#lVk-jSoJ0i0T0gpN2=nR2_jyqn1Bi2lh1_kh0npl0zp6it1Bk.1jn$k-qCpyi*0=i,j;i/2ji=i@0m24qrp+0}qph|jDp?jnk,ka1+f 7~8YranpnDiYkFbNfzf@iV5Snsrf1Di!2/i%0+qP23qRq@qO1jnKr8ini}nUq*jd1fpoi 0K0g14m71EqIlWpbj%n*k pD1afM1c8hpI3bnQ2M2;pQpLpVpdjD2=gyqplmn/3O46kf1{1}1 0Y252b2q2c2Sg(1mg*2N92njkNplrCj#0j0j3PlmjF3:lbl{1RiEnLf.3%2akMk_5jr@khr`r|2pkps0b3bu0S0h75hpb3f@0.0.h cQ97a:d$s6143~pT0gg:0%jLlgr;sq5Bssr_20svko2rsyefbus58ej)0Kp*j=lm9|pIj=2=l}3fpj24rW2a1.2OmYgs2K1ui.1tkj0H1m090t0:090NsB0(090x8Ko?t42mt622t8kktbtdtf980ktj8KaHso1ososXmZsr2Ekgs#r{knr~kqeH5%thsJ01f@0A8KtnsK6otws-kNjEp+mhsTsV8L4?r?tHr^1~s$tLsxkr5jastQ9!sO89s/s;pWi2kjjymZ15u20T0 i:s|pDr7tB1UsmkcnqsZt.stpMo(s%tMs*46kt8t1m0;o%i_kI7|7`3ui7m-fV0XkRgV9QuEkWe)dWuIk!6 c;uMbmh_fs3:fvfxgp47fAi1lQmXfFeFt@g.nafPiFhAgQuD8:kSlzbZuEhcuKuP8:m`8@u^l@tW47hPm*hStRf@hY2~v1ehf~m,h6u:l(kTuHl?kX5auEl:uOu~l?h^fq1mgghzhZ9Wg~h0h2uXdBv9hv04gvgxgzv6gEgGsEefg~n;gL8JvB1mu-5~g0a7c-uEmuvhu@mBu`vpafl;uLmym}hNgj04s@glv68PtRhll vvvD8~sGsIhUhOg hxh1v|f hBvXl/m|uGv$m?bie*uEaXv+u{a%c{eDgIg/v{v@f^v_fJwqw15StTwtw3hyi5mrh7uEe?mvwgbbmzv$e`wjvpe~mGg$vEi2v4hTvMf?1mhXwzvGh%gAwwgC1m0Owzv=hxtV9#0K7F03m2mK0g2P2:u3pXk{0mk}1SwCuCluwaf5wHv,bVv(vibVwNxbv0uSi115h}wzwThRwVu.sNnkkJil0rr9no3frenyw{3lkjnB0jxxnuc-nG2#0?j=0D3p0/1a0UnL1#0CiDvzpCp90%mbmdoUmgmijd0Hm19#tpi/hSts04tc0otv98tyb=0n00pdm4pbjFrOl`k.k:0s1ujD23jJ0`o;mk3a1.1Qy01Q00180iq)j=0Tm*1kjwmN2jit2`hnw@gnoBpUlex*rwx-tax/tu0Ntwx@3sr7iH1#0;1ujE0H1Nqev1x+tryCtc090@pB3_0p09t90m0p0q0z0M0My$kky(0ly;y*0zy+yHd62^3p0g0ngl2jyzt7yBtt0Rtf0X0ktitkb=k`pWz1tqz3yDyXyZ4Ey#y%y)y+y-za9/pTylf/yn0fjLtmzex,t9ttteyFx?zq3$yJxuxtrb15171904.
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.