Ma a világon a legtöbb ember arab számokat használ (0–9). Ha azonban kétezer évet visszautaznál az időben, azt tapasztalnád, hogy a legtöbb európai akkoriban római számokat használt.
Egy római szám leírásához a következő latin betűket használjuk, amelyek mindegyike egy-egy értéket jelöl:
| M | D | C | L | X | V | I |
|---|---|---|---|---|---|---|
| 1000 | 500 | 100 | 50 | 10 | 5 | 1 |
A római szám ezeknek a betűknek a sorozata, az értéke pedig a betűk értékeinek összege.
Például az XVIII értéke 18 (10 + 5 + 1 + 1 + 1 = 18).
Van azonban egy szabály, ami megnehezíti a dolgot: ugyanaz a betű nem szerepelhet egymás után háromnál többször.
Ez azt jelenti, hogy az olyan számokat, mint a 4, nem írhatjuk le a kézenfekvőnek tűnő IIII-gyel.
Helyette ezeknél a számoknál két betű közötti kivonást használunk.
A 4-re tehát nem úgy gondolunk, mint 1 + 1 + 1 + 1, hanem úgy, mint 5 - 1.
És ami a mai gondolkodásunknak kicsit zavaró lehet, a kisebb számot írjuk előre.
Ez csak a következő esetekben érvényes: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) és 900 (CM).
A római számoknál számít a sorrend! A betűket (és a fenti különleges összetételeket) balról jobbra haladva csökkenő érték szerint kell sorrendbe rakni.
Íme néhány példa:
105 => CV
---- => --
100 => C
+ 5 => V
106 => CVI
---- => --
100 => C
+ 5 => V
+ 1 => I
104 => CIV
---- => ---
100 => C
+ 4 => IV
És végül egy összetettebb példa:
1996 => MCMXCVI
----- => -------
1000 => M
+ 900 => CM
+ 90 => XC
+ 5 => V
+ 1 => I
A feladatod, hogy egy számot arab számjegyekből római számjegyekké alakíts.
Ebben a feladatban csak a hagyományos római számjegyekkel foglalkozunk, amelyeknél a legnagyobb szám a MMMCMXCIX (vagyis 3999).
Sok különböző módja van az arab és a római számjegyek közötti átváltásnak. Azt javasoljuk, hogy először egy naiv megközelítéssel ismerkedj meg a római számjegyek fogalmával, és csak utána keress hatékonyabb módszereket.
Feltétlenül nézd meg a végén található mélyelemzés videónkat, hogy megismerd a lehetséges megközelítéseket!
Ehhez a feladathoz a stringify szó két különböző meghívási módját kell támogatnod:
roman attribútummal (pl. stringify.roman 3999)roman attribútum nélkül (pl. stringify 3999)További információért nézd meg az attribútumok dokumentációt, valamint az attr dokumentációt.
Az attr mellett hasznos lehet az attrs függvény is: a függvényhívás összes attribútumát szótárként adja vissza.
Vigyázz, ez a két függvény destruktív hatású!
Az Arturo megvalósítása egy „attribútumtáblát” használ.
attrs kifejezetten kiüríti a táblát, miután lekérte az attribútumokat.attr eltávolítja („kiveszi”) az attribútumot a táblából.Egy példa:
showAttributes: function [x][
print attr 'question
print attrs
print attrs
]
showAttributes .question:"6 * 9" .answer:42 'arg
kimenete
6 * 9
[answer:42]
[]
Mindegyik lépésnél látjuk, ahogy zsugorodik az attribútumszótár.
Következtetés: tartsd észben, hogy az attribútumokat csak egyszer tudod lekérni. Ha később hivatkozni szeretnél rájuk, a függvényeid elején mentsd el őket.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Arturo nyelvet 79 feladat segítségével, valódi emberi mentorálással, mindez ingyen.
Fedezz fel sokféle megoldást erre a trükkös feladatra, a rekurziótól a táblázatalapú kereséseken át egy vegyes számrendszert alkalmazó megoldásig, valamint a Common Lisp némi egyszerű csalásáig.