diff --git a/rmcervantes/roman_numerals.rb b/rmcervantes/roman_numerals.rb new file mode 100644 index 0000000..7692600 --- /dev/null +++ b/rmcervantes/roman_numerals.rb @@ -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 \ No newline at end of file diff --git a/rmcervantes/roman_numerals_rspec.rb b/rmcervantes/roman_numerals_rspec.rb new file mode 100644 index 0000000..f7989ca --- /dev/null +++ b/rmcervantes/roman_numerals_rspec.rb @@ -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 \ No newline at end of file