Decodificador de numerais romanos: Ruby
Sep 10 2020
Tudo bem, estou trabalhando neste desafio de codificação há algum tempo e acho que oficialmente é a hora de levantar a bandeira. Socorro!
Minha tarefa é criar uma função que tenha um algarismo romano como argumento e retorne seu valor como um inteiro decimal numérico.
Até agora, criei com sucesso um hash mapeando os números para seus valores numéricos. Também criei uma matriz vazia roman_nopara passar o par chave / valor.
O que estou lutando é para escrever a expressão. Abaixo está o código completo:
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')
Como posso escrever um argumento que obterá o valor de roman_numerale retornará sua contraparte numérica?
por exemplo:
solution('XXI') # should return 21
Respostas
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
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino