ตัวถอดรหัสตัวเลขโรมัน: Ruby

Sep 10 2020

เอาล่ะฉันทำงานกับความท้าทายในการเขียนโค้ดนี้มาระยะหนึ่งแล้วและฉันเดาว่าถึงเวลาแล้วที่ฉันจะต้องยกธง ช่วยด้วย!

งานของฉันคือสร้างฟังก์ชันที่ใช้ตัวเลขโรมันเป็นอาร์กิวเมนต์และส่งคืนค่าเป็นเลขจำนวนเต็มทศนิยม

จนถึงตอนนี้ฉันได้สร้างแฮชแมปตัวเลขกับค่าตัวเลขเรียบร้อยแล้ว ฉันได้สร้างอาร์เรย์ว่างroman_noเพื่อส่งคู่คีย์ / ค่าผ่าน

สิ่งที่ฉันกำลังดิ้นรนคือการเขียนสำนวน ด้านล่างนี้คือรหัสเต็ม:

def solution(roman)
 # take a value of a roman numeral 
 roman_numeral =
    {
      1000 => "M", 
      900 => "CM",
      500 => "D",
      400 => "CD",
      100 => "C",
       90 => "XC",
       50 => "L", 
       40 => "XL",
       10 => "X", 
        9 => "IX",
        5 => "V", 
        4 => "IV",
        1 => "I" 
      }

roman_no = Array.new
  
roman_numeral.each do | key, value | 
  while 
    "#{roman}" >= "#{key}"
      += roman_no 
    "#{roman}" -= "#{key}"
    end
  
return roman_no

  
 
solution('XXI')

ฉันจะเขียนอาร์กิวเมนต์ที่จะรับค่าจากroman_numeralและส่งคืนส่วนตัวนับจำนวนได้อย่างไร

ตัวอย่างเช่น:

solution('XXI') # should return 21

คำตอบ

3 max Sep 10 2020 at 13:15
def solution(roman)
  mapping = {
     "M"=>1000,
     "D"=>500,
     "C"=>100,
     "L"=>50,
     "X"=>10,
     "V"=>5,
     "I"=>1
  }
  # split string into characters
  roman.chars.map do |l|
    mapping[l] # replace character with integer value
  end
  .compact # removes potential nils caused by  invalid chars
  # Splits array into chunks so that we can handle numerals such as IIX
  .chunk_while do |i,j|
    i <= j #
  end
  # each chunk will be an array like [10, 10, 100] or [1, 1, 1, 1]
  .map do |chunk| 
    if chunk.first < chunk.last
      chunk.reverse.inject(:-) # handles numerals such as IIX with subtraction
    else
      chunk.sum # chunk is just a list of numerals such as III
    end
  end
  .sum # sums everything up
end