Kronogrami
Naloga
Veliko latinskih napisov, ki obeležujejo kak pomemben dogodek, je napisanih v obliki kronograma: če seštejemo vrednosti črk, ki predstavljajo tudi rimske številke (I=1, V=5, X=10, L=50, C=100, D=500, M=1000), dajo letnico dogodka.
Tako, recimo, napis na cerkvi sv. Jakoba v Opatiji, CVIVS IN HOC RENOVATA LOCO PIA FVLGET IMAGO SIS CVSTOS POPVLI SANCTE IACOBE TVI, da vsoto 1793, ko je bila cerkev prenovljena (o čemer govori napis).
Pri tem obravnavamo vsak znak posebej: v besedil EXCELSIS bi prebrali X+C+L+I = 10+100+50+1 = 161 in ne XC + L + I = 90 + 50 + 1 = 141.
Napiši program, ki izračuna letnico za podani niz.
Naloga je lahka, vendar se bo izkazala še za poučno, ko jo bomo znali rešiti učinkoviteje kot zdaj.
Rešitev
Takole znamo
Prva rešitev je tisto, kar bi morali znati res vsi. Kdor ni, naj resno pljune v roke, dokler še ni prepozno.
(Ob tem se je marsikdo, ki že zna kak drug jezik, vprašal, ali Python nima stavka switch
. Nima ga, vendar ga v resnici niti ne pogrešamo, saj (skoraj) vedno obstaja lepša rešitev, za katero ga ne potrebujemo.)
Lepša rešitev, ki še ne presega tega, kar smo se učili pri tem predmetu, dela takole: vzame seznam parov (črka, vrednost); za vsako črko prešteje, kolikokrat se pojavi v nizu in k vsoti prišteje tolikokrat vrednost znaka. Če se, recimo, pojavijo trije znaki L, prišteje 3*50.
Takole bomo znali ... vsak čas
Ko se bomo (kmalu, kmalu, ne bodite nestrpni) naučili delati s slovarji, bomo lahko nalogo rešili takole
Takole bomo znali decembra
Tule sta le gornji različici povedani hitrejše. Varianta s terkami:Zabavnejše rešitve
Tole pravzaprav še ne presega našega znanja: v nizu zamenjamo vse znake V s petimi Iji, vse znake X z desetimi Iji... in tako naprej in na koncu vse znake M s 1000 Iji, ter preštejemo, koliko Ijev imamo.
Zmagovalna rešitev
Od vseh rešitev, ki sem jih napisal, mi je najbolj všeč tale. Kratka je in jedrnata, ne uporablja informacije o tem, da je V vredna 5 in tako naprej, poleg tega pa ima zelo lep argument v funkcijimap
. Lepotica, res.