學習軌道
/
Arturo
Arturo
/
練習
/
羅馬數字
羅馬數字

羅馬數字

中等

簡介

現今世界上大多數人使用阿拉伯數字(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)。

Note

在阿拉伯數字和羅馬數字之間互相轉換有很多不同的方法。 我們建議先採用直觀的做法,熟悉羅馬數字的概念,然後再尋找更有效率的方法。

記得在最後看看我們的深入探索影片,探索你可以採用的各種不同做法!

Arturo 的說明

在這道練習中,你需要支援兩種不同的方式來呼叫stringify這個詞:

  1. 使用roman屬性(例如stringify.roman 3999)
  2. 不使用roman屬性(例如stringify 3999)

想了解更多資訊,請參閱屬性文件,以及attr文件。

Caution

除了attr之外,attrs函式也很有用:它會把該次函式呼叫的所有屬性以字典的形式回傳。

請注意,這兩個函式都具有破壞性!

Arturo 的實作使用了一個「屬性表」。

舉例來說:

showAttributes: function [x][
    print attr 'question
    print attrs
    print attrs
]

showAttributes .question:"6 * 9" .answer:42 'arg

輸出:

6 * 9
[answer:42]
[]

每經過一步,都可以看到屬性字典在縮小。

結論:請注意,屬性只能取用一次。 如果你之後還需要用到屬性,請在函式開頭就先把它們保存下來。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Arturo Exercism

準備好開始 羅馬數字 了嗎?

註冊 Exercism,透過 79 個練習 和真人引導來學習並精通 Arturo,全部免費。

深入探索 羅馬數字!

探索這個棘手練習的各種不同解法,從遞迴到查表法,還有利用混合進位制的解法,以及 Common Lisp 一些投機取巧的簡單做法。