Chiffres romains (2)

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\).

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

Exemples
>>> romain(4)
'IV'
>>> romain(5)
'V'
>>> romain(6)
'VI'
>>> romain(4042)
'MMMMXLII'
###(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 : 10/10
.128013.128203:LpM%(40zîed3; 1E}Vo5_Aên)h]6,qc[yCu»vXà8i2+DxmsU7=«wlSIatf-9O{Rrg.çT*é?Pkbè/050n0m0+0*0R0%0X0q0H0%0*0X0X0!010+0R0e010406050X0L0W0W0*0=0J040(0v0%0L1i0v0A0q020*0W0e0p0q0;0m1s0=0G0L0m0X05111p1r1t1v1n0e041T1!051%111%1)1!1n0n0R0N1a1c1e1g0C0R0?0C0%1`0C0+1l05150 0%0m1=1d1f011_1{1}1{0+2325210+0 0v0n1v220=1#0+0C1a1y0X0e0*0A1g0S01271@010,170m0A1G0m212v2x2C292F252I0W2K040a0q0}0=0v0e0v0X0R1B1D132t0=0=0m0H2)1T2M0A1#112r2^0+2p2o2q0n2O1g1}0A2H2$211/1;1b28320R340A2l1:210e2.1#2?2^3m1o2w1D3a2D3f0=1s0%1l0q0r2=3q1m3p2N3s293u3w3y0S3B2x3D2?31013I0*3x040q0o3M2@1n3P3G1g3S3U0q0i3Y3O3q3Q3(3y0w3,3!3.3$3R0v3v3T3y0E3?3E3r1?3H3{3J3V0Z403#433%453}3V0Q493^4b3`3|3)0.4h3F4j3:040r0j4o423b4k460r3A1U3C3@4p4x4r0r3L4C3N4E4w3t4d3U0r3X4K3Z413/4P1l0r3+4T3-4F4O4l4Y3=4#4M4W4)4s3 4,4V3_4H484=4a4G4X4s4g4`4i4|4/0r4n504%444/0S4u564N58460S4B3m4-4@4}0S4J5i4?4q5l4S5o4{4(5f4!3o1*3k1T382{0n2 3Q0H2l2U121:1#3j0m3l3C3,055H135P573%1l0u0y0d0s0Y0;0(3,0q5p4x0v1l0!5*5,2D1k040I3?0q5{5+5u295@0h5R5~1g0W0R4Y0j6862515?1l0F5;63010X2A04010f016a5W015@0B6e4,5|5}6b5 1l614#5=29651l0.696B6g5@6t3m6w6p6i1l010K6m6o5d1g6r6L4D6v6C6W6z6U3Q6E040w6H3o6J6d6f6x1g6P6k0U6n6I6=6q1l6s5`5|6#6}046A6.6|6*0i6-5Q6/046Y3N6N6V6h6j6R6_6(3_6X705{72607m4j6*4t5b766p6K6;6O7j0K6`7y7h7o6u717c757b7766046G7t4x7A4#7g3Q6@010O7E7S6c046 7J7q7L7$6D7P6,7-6$7d7B7h7Y0d7F7N7z6~7e3Z6!7,6{6p787x7|7H6:7V727Y0O7`7;737)5i816|7s837h7v863N7r896M8b7j0O7{8q7c8h6Z7K8k6%8m6)7P557G3Q7U8t6g7Y0)8w8f7I8i8C7}748f6*4+8J7n8s3C7W3_7Y0u8x2@8r7(7 1m8j8V7M8y7O1l5x878K8$7f8u6Q0)8+8R7~7p8(4j8l8!7u7P5h8|8#7?8a8N7j0)8,5V888/4v8}040D3?065j4j0~1l130,8f0$3y8f0A0,1l2Z1s3d948W8F4@1l0N3T0m0L0=9L0B0c96720A9H1R0L0%150+7@3Q5.045:9h6|7Y9l068=7h9x040,3{9+9O042H1i0m9U9N988~2@974G1l0X0J0W2k259~4j0v9C049K9:6p9!045Z5#5%5)a57T1l9X7*6va92D9`0$1_agan7hap9Q259Tah5-1l020?0+0p9/8M6|apa10Ra39Lay8TaAaA9Z9P9RaMaH9,1l0-aU8%a*a00Aa2a4a%a(8UaI9#1p9(0*9*a.3_9-0Ta=8 6gapacae1y0m9Y6g9`2.0+9T0AaN3tb09%9)40115T5O1$5A115C1T0+5EbB2}2_2k2m2{0*24bwbz5L1Z9m3Q2.0W0x0,0*0~0m0x0C0o1l1L1N1P1R0qa$5Q1*3D1!0/1D3j0v0H102+2+bV0^1C0q2x3T0v0?1Qb 0L0q0#1K2H0nc62+0W1C2IaZ0q0Mb+c50q1}9S0q2+2.0A0n2.0q2H0q3j0R3{2(0{cmb*c80e0R100Hb*cj25190e1z190?0=2x130X0F0q0R0H0RcWb~0{0H0=2(cvb=c)cA0+cCcMc70qaK9S0=19cLb*cO0LcQcScs1R0@1$3D383Q2b1|1~20bQ3_2Q2H2J1l0b0q0s0VcOcYb3cz0A1S6B5N9m3n5Qbv040K0=0{a30q0L341a0C0*0ldF2+0H1t0*2:10cu0N0R2+14cm000*0,0,2/0+dC0Pcm0*c?1t0RbK250qdAb19)060}0v9TdG0*b)0q3faecu1A170R0Xd.260c9@5|0_2x0+0qd}1cd+aL0=0qd(5H0A0Na31iej1Red1p0e0{c)c^26d_0q0{0?9Rek1a26d 0 cue8a}0q0K1CdMc/34ej0%00c%c)blcu9I16dK26cJd~0ve0260*c6d;brb3e9a(1xc~2|16cue(eIcud(egc@d`el1Ceo0=eq1nbu5I2^dt5BbO1(04b;cx9Sede-1e0Rcx2Z0H0{13er1De21}e5a_cpb*38e4dp199S1bdTaZ0A3419dY3dfzd~262w19eW0Rcu2+2k0L1b265S5Id71~2d1 2L6|aDaFbg6Bf95U0@0qfhcS0e0e0m0%d/cw0mdZdVd}ay1-059%3D1}1#bvf%2cdaf+849c0Z0i4 aV6p9-1111bo7.677a8qf;5Ocv0Xed0{aK0LcCd(f#dL4jd8f)db727v5Rgv7d1a00escDee0L0va2fy2+egfB2%b~fF1}1/2He$aB29d,2r1sd$0V1l090h0r090Fgi0Q090B5*2wej72g/0Cg;0mg?04g^g`0F680jg 5*0p1Tg91ng9gFe%gHf(gedc9b4Yg}gq1g9-0g5*g-649chegNdxgxgzgBgD5+gb3_gIhrgL7Phvf:dxcW0HgRgygT2.gy26dL14d$0q0W0z2Tcp1:fC1Cd311hk1Tg71.1:gcd92egf7hde2S2U2W0(c(1jed0}0J2r1C5Rfc5y3odx729`9z9B9Dav3t9G04e!am9aaw9Mitbp04f1a{9ea67(b,4L9^3/bqb2b4gl7h9-b9a8906k9?iG3_9`9|iAbaaW1laYa!in6y9giLiH04bdaff/i*b6akisa?bb5Y5!5$5(a#96iT4q1l1PgWfIiKi@6|iNhw3Ra+eij9gngpb5j0a^a`i~a~i+izjd5/j9aJa,iXiP6ghyjqi!a_aZjt8;a}a@h!e:j5iYgm1lb8jxi,adi.jo040`jMj2gXjHa8hB010H0r1l032t0AeQ0{2I2)fOdMcSdPh!bhf,9#eYbnjgaaiq9$iJbtih5zbM5CbP0)0%hHc5fmcx2$2%bLfOe_9Q1725ej0*eo0HdD2*cY2)cgcuhn040:iz0c0qi-bf0t1Tdxf?0Kh(e,f`fp0CfQ2$eH0{2xce3d19egb)gydpfOeU3{cth$c6h25H9T190n00dEh.2:dpks0mf?k6k8f g1ed3d1/2v2He5ke2+k(d_c)eTb*k)cOb*ku0hizcWkA25h0gOcp2xkT00k!fVeW0ve4fxedcUehc^0Xh=g51!0U0m0e0Le42Xia0Cb~0o0@0ZcWc;l4k*fzk+kqk;e`b*0X1Cedg0d!2:gCk+lldWloh$00kSepkXlv1b0{lyf@b=fjcpePfob@frdCe#2%b+d4h`39hpgdh~hs4xi1dg2V0qi5c)0ei8lIicds5Aifdwfaa@0U0)0K0/0xari{aui:aijpj{7%0:j?gggs8p8-7ciEju9;7j6Ti%7=8:jY6*6GmKmb7%mN3ViQ6RmRiwi(mUhQ1l6,mY8.m#jY7Y7lmS73m,6g85m:mMj97Y0Km^m*mTmH8nhDm~8D04m=m%7#m_8Lj6mI7Qn98Vnc9i6Q7!9l8.m{8_6+nk9nnmmP6Q8enfa7m$m|7P79i}mE298cnAn4m`n68G67nHmB4x8cnq7cnsni8IiBiunx7C918QnBi)nhn7m.nRn,7X7j93n*nXn-048{8^nln09jn?nMngiFjl3_gMn*n$7^9j9?8.kC4,9v4xijg0ilm$m_9F9He*e#9L8@mLiZiyjs9Vm#e=jYapjFj nIhxmDnS2D9=nOiU1liWjMi#jBnrjMlgi/n:i;1li?jIa 04mtmvmxi`atn/o3a(ii1laE2GjMjnoD019-aQaSiOnDotoOo*80eMo4jho=oG299-a;oNjzi$a|eMjEj~bso?b7o{oz1lo#mwmyo)n*5_oljyjjn*9sazo-j}j_jMoBpg5ogObxk3fe1!k^bV1A0q0+d_d$9|lGeD0=fseFeU1Rcyedd}cJ2fkIb?0HkLcp0{f{cskYd*f5g$2*26i9ibfu1ifwdBckf|d/0AhXedfR0q0?j+ew3Te4e6d~fne gRdq1Ml2b*p=fDfOp_lJ1D0Afn1o2|1C0?04d(pOc~cDkT2xeD0?fAfQ2ZcR1Gg;dp2=qu0Aqwlzd5h{3_0*0nceqrj-3fd$1l1Z3QqVqX2(dp0-1i0+2h040sfk3j10190|m5ff0db*oO19euewaZlReAeCe-0VeFh4eXh6b3h8g@0h0wg{hehg7V0XeVi6eofycwfvqbfydE260 1tculJc)0klZeEk}0R1PecgUl.k7pLed0Wbr1jcnl70qbV2:c^j(cJ0=0AcCh2jYh5h7h9hbri68rk3mqRbP0}1tcv0V1Mlar%rbr)rf090vf5330m0:09g=0+0:0u0)0t0ts5h8s70Ksgs90)sar.8%2.3jl@a1f!6gr(rdr*0h0Eg{0o0jg~li6Mj/gTra2(rcg=r~s0a3s2s4s6s8sascsC8%gSrO9(rQ0Rr#r?sGg:surfhcrjsT3Nr:fd0N3Dbz14161804.
Astuce (1)

Penser à un algorithme glouton.

Astuce (2)

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