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
.128203.128013s3_8èufv»Iy 7naêS1me(P4C2V:tw«i]Dç[hE*)6Oo;bcdUgM?/XT0lîàqAp.rL-,}=+zk%{95Rxé050V0v0D0q0G0(0c0n0U0(0q0c0c0@010D0G0-010406050c0h0u0u0q0/0m040s0R0(0h1i0R0p0n020q0u0-0S0n0 0v1s0/0+0h0v0c050!1p1r1t1v1n0-041T1!051%0!1%1)1!1n0V0G0j1a1c1e1g0L0G0X0L0(1`0L0D1l05150T0(0v1=1d1f011_1{1}1{0D2325210D0T0R0V1v220/1#0D0L1a1y0c0-0q0p1g0A01271@010i170v0p1G0v212v2x2C292F252I0u2K040b0n0x0/0R0-0R0c0G1B1D132t0/0/0v0U2)1T2M0p1#0!2r2^0D2p2o2q0V2O1g1}0p2H2$211/1;1b28320G340p2l1:210-2.1#2?2^3m1o2w1D3a2D3f0/1s0(1l0n0t2=3q1m3p2N3s293u3w3y0A3B2x3D2?31013I0q3x040n0d3M2@1n3P3G1g3S3U0n0y3Y3O3q3Q3(3y0~3,3!3.3$3R0R3v3T3y0P3?3E3r1?3H3{3J3V0o403#433%453}3V0f493^4b3`3|3)0}4h3F4j3:040t0%4o423b4k460t3A1U3C3@4p4x4r0t3L4C3N4E4w3t4d3U0t3X4K3Z413/4P1l0t3+4T3-4F4O4l4Y3=4#4M4W4)4s3 4,4V3_4H484=4a4G4X4s4g4`4i4|4/0t4n504%444/0A4u564N58460A4B3m4-4@4}0A4J5i4?4q5l4S5o4{4(5f4!3o1*3k1T382{0V2 3Q0U2l2U121:1#3j0v3l3C3,055H135P573%1l0B0,0:0M0W0 0s3,0n5p4x0R1l0@5*5,2D1k040K3?0n5{5+5u295@0w5R5~1g0u0G4Y0%6862515?1l0=5;63010c2A04010Y016a5W015@0O6e4,5|5}6b5 1l614#5=29651l0}696B6g5@6t3m6w6p6i1l010z6m6o5d1g6r6L4D6v6C6W6z6U3Q6E040~6H3o6J6d6f6x1g6P6k0I6n6I6=6q1l6s5`5|6#6}046A6.6|6*0y6-5Q6/046Y3N6N6V6h6j6R6_6(3_6X705{72607m4j6*4t5b766p6K6;6O7j0z6`7y7h7o6u717c757b7766046G7t4x7A4#7g3Q6@010#7E7S6c046 7J7q7L7$6D7P6,7-6$7d7B7h7Y0:7F7N7z6~7e3Z6!7,6{6p787x7|7H6:7V727Y0#7`7;737)5i816|7s837h7v863N7r896M8b7j0#7{8q7c8h6Z7K8k6%8m6)7P557G3Q7U8t6g7Y0l8w8f7I8i8C7}748f6*4+8J7n8s3C7W3_7Y0B8x2@8r7(7 1m8j8V7M8y7O1l5x878K8$7f8u6Q0l8+8R7~7p8(4j8l8!7u7P5h8|8#7?8a8N7j0l8,5V888/4v8}040H3?065j4j0`1l130i8f0E3y8f0p0i1l2Z1s3d948W8F4@1l0j3T0v0h0/9L0O0C96720p9H1R0h0(150D7@3Q5.045:9h6|7Y9l068=7h9x040i3{9+9O042H1i0v9U9N988~2@974G1l0c0m0u2k259~4j0R9C049K9:6p9!045Z5#5%5)a57T1l9X7*6va92D9`0E1_agan7hap9Q259Tah5-1l020X0D0S9/8M6|apa10Ga39Lay8TaAaA9Z9P9RaMaH9,1l0;aU8%a*a00pa2a4a%a(8UaI9#1p9(0q9*a.3_9-0^a=8 6gapacae1y0v9Y6g9`2.0D9T0paN3tb09%9)400!5T5O1$5A0!5C1T0D5EbB2}2_2k2m2{0q24bwbz5L1Z9m3Q2.0u0e0i0q0`0v0e0L0d1l1L1N1P1R0na$5Q1*3D1!0Q1D3j0R0U0g2+2+bV0J1C0n2x3T0R0X1Qb 0h0n0F1K2H0Vc62+0u1C2IaZ0n0kb+c50n1}9S0n2+2.0p0V2.0n2H0n3j0G3{2(11cmb*c80-0G0g0Ub*cj25190-1z190X0/2x130c0=0n0G0U0GcWb~110U0/2(cvb=c)cA0DcCcMc70naK9S0/19cLb*cO0hcQcScs1R0.1$3D383Q2b1|1~20bQ3_2Q2H2J1l0a0n0M10cOcYb3cz0p1S6B5N9m3n5Qbv040z0/11a30n0h341a0L0q0)dF2+0U1t0q2:0gcu0j0G2+14cm000q0i0i2/0DdC0*cm0qc?1t0GbK250ndAb19)060x0R9TdG0qb)0n3faecu1A170G0cd.260C9@5|0$2x0D0nd}1cd+aL0/0nd(5H0p0ja31iej1Red1p0-11c)c^26d_0n110X9Rek1a26d 0Tcue8a}0n0z1CdMc/34ej0(00c%c)blcu9I16dK26cJd~0Re0260qc6d;brb3e9a(1xc~2|16cue(eIcud(egc@d`el1Ceo0/eq1nbu5I2^dt5BbO1(04b;cx9Sede-1e0Gcx2Z0U1113er1De21}e5a_cpb*38e4dp199S1bdTaZ0p3419dY3dfzd~262w19eW0Gcu2+2k0h1b265S5Id71~2d1 2L6|aDaFbg6Bf95U0.0nfhcS0-0-0v0(d/cw0vdZdVd}ay1-059%3D1}1#bvf%2cdaf+849c0o0y4 aV6p9-0!0!bo7.677a8qf;5Ocv0ced11aK0hcCd(f#dL4jd8f)db727v5Rgv7d1a00escDee0h0Ra2fy2+egfB2%b~fF1}1/2He$aB29d,2r1sd$101l090w0t090=gi0f090O5*2wej72g/0Lg;0vg?04g^g`0=680%g 5*0S1Tg91ng9gFe%gHf(gedc9b4Yg}gq1g9-0{5*g-649chegNdxgxgzgBgD5+gb3_gIhrgL7Phvf:dxcW0UgRgygT2.gy26dL14d$0n0u0r2Tcp1:fC1Cd30!hk1Tg71.1:gcd92egf7hde2S2U2W0sc(1jed0x0m2r1C5Rfc5y3odx729`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.jo040NjMj2gXjHa8hB010U0t1l032t0peQ112I2)fOdMcSdPh!bhf,9#eYbnjgaaiq9$iJbtih5zbM5CbP0l0(hHc5fmcx2$2%bLfOe_9Q1725ej0qeo0UdD2*cY2)cgcuhn040|iz0C0ni-bf0?1Tdxf?0zh(e,f`fp0LfQ2$eH112xce3d19egb)gydpfOeU3{cth$c6h25H9T190V00dEh.2:dpks0vf?k6k8f g1ed3d1/2v2He5ke2+k(d_c)eTb*k)cOb*ku0wizcWkA25h0gOcp2xkT00k!fVeW0Re4fxedcUehc^0ch=g51!0I0v0-0he42Xia0Lb~0d0.0ocWc;l4k*fzk+kqk;e`b*0c1Cedg0d!2:gCk+lldWloh$00kSepkXlv1b11lyf@b=fjcpePfob@frdCe#2%b+d4h`39hpgdh~hs4xi1dg2V0ni5c)0-i8lIicds5Aifdwfaa@0I0l0z0Q0eari{aui:aijpj{7%0|j?gggs8p8-7ciEju9;7j6Ti%7=8:jY6*6GmKmb7%mN3ViQ6RmRiwi(mUhQ1l6,mY8.m#jY7Y7lmS73m,6g85m:mMj97Y0zm^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^bV1A0n0Dd_d$9|lGeD0/fseFeU1Rcyedd}cJ2fkIb?0UkLcp11f{cskYd*f5g$2*26i9ibfu1ifwdBckf|d/0phXedfR0n0Xj+ew3Te4e6d~fne gRdq1Ml2b*p=fDfOp_lJ1D0pfn1o2|1C0X04d(pOc~cDkT2xeD0XfAfQ2ZcR1Gg;dp2=qu0pqwlzd5h{3_0q0Vceqrj-3fd$1l1Z3QqVqX2(dp0;1i0D2h040Mfk3j0g190Zm5ff0:b*oO19euewaZlReAeCe-10eFh4eXh6b3h8g@0w0~g{hehg7V0ceVi6eofycwfvqbfydE260T1tculJc)0_lZeEk}0G1PecgUl.k7pLed0ubr1jcnl70nbV2:c^j(cJ0/0pcCh2jYh5h7h9hbri68rk3mqRbP0x1tcv101Mlar%rbr)rf090Rf5330v0|09g=0D0|0B0l0?0?s5h8s70zsgs90lsar.8%2.3jl@a1f!6gr(rdr*0w0Pg{0d0%g~li6Mj/gTra2(rcg=r~s0a3s2s4s6s8sascsC8%gSrO9(rQ0Gr#r?sGg:surfhcrjsT3Nr:fd0j3Dbz14161804.
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.