Decoder Angka Romawi: Ruby

Sep 10 2020

Baiklah, saya telah mengerjakan tantangan pengkodean ini cukup lama dan saya rasa ini adalah waktu resmi bagi saya untuk mengibarkan bendera. Tolong!

Tugas saya adalah membuat fungsi yang menggunakan angka romawi sebagai argumennya dan mengembalikan nilainya sebagai bilangan bulat desimal numerik.

Sejauh ini saya telah berhasil membuat hash yang memetakan angka ke nilai numeriknya. Saya juga membuat array kosong roman_nountuk melewati pasangan kunci / nilai.

Yang saya perjuangkan adalah menulis ekspresi. Berikut kode lengkapnya:

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')

Bagaimana saya bisa menulis argumen yang akan mengambil nilai dari roman_numeraldan mengembalikan bagian bilangannya?

sebagai contoh:

solution('XXI') # should return 21

Jawaban

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