題目:
(6 級) Roman Numerals Decoder
建立一個 function 接收羅馬數字,並轉換成十進位數字回傳。
現代羅馬數字的寫法,是將每個要編碼的十進位數字,從最左邊的數字開始,然後跳過任何 0。
因此,
1990 會寫成 "MCMXC" (1000 = M,900 = CM,90 = XC);
2008 寫成 "MMVIII" (2000 = MM,8 = VIII);
1666 寫成 "MDCLXVI"。
範例:
solution('XXI') 應該回傳 21
幫助:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
Ruby 解法:
def solution(roman)
# 先把 roman 字串拆開成陣列
roman.split("").map { |n|
# 利用 case when 把羅馬數字轉成十進位數字
case n
when "I" then 1
when "V" then 5
when "X" then 10
when "L" then 50
when "C" then 100
when "D" then 500
when "M" then 1000
end
# 最後比對前後兩個數字的大小來做增減並加總
}.reduce {|a, b| a < b ? b - a : a + b}
end
JavaScript 解法:
function solution(roman){
// 先把 roman 字串拆開成陣列,並將結果存入變數 numbers
let numbers = roman.split("").map(n => {
// 利用 case when 把羅馬數字轉成十進位數字
switch (n) {
case "I": return 1; break;
case "V": return 5; break;
case "X": return 10; break;
case "L": return 50; break;
case "C": return 100; break;
case "D": return 500; break;
case "M": return 1000; break;
}
});
// 回傳加總後的結果
return numbers.reduce((sum, n, index) => {
// 比對前後兩個數字的大小來做增減並加總
return n < numbers[index + 1] ? sum - n : sum + n;
}, 0);
}