iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0

題目:
(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);
}

上一篇
測智商囉~
下一篇
停止逆轉單字
系列文
Codewar 進進出出 JS/Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言