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

.128203.129300.128013]«ik[v8o-)yqxb.I+g=Dmz}TUç?4r*sM97f,{d :»C5hwtcOl0p_PL3(a;ER/àV%eèîSX612éênuA050O0?0W0+0f0Z0H0P0X0Z0+0H0H0v010W0f0#010406050H110x0x0+0F0n040_0k0Z111j0k100P020+0x0#0,0P0.0?1t0F0o110?0H050/1q1s1u1w1o0#04051#1U1(0/1#1o0O0f0i1b1d1f1h1d100u110+0u0?0l0#0n0W0U1D0P0U0f0u0U0Z270U0W1m05160q0Z0?1;1e1g0126282a280W2g2i2e0W0F1$221b1z0H0#0+101h0}012k1?010L180?101H0?2e2C2E2J2m2M2i2P0x2R040c0P0%0F0k0#0k0H0f1C1E142A0F0F0?0X2:1U2T101$0/222 2w2y2x2f0O2V1@0f102O2-2e1.1:1c2l393b100k3f2e0#2^1$2}2 3s1p2D1E3h2K3l0F1t0Z2e0+252^0L1h030$0$0X3m0?2a3k0k0l0|3T1m0P0|1U0+3t3w1n3v2U3y2m3A3C3E3G0?3I013K3M3O3Q3c3T0l2H040P0}3Z3#2E3%2}38013,0+3D1$3F0U3H3J3L3N143_3l3{0)3W0)412|3$1o453*1h484a054c4e3=4g3^3a3`3U0E3W0E4p1V4r3(3x1=3+0k3B493.4d3:4f3@4i4E4k3U0T3W0T4K3s4s3w464w4U4A3?4h3P4!3S3U0{3W0{4*4M4t4P4v4R3-4b3/3;4=4D3R3{0K3W0K4~434,3)5147534T554V574C4Z5a3U0j3W0j5f2~5h4O3i5k4S4x4z4W4B4Y4@5s0l0J3W0J5x444-4u5C544y564X4?4j4_3T0!1m0|0!5P5z4.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.705K0}5$047s6q6T4Q7n6I6w657e0}5^7u5`5|6R7k5i795U7A5:7d5!0}3}7S7w7l7y7N5/646k7D6n0}4o7j5Q7L7m7Y6v7P7C7R6z0}6B7I3u1+3q1U3f320O2y375S4?3e1/1$3p0?3r3$6D1$4?8a2U0f0O1h3L2}5?3.8h8j7q6l2I2Z0?8p6Y8r2 5|7x4v1m0;120(0-0B0.0_8c0P6*2K0k1m0v8K8M2m1l040h8c1o7J8f1E8o018k3w3{3}5V8$6/713|8s2Q8v7Q8*2e6b0P8{8L8A018U0*8c8S1h0x0f5%0!98928~8U0M8R8~0H3}021Q0k0W0,0I9i119k0,9a7W1h8U0m9d8Z8Y3u458-0$8l3U6n8,8i8%8q7e4m0P8t8?7;4l8_3!8|8}9t8 1m918Z9301951m0J999!9b1m9x3s9V7,2m9g1m9o9q0S9n9j9l9s9;9u1m9w8X9~8#9I8(2E3{6z9H9P7#5!4H9N8=9J8w7eaa8`8|9#90a4469%040T9*9A9W9c9e9W9?049^9l0waD9r9+axa19.4MaI8ga69D8)4$8naPaj5!4%ag2!ac6:0l6N419Uao9Yaq5Sas0Eav8b9,04aL439:5A2KaBaG0SaF9|aHaw9 9X04a29yaq9C9E0l6#abai8@4`8;aZbe9Qbg8y3~ana=9Zb2a`2mas5(5)aNbsa0a?azb3a|b00SaGa,5j9va@6dbx0Pb9aR0l6?bd8.5K5caY8ubjad5b9Sbn8{a*04bqa;9Was9)bH5Bay8Za_46bD9p9l0`bFb0b/2KbJa3bMbOa85taTa!8/5ubWc75K73a(boaJb)b~bt96atbwbr46b;9/9#b^9q0(bGbM5Sc0b7c2aPba7gbS9K5!5McabYa#cDamb%bpci94cka/cPb4bK3~cr9hb00`cub}cwbIaKc1cnc3105?7tcEaVc.bhbXbT6lc/cMb?cxa+c%5Bbucmb+b3cp3$c|5jcsb`cvcnc}b5cV9zd3a58pba5@c6cJ8/dlcIc^7edlbma)cOc 2Kb-cTd5a^cX9@b00s0`dbdhcoc)czc+cBbP69dmdr5!dQdqcF5?8+c{b(b*439#as6Pdcc(bAb=dDaCb00;dId$a=b66)cAdjdP9G3F9Cc;6;9M9Odn6Z9GdZdwd*d0cRdA9-bBby01d90,0sd;c$e9b dLd_dNd{c43Taad~aUbfetc?cb6yb#dvcgd#2~d%ck5`em8Tedd-9fcYb_eid=eGd@dfb8dOes0|a%eveAdsaXe3dS6Mb#b(0dc*dJc,5?bce#e46l4{dVe03Tbc6bdgd?4-e;6;bRe@e*f4eze^dsbRe eWerc-72dRdWfhe{ex0|cd6C8~0g1m140LcT0V3WcT100L1m2*1t3aecchdx3+1m0i490?110FfF0m0Qe/f1aOff5?cDf6fj7ff9f7f!ducfb310fB1S110Z160Wee468O048QeNaAeP9qeS3%d`9Jba7sfie|g3flbk3|c`9Tf)effr040L4Rf=6f1m2O1j0?fOfHbzcVd76G1m0H0n0x0q1z0?gi5j0kfw04fEf`f*8C8E8G8IfFfRdMe:eXfg3|7Fc:ex7Ef#fZgXf(9UcN9Wge0V262igBgt04fK2ifNg-8N9@0u9lf_cq8~f+04gl0fgngNfSeTf2gR8*8+fYg52Hg7bZ3U7SeCg$hi9#g~g:fMgog|9Wf@0lg{d6hkgk10gmhoaMeqg1bP7(g4gWe2ahf$hEg#higc4.f,1qf/0+f;gHeff@0thtdCg}gugwgyg,gPfTdihCes7@hFg8h.hda#h.hL9#ge2^0WfN10g?fI042^hQf:h42 8e1)7|0/7~1U0W80ic35300+2h897}861!8!462^0x0$0L0+0g0?0$0U6n1M1O1Q1S0PgO7`1,131/460+0O0x1D2/0f243agg1m1!iKiMiO2:0l1j0W2u040B1E490u4R2/0U2!0P0u0Z0k1B1D1)3%1#0Y1E3p0k0X0@2=2=it0C242E490k1`2j0+110P0e1L2O0Oje2=iN102Ph10P0RiE0Pjd0P2afM0P2=2^100O2^0P2O0P3piQ0F2/0~jviDjg0#0f0@0XiDjr2i1a0#1A1a0u0F2E140H0MbN0X0fj)240~0XjJ0WjEi~jJi-0WjLjVjf0PhmfN1ajUiDjX11jZj#jB1S0ri`1-iJ5S1^1`1|1~0W0?0pj=2o292b2dio5S2X2O2Q1m0a0P0-0pjX0f0XhSiQ101T9!888!6c8d3Oioe;0}3V55d 8@kQ5^h=5=kV2I7/7!6LkZbm0S0F0~gn0P113b1b0U0+0^k:2=kDj#2`0@jD0i8h2j15jv02030)0J0,0+0L0L2_kj0F0P0:jv3FfKjJii2i0Pk+i3hSf0h5fUh,c-kQh9bNew9QlwgYc;lB7Ze*lBbm0%i@le0Xk=iC9N0kgxjD1B180f0Hll2j0QlrkOh7kQd}lye$3Sl%lCkU0l9Mk#lGl/hh8{0A2Ej=lO1dj~fLfNlf2A100ign1jle1Sj=1q0#0~jJhn2ji@0P0~0ufLm1jSlPlRlYl!5 kP0leul)fal+mtl-lAmylFdWkQalgbhi0S1DkDj`3ble0Zl4l60,j/j;fN2jfC17k^2jmm3lmojtjelof.f:mq9Bl$a$h/bZkQe(hImDm/mClDm/hL9U1yk52w17jDm!lQ0qjDlgl}j lelg3Nm3m50f0Fmq0/i77{ikiaimiI3g5jiLjmiP240V1u103a0uiU1%iWntiZi#i%iA1uiCkb1%040;i@1a0+m40yjGfM0W0l0 2w2jlT2a0HjLk/jykC2:jojD058e8D8F8H0_0v0P0Nbv0!0Q0P010Ij)9)n|019`01j)aun|n~0wo60Pa/o3a~2I0roi0z1Ui7n60P0/1n0b0P0S3P3F3Fgg102`kF10jLoikaonop06122sh01Dj)140#11lVjGjYh1k0j~gn2.1Dj(jy2EjW21231Ej|1.oz1Dn-iD0H1Dj=2D0F3NfNk5o!kGjv004RjC2j0Oo#jMiC0ZbN190Po:hxn~mS2/0H2ImglWlVlV0r0P0_0fj~nP0Pn1fK182inT1qlek/2jm40FoXi~jYjtoyh1jnp12j2022oL1b2j1000m8jG1ejM1b1epli)n*o,jnn2pQpS0Ho=pV1p2w1D0u04o o-0~2|p/1_3~n}0Zo~0Fp0o{1a2ip5p9o;mhj:pejM1ao^jXiD0*1c0~j)na0m9N00ov110XpzbN1I4R16oy0?plnOo`k:2,fN2^nT2D1an#lVk-jSoJ0P0x0~pN2=nR2_jyqn1Bi2lh1_kh0Hpl0sp6it1Bk.1jn$k-qCpyi*0Zi,j;i/2ji=i@0W24qrp+0Fqph|jDp?jnk,ka1+f 7~8YranpnDiYkFbNfzf@iV5Snsrf1Di!2/i%0IqP23qRq@qO1jnKr8ini}nUq*jd1fpoi 0X0~14m71EqIlWpbj%n*k pD1afM1c8hpI3bnQ2M2;pQpLpVpdjD2=gyqplmn/3O46kf1{1}1 0n252b2q2c2Sg(1mg*2N92njkNplrCj#0#0#3PlmjF3:lbl{1RiEnLf.3%2akMk_5jr@khr`r|2pkps0b3bu0K0E75hpb3f@0/0/h cQ97a:d$s6143~pT0~g:11jLlgr;sq5Bssr_20svko2rsyefbus58ej)0Xp*j=lm9|pIj=2=l}3fpj24rW2a1.2OmYgs2K1ui.1tkj0p1m090*0|090MsB0j090m8Ko?t42mt622t8kktbtdtf980!tj8KaHso1ososXmZsr2Ekgs#r{knr~kqeH5%thsJ01f@0=8KtnsK6otws-kNjEp+mhsTsV8L4?r?tHr^1~s$tLsxkr5jastQ9!sO89s/s;pWi2kjjymZ15u20x0 i:s|pDr7tB1UsmkcnqsZt.stpMo(s%tMs*46kt8t1m0%o%i_kI7|7`3ui7m-fV0)kRgV9QuEkWe)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%gAwwgC1m0Gwzv=hxtV9#0X7F03m2mK0~2P2:u3pXk{0Wk}1SwCuCluwaf5wHv,bVv(vibVwNxbv0uSi115h}wzwThRwVu.sNnkkJil0ir9no3frenyw{3lkjnB0#xxnuc-nG2#0-j=0+3p0@1a0DnL1#0(iDvzpCp911mbmdoUmgmijd0pm19#tpi/hSts04tc0Ttv98tyb=0H00pdm4pbjFrOl`k.k:0q1ujD23jJ0yo;mk3a1.1Qy01Q00180Pq)j=0xm*1kjwmN2jit2`hnw@gnoBpUlex*rwx-tax/tu0Mtwx@3sr7iH1#0%1ujE0p1Nqev1x+tryCtc090kpB3_0N09t90W0N0;0s0z0zy$kky(0Sy;y*0sy+yHd62^3p0~0Hgl2jyzt7yBtt0{tf0)0!titkb=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.