Decoder für römische Ziffern: Ruby
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
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