Entero A Romano
Entero A romano
Este problema consisten en dado un numero regresar un string que sea su representacion en numero romano de dicho numero
Solucion
# @param {Integer} num
# @return {String}
def int_to_roman(num)
u = {0=>"", 1=>"I", 2=>"II", 3=>"III", 4=>"IV", 5=>"V", 6=>"VI", 7=>"VII", 8=>"VIII", 9=>"IX"}
d = {0=>"", 1=>"X", 2=>"XX", 3=>"XXX", 4=>"XL", 5=>"L", 6=>"LX", 7=>"LXX", 8=>"LXXX", 9=>"XC"}
c = {0=>"", 1=>"C", 2=>"CC", 3=>"CCC", 4=>"CD", 5=>"D", 6=>"DC", 7=>"DCC", 8=>"DCCC", 9=>"CM"}
m = {0=>"", 1=>"M", 2=>"MM", 3=>"MMM"}
mm = num /1000
cc = (num%1000) /100
dd = (num%100) /10
uu = (num%10) /1
return m[mm]+c[cc]+d[dd]+u[uu]
end
Los limites dados son que ningun numero superara los 3999.
Este programa crea un hashmap para los unidades, decenas, centenas y milesimas, luego divide el numero por el indice de su equivalente en el hashmap. Esta version esta en el top ~50% en cuanto a velocidad y ~70% en cuanto a memoria, luego me di cuenta que no era necesario un hashmap y se podia usar una lista cualquiera, pues al final cada numero es equivalente a su poscicion.
# @param {Integer} num
# @return {String}
def int_to_roman(num)
u = ["","I","II","III","IV","V","VI","VII","VIII","IX"]
d = ["","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"]
c = ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"]
m = ["","M","MM","MMM"]
mm = num /1000
cc = (num%1000) /100
dd = (num%100) /10
uu = (num%10) /1
return m[mm]+c[cc]+d[dd]+u[uu]
end
Esta version esta en el top 70% de velocidad y 60% en memoria. Aunque esta solucion es correcta la solucion que se debia dar es mas o menos la siguiente:
# @param {Integer} num
# @return {String}
def int_to_roman(num)
ans = []
romans = [
[1000, 'M'], [500, 'D'], [100, 'C'], [50, 'L'], [10, 'X'], [5, 'V'], [1, 'I']
].to_h
base = 1
while num > 0
mod = num % 10
num /= 10
if mod == 4 || mod == 9
ans.concat([romans[(mod + 1) * base], romans[base]])
elsif mod == 5
ans << romans[5 * base]
elsif mod > 5
ans.concat([romans[base]] * (mod % 5)) if mod != 5
ans << romans[5 * base]
else
ans.concat([romans[base]] * (mod % 5)) if mod != 5
end
base *= 10
end
ans.reverse.join
end