現今世界上大多數人使用阿拉伯數字(0–9)。 但如果你回到兩千年前,你會發現大多數歐洲人使用的是羅馬數字。
要寫出一個羅馬數字,我們使用下列拉丁字母,每個字母都有對應的值:
| M | D | C | L | X | V | I |
|---|---|---|---|---|---|---|
| 1000 | 500 | 100 | 50 | 10 | 5 | 1 |
羅馬數字是這些字母組成的序列,它的值就是各字母值的總和。
例如,XVIII 的值是 18(10 + 5 + 1 + 1 + 1 = 18)。
不過有一條規則讓事情變得比較複雜,那就是同一個字母不能連續使用超過三次。
這表示我們不能用看似自然的 IIII 來表示 4 這樣的數字。
遇到這些數字時,我們改用在兩個字母之間做減法的方式。
所以我們不把 4 想成 1 + 1 + 1 + 1,而是想成 5 - 1。
而且對我們現代人的思維來說有點容易搞混的是,我們會把比較小的數字寫在前面。
這只適用於以下情況:4(IV)、9(IX)、40(XL)、90(XC)、400(CD)和 900(CM)。
羅馬數字中順序很重要! 字母(以及上面的特殊組合)必須由左至右按值遞減的順序排列。
以下是一些例子:
105 => CV
---- => --
100 => C
+ 5 => V
106 => CVI
---- => --
100 => C
+ 5 => V
+ 1 => I
104 => CIV
---- => ---
100 => C
+ 4 => IV
還有一個更複雜的例子:
1996 => MCMXCVI
----- => -------
1000 => M
+ 900 => CM
+ 90 => XC
+ 5 => V
+ 1 => I
你的任務是把數字從阿拉伯數字轉換成羅馬數字。
這項練習只關注傳統羅馬數字,其中最大的數字是 MMMCMXCIX(也就是 3,999)。
在阿拉伯數字和羅馬數字之間互相轉換有很多不同的方法。 我們建議先採用直觀的做法,熟悉羅馬數字的概念,然後再尋找更有效率的方法。
記得在最後看看我們的深入探索影片,探索你可以採用的各種不同做法!
在這道練習中,你需要支援兩種不同的方式來呼叫stringify這個詞:
roman屬性(例如stringify.roman 3999)roman屬性(例如stringify 3999)除了attr之外,attrs函式也很有用:它會把該次函式呼叫的所有屬性以字典的形式回傳。
請注意,這兩個函式都具有破壞性!
Arturo 的實作使用了一個「屬性表」。
attrs會在取回屬性之後,明確清空該表。attr則會把屬性從表中移除(「pop」)。舉例來說:
showAttributes: function [x][
print attr 'question
print attrs
print attrs
]
showAttributes .question:"6 * 9" .answer:42 'arg
輸出:
6 * 9
[answer:42]
[]
每經過一步,都可以看到屬性字典在縮小。
結論:請注意,屬性只能取用一次。 如果你之後還需要用到屬性,請在函式開頭就先把它們保存下來。