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
Kiat Pemilik Anjing yang Bermanfaat: Mengapa Penting untuk Membiarkan Anjing Anda Mengendus di Jalan
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'