Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rmcervantes #77

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
33 changes: 33 additions & 0 deletions rmcervantes/roman_numerals.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
class Roman_numerals
def initialize
@arabigos = {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"}
@romanos = {"I"=>1,"V"=>5,"X"=>10,"L"=>50,"C"=>100,"D"=>500,"M"=>1000}
end

def arab_to_rom(in_arabigo)
retorno = ""
@arabigos.each do |map_arabigo, map_romano|
if in_arabigo >= map_arabigo
in_arabigo -= map_arabigo
retorno += map_romano # concatenar romano
redo # volver a ejecutar este bucle
end
end
retorno # retornar resultado
end

def rom_to_arab(in_romano)
retorno = 0
anterior = @romanos[in_romano[0]] # inicia en el primer romano de la cadena
in_romano.each_char { |simbolo|
retorno += @romanos[simbolo]
if @romanos[simbolo] > anterior
# le quita el anterior sumado 2 veces (romano=IV => retorno = 1+5, fix: retorno = (1+5)-1-1)
retorno -= 2 * anterior
end
anterior = @romanos[simbolo]
}
retorno # retornar resultado
end
end
98 changes: 98 additions & 0 deletions rmcervantes/roman_numerals_rspec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
require "rspec"
require File.dirname(__FILE__) + "/roman_numerals.rb"

describe Roman_numerals do
before do
@roman_numerals = Roman_numerals.new
end

describe "Arabigos a Romanos" do
it "que represente un solo simbolo" do
@roman_numerals.arab_to_rom(1).should eq("I")
@roman_numerals.arab_to_rom(5).should eq("V")
@roman_numerals.arab_to_rom(10).should eq("X")
@roman_numerals.arab_to_rom(50).should eq("L")
@roman_numerals.arab_to_rom(100).should eq("C")
@roman_numerals.arab_to_rom(500).should eq("D")
@roman_numerals.arab_to_rom(1000).should eq("M")
end

it "que represente simbolos repetidos" do
@roman_numerals.arab_to_rom(3).should eq("III")
@roman_numerals.arab_to_rom(30).should eq("XXX")
@roman_numerals.arab_to_rom(300).should eq("CCC")
@roman_numerals.arab_to_rom(3000).should eq("MMM")
end

it "que represente diferentes simbolos romanos" do
@roman_numerals.arab_to_rom(7).should eq("VII")
@roman_numerals.arab_to_rom(17).should eq("XVII")
@roman_numerals.arab_to_rom(67).should eq("LXVII")
@roman_numerals.arab_to_rom(367).should eq("CCCLXVII")
@roman_numerals.arab_to_rom(867).should eq("DCCCLXVII")
@roman_numerals.arab_to_rom(3867).should eq("MMMDCCCLXVII")
end

it "que represente conjuntos con resta de simbolos" do
@roman_numerals.arab_to_rom(4).should eq("IV")
@roman_numerals.arab_to_rom(9).should eq("IX")
@roman_numerals.arab_to_rom(40).should eq("XL")
@roman_numerals.arab_to_rom(90).should eq("XC")
@roman_numerals.arab_to_rom(400).should eq("CD")
@roman_numerals.arab_to_rom(900).should eq("CM")
end

it "que represente anios" do
@roman_numerals.arab_to_rom(1492).should eq("MCDXCII")
@roman_numerals.arab_to_rom(1990).should eq("MCMXC")
@roman_numerals.arab_to_rom(3999).should eq("MMMCMXCIX")
@roman_numerals.arab_to_rom(2008).should eq("MMVIII")
end
end

describe "Romanos a Arabigos" do
it "que represente un solo numero" do
@roman_numerals.rom_to_arab("I").should eq(1)
@roman_numerals.rom_to_arab("V").should eq(5)
@roman_numerals.rom_to_arab("X").should eq(10)
@roman_numerals.rom_to_arab("L").should eq(50)
@roman_numerals.rom_to_arab("C").should eq(100)
@roman_numerals.rom_to_arab("D").should eq(500)
@roman_numerals.rom_to_arab("M").should eq(1000)
end

it "en repeticiones" do
@roman_numerals.rom_to_arab("II").should eq(2)
@roman_numerals.rom_to_arab("XXX").should eq(30)
@roman_numerals.rom_to_arab("CC").should eq(200)
@roman_numerals.rom_to_arab("MMM").should eq(3000)
end

it "por union de diferentes simbolos romanos" do
@roman_numerals.rom_to_arab("VI").should eq(6)
@roman_numerals.rom_to_arab("VIII").should eq(8)
@roman_numerals.rom_to_arab("XI").should eq(11)
@roman_numerals.rom_to_arab("XVII").should eq(17)
@roman_numerals.rom_to_arab("LXVII").should eq(67)
@roman_numerals.rom_to_arab("CCLXVII").should eq(267)
@roman_numerals.rom_to_arab("DCCLXVII").should eq(767)
@roman_numerals.rom_to_arab("MMMDCCLXVII").should eq(3767)
end

it "para valores especiales (ex: IV IX XL)" do
@roman_numerals.rom_to_arab("IV").should eq(4)
@roman_numerals.rom_to_arab("IX").should eq(9)
@roman_numerals.rom_to_arab("XL").should eq(40)
@roman_numerals.rom_to_arab("XC").should eq(90)
@roman_numerals.rom_to_arab("CD").should eq(400)
@roman_numerals.rom_to_arab("CM").should eq(900)
end

it "que represente anios" do
@roman_numerals.rom_to_arab("MCDXCII").should eq(1492)
@roman_numerals.rom_to_arab("MCMXC").should eq(1990)
@roman_numerals.rom_to_arab("MMMCMXCIX").should eq(3999)
@roman_numerals.rom_to_arab("MMVIII").should eq(2008)
end
end
end