Decoder für römische Ziffern: Ruby

Sep 10 2020

Okay, ich arbeite schon seit einiger Zeit an dieser Codierungsherausforderung und ich denke, es ist offiziell Zeit für mich, die Flagge zu hissen. Hilfe!

Meine Aufgabe ist es, eine Funktion zu erstellen, die eine römische Ziffer als Argument verwendet und ihren Wert als numerische Dezimalzahl zurückgibt.

Bisher habe ich erfolgreich einen Hash erstellt, der die Zahlen seinen numerischen Werten zuordnet. Ich habe auch ein leeres Array erstellt roman_no, um das Schlüssel / Wert-Paar weiterzuleiten.

Ich habe Probleme damit, den Ausdruck zu schreiben. Unten ist der vollständige Code:

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

Wie kann ich ein Argument schreiben, das den Wert von roman_numeralseinem Nummerngegenstück übernimmt und dieses zurückgibt?

zum Beispiel:

solution('XXI') # should return 21

Antworten

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