› Foros › Off-Topic › Miscelánea
Evidork escribió:Yo he hecho esta pedazo de basura en python, como verás soy un genio de la optimizaciónpero funciona. Mete el numero en romano que quieras al principio en la variable romano ya que lo he hecho ahora con un editor online y no tiene entradas, lo he hecho comparando cadenas. Supongo que esto no te servirá ya que buscarás/te pediran un algoritmo asi optimizado y bonico, pero oye aquí lo tienes
![]()
import string
romano = "MXCIX"
numero = 0
if romano[0] == "M":
numero = numero + 1000
if string.find(romano,"CM",0,len(romano)) != -1:
numero = numero+ 900
else:
if string.find(romano,"DCCC",0,len(romano)) != -1:
numero = numero + 800
else:
if string.find(romano,"DCC",0,len(romano)) != -1:
numero = numero + 700
else:
if string.find(romano,"DC",0,len(romano)) != -1:
numero = numero + 600
else:
if string.find(romano,"CD",0,len(romano)) != -1:
numero = numero + 400
else:
if string.find(romano,"D",0,len(romano)) != -1:
numero = numero + 500
else:
if string.find(romano,"CCC",0,len(romano)) != -1:
numero = numero + 300
else:
if string.find(romano,"CC",0,len(romano)) != -1:
numero = numero + 200
else:
aux = string.find(romano,"C",0,len(romano))
if aux != -1 and romano[aux-1] != "X":
numero = numero + 100
if string.find(romano,"XC",0,len(romano)) != -1:
numero = numero+ 90
else:
if string.find(romano,"LXXX",0,len(romano)) != -1:
numero = numero + 80
else:
if string.find(romano,"LXX",0,len(romano)) != -1:
numero = numero + 70
else:
if string.find(romano,"LX",0,len(romano)) != -1:
numero = numero + 60
else:
if string.find(romano,"XL",0,len(romano)) != -1:
numero = numero + 40
else:
if string.find(romano,"L",0,len(romano)) != -1:
numero = numero + 50
else:
if string.find(romano,"XXX",0,len(romano)) != -1:
numero = numero + 30
else:
if string.find(romano,"XX",0,len(romano)) != -1:
numero = numero + 20
else:
aux = string.find(romano,"X",0,len(romano))
if aux != -1 and romano[aux-1] != "I":
numero = numero + 10
if string.find(romano,"IX",0,len(romano)) != -1:
numero = numero+ 9
else:
if string.find(romano,"VIII",0,len(romano)) != -1:
numero = numero + 8
else:
if string.find(romano,"VII",0,len(romano)) != -1:
numero = numero + 7
else:
if string.find(romano,"VI",0,len(romano)) != -1:
numero = numero + 6
else:
if string.find(romano,"IV",0,len(romano)) != -1:
numero = numero + 4
else:
if string.find(romano,"V",0,len(romano)) != -1:
numero = numero + 5
else:
if string.find(romano,"III",0,len(romano)) != -1:
numero = numero + 3
else:
if string.find(romano,"II",0,len(romano)) != -1:
numero = numero + 2
else:
if string.find(romano,"I",0,len(romano)) != -1:
numero = numero + 1
print numero
Aquí lo he hecho yo y lo puedes compilar http://codepad.org/UUGr21s1/fork
EDIT: Por lo que he visto, no puedes hacerlo con bucles, entonces es como yo te he dicho
Evidork escribió:¿Hola?¿Me se lee? xD Yo lo he hecho aquí arriba sin iteraciones ni bucles en python, supongo que se podrá adaptar a javaxDEvidork escribió:Yo he hecho esta pedazo de basura en python, como verás soy un genio de la optimizaciónpero funciona. Mete el numero en romano que quieras al principio en la variable romano ya que lo he hecho ahora con un editor online y no tiene entradas, lo he hecho comparando cadenas. Supongo que esto no te servirá ya que buscarás/te pediran un algoritmo asi optimizado y bonico, pero oye aquí lo tienes
![]()
import string
romano = "MXCIX"
numero = 0
if romano[0] == "M":
numero = numero + 1000
if string.find(romano,"CM",0,len(romano)) != -1:
numero = numero+ 900
else:
if string.find(romano,"DCCC",0,len(romano)) != -1:
numero = numero + 800
else:
if string.find(romano,"DCC",0,len(romano)) != -1:
numero = numero + 700
else:
if string.find(romano,"DC",0,len(romano)) != -1:
numero = numero + 600
else:
if string.find(romano,"CD",0,len(romano)) != -1:
numero = numero + 400
else:
if string.find(romano,"D",0,len(romano)) != -1:
numero = numero + 500
else:
if string.find(romano,"CCC",0,len(romano)) != -1:
numero = numero + 300
else:
if string.find(romano,"CC",0,len(romano)) != -1:
numero = numero + 200
else:
aux = string.find(romano,"C",0,len(romano))
if aux != -1 and romano[aux-1] != "X":
numero = numero + 100
if string.find(romano,"XC",0,len(romano)) != -1:
numero = numero+ 90
else:
if string.find(romano,"LXXX",0,len(romano)) != -1:
numero = numero + 80
else:
if string.find(romano,"LXX",0,len(romano)) != -1:
numero = numero + 70
else:
if string.find(romano,"LX",0,len(romano)) != -1:
numero = numero + 60
else:
if string.find(romano,"XL",0,len(romano)) != -1:
numero = numero + 40
else:
if string.find(romano,"L",0,len(romano)) != -1:
numero = numero + 50
else:
if string.find(romano,"XXX",0,len(romano)) != -1:
numero = numero + 30
else:
if string.find(romano,"XX",0,len(romano)) != -1:
numero = numero + 20
else:
aux = string.find(romano,"X",0,len(romano))
if aux != -1 and romano[aux-1] != "I":
numero = numero + 10
if string.find(romano,"IX",0,len(romano)) != -1:
numero = numero+ 9
else:
if string.find(romano,"VIII",0,len(romano)) != -1:
numero = numero + 8
else:
if string.find(romano,"VII",0,len(romano)) != -1:
numero = numero + 7
else:
if string.find(romano,"VI",0,len(romano)) != -1:
numero = numero + 6
else:
if string.find(romano,"IV",0,len(romano)) != -1:
numero = numero + 4
else:
if string.find(romano,"V",0,len(romano)) != -1:
numero = numero + 5
else:
if string.find(romano,"III",0,len(romano)) != -1:
numero = numero + 3
else:
if string.find(romano,"II",0,len(romano)) != -1:
numero = numero + 2
else:
if string.find(romano,"I",0,len(romano)) != -1:
numero = numero + 1
print numero
Aquí lo he hecho yo y lo puedes compilar http://codepad.org/UUGr21s1/fork
EDIT: Por lo que he visto, no puedes hacerlo con bucles, entonces es como yo te he dicho
Grender escribió:Ahora en cuanto pueda buscaré el equivalente a find y len en java y lo comprobaré, que no tengo ni idea de los metodos de python xD
import java.util.Scanner;
public class RomanoAArabigo {
public static int NumRoman(String numeroRomano){
int numero = 0, aux=0;
if (numeroRomano.charAt(0) == 'M')
numero = numero + 1000;
if (numeroRomano.indexOf("CM") != -1){
numero = numero+ 900;
}else
if (numeroRomano.indexOf("DCCC") != -1){
numero = numero + 800;
}else
if (numeroRomano.indexOf("DCC") != -1){
numero = numero + 700;
}else
if (numeroRomano.indexOf("DC") != -1){
numero = numero + 600;
}else
if (numeroRomano.indexOf("CD") != -1){
numero = numero + 400;
}else
if (numeroRomano.indexOf("D") != -1){
numero = numero + 500;
}else
if (numeroRomano.indexOf("CCC") != -1){
numero = numero + 300;
}else
if (numeroRomano.indexOf("CC") != -1){
numero = numero + 200;
}else
aux = numeroRomano.indexOf("C");
if (aux != -1 && (numeroRomano.indexOf("I", aux-1)) == -1){
numero = numero + 100;
}
if (numeroRomano.indexOf("XC") != -1){
numero = numero+ 90;
}else
if (numeroRomano.indexOf("LXXX") != -1){
numero = numero + 80;
}else
if (numeroRomano.indexOf("LXX") != -1){
numero = numero + 70;
}else
if (numeroRomano.indexOf("LX") != -1){
numero = numero + 60;
}else
if (numeroRomano.indexOf("XL") != -1){
numero = numero + 40;
}else
if (numeroRomano.indexOf("L") != -1){
numero = numero + 50;
}else
if (numeroRomano.indexOf("XXX") != -1){
numero = numero + 30;
}else
if (numeroRomano.indexOf("XX") != -1){
numero = numero + 20;
}else
aux = numeroRomano.indexOf("X");
if (aux != -1 && (numeroRomano.indexOf("I", aux-1)) == -1){
numero = numero + 10;
}
if (numeroRomano.indexOf("IX") != -1){
numero = numero+ 9;
}else
if (numeroRomano.indexOf("VIII") != -1){
numero = numero + 8;
}else
if (numeroRomano.indexOf("VII") != -1){
numero = numero + 7;
}else
if (numeroRomano.indexOf("VI") != -1){
numero = numero + 6;
}else
if (numeroRomano.indexOf("IV") != -1){
numero = numero + 4;
}else
if (numeroRomano.indexOf("V") != -1){
numero = numero + 5;
}else
if (numeroRomano.indexOf("III") != -1){
numero = numero + 3;
}else
if (numeroRomano.indexOf("II") != -1){
numero = numero + 2;
}else
if (numeroRomano.indexOf("I") != -1){
numero = numero + 1;
}
return numero;
}
public static void main(String args[]) {
String numeroRomano="";
Scanner teclado = new Scanner (System.in);
System.out.print("Introduzca un número romano en mayusculas: ");
numeroRomano = teclado.nextLine();
System.out.println(NumRoman(numeroRomano));
}
}
import java.util.Scanner;
public class RomanoAArabigo {
public static int NumRoman(String numeroRomano){
int numero = 0;
if (numeroRomano.charAt(0) == 'M')
numero = numero + 1000;
if (numeroRomano.indexOf("CM") != -1){
numero = numero+ 900;
}else
if (numeroRomano.indexOf("DCCC") != -1){
numero = numero + 800;
}else
if (numeroRomano.indexOf("DCC") != -1){
numero = numero + 700;
}else
if (numeroRomano.indexOf("DC") != -1){
numero = numero + 600;
}else
if (numeroRomano.indexOf("CD") != -1){
numero = numero + 400;
}else
if (numeroRomano.indexOf("D") != -1){
numero = numero + 500;
}else
if (numeroRomano.indexOf("CCC") != -1){
numero = numero + 300;
}else
if (numeroRomano.indexOf("CC") != -1){
numero = numero + 200;
}else
if (numeroRomano.indexOf("C") != -1){
numero = numero + 100;
if (numeroRomano.indexOf("IC") != -1){
numero = numero - 100;
}
}
if (numeroRomano.indexOf("XC") != -1){
numero = numero+ 90;
}else
if (numeroRomano.indexOf("LXXX") != -1){
numero = numero + 80;
}else
if (numeroRomano.indexOf("LXX") != -1){
numero = numero + 70;
}else
if (numeroRomano.indexOf("LX") != -1){
numero = numero + 60;
}else
if (numeroRomano.indexOf("XL") != -1){
numero = numero + 40;
}else
if (numeroRomano.indexOf("L") != -1){
numero = numero + 50;
}else
if (numeroRomano.indexOf("XXX") != -1){
numero = numero + 30;
}else
if (numeroRomano.indexOf("XX") != -1){
numero = numero + 20;
}else
if (numeroRomano.indexOf("X") != -1){
numero = numero + 10;
if (numeroRomano.indexOf("IX") != -1){
numero = numero - 10;
}
}
if (numeroRomano.indexOf("IX") != -1){
numero = numero+ 9;
}else
if (numeroRomano.indexOf("VIII") != -1){
numero = numero + 8;
}else
if (numeroRomano.indexOf("VII") != -1){
numero = numero + 7;
}else
if (numeroRomano.indexOf("VI") != -1){
numero = numero + 6;
}else
if (numeroRomano.indexOf("IV") != -1){
numero = numero + 4;
}else
if (numeroRomano.indexOf("V") != -1){
numero = numero + 5;
}else
if (numeroRomano.indexOf("III") != -1){
numero = numero + 3;
}else
if (numeroRomano.indexOf("II") != -1){
numero = numero + 2;
}else
if (numeroRomano.indexOf("I") != -1){
numero = numero + 1;
}
return numero;
}
public static void main(String args[]) {
String numeroRomano="";
Scanner teclado = new Scanner (System.in);
System.out.print("Introduzca un número romano en mayusculas: ");
numeroRomano = teclado.nextLine();
System.out.println(NumRoman(numeroRomano));
}
}
import java.util.Scanner;
public class RomanoAArabigo {
public static int NumRoman(String numeroRomano){
int numero = 0, aux=0;
if (numeroRomano.charAt(0) == 'M')
numero = numero + 1000;
if (numeroRomano.indexOf("CM") != -1){
numero = numero+ 900;
}else
if (numeroRomano.indexOf("DCCC") != -1){
numero = numero + 800;
}else
if (numeroRomano.indexOf("DCC") != -1){
numero = numero + 700;
}else
if (numeroRomano.indexOf("DC") != -1){
numero = numero + 600;
}else
if (numeroRomano.indexOf("CD") != -1){
numero = numero + 400;
}else
if (numeroRomano.indexOf("D") != -1){
numero = numero + 500;
}else
if (numeroRomano.indexOf("CCC") != -1){
numero = numero + 300;
}else
if (numeroRomano.indexOf("CC") != -1){
numero = numero + 200;
}else{
aux = numeroRomano.indexOf("C");
if (aux != -1 && (numeroRomano.indexOf("X", aux-1)) == -1){
numero = numero + 100;
}}
if (numeroRomano.indexOf("XC") != -1){
numero = numero+ 90;
}else
if (numeroRomano.indexOf("LXXX") != -1){
numero = numero + 80;
}else
if (numeroRomano.indexOf("LXX") != -1){
numero = numero + 70;
}else
if (numeroRomano.indexOf("LX") != -1){
numero = numero + 60;
}else
if (numeroRomano.indexOf("XL") != -1){
numero = numero + 40;
}else
if (numeroRomano.indexOf("L") != -1){
numero = numero + 50;
}else
if (numeroRomano.indexOf("XXX") != -1){
numero = numero + 30;
}else
if (numeroRomano.indexOf("XX") != -1){
numero = numero + 20;
}else{
aux = numeroRomano.indexOf("X");
if (aux != -1 && (numeroRomano.indexOf("I", aux-1)) == -1){
numero = numero + 10;
}}
if (numeroRomano.indexOf("IX") != -1){
numero = numero+ 9;
}else
if (numeroRomano.indexOf("VIII") != -1){
numero = numero + 8;
}else
if (numeroRomano.indexOf("VII") != -1){
numero = numero + 7;
}else
if (numeroRomano.indexOf("VI") != -1){
numero = numero + 6;
}else
if (numeroRomano.indexOf("IV") != -1){
numero = numero + 4;
}else
if (numeroRomano.indexOf("V") != -1){
numero = numero + 5;
}else
if (numeroRomano.indexOf("III") != -1){
numero = numero + 3;
}else
if (numeroRomano.indexOf("II") != -1){
numero = numero + 2;
}else{
if (numeroRomano.indexOf("I") != -1){
numero = numero + 1;
}
}
return numero;
}
public static void main(String args[]) {
String numeroRomano="";
Scanner teclado = new Scanner (System.in);
System.out.print("Introduzca un número romano en mayusculas: ");
numeroRomano = teclado.nextLine();
System.out.println(NumRoman(numeroRomano));
}
}
else{
aux = numeroRomano.indexOf("C");
if (aux != -1 && (numeroRomano.indexOf("I", aux-1)) == -1){
numero = numero + 100;
}}
else{
aux = numeroRomano.indexOf("C");
if (aux != -1 && (numeroRomano.indexOf("X", aux-1)) == -1){
numero = numero + 100;
}}
Grender escribió:Vale en el anterior programa que he subido he encontrado un error con "DIC", me devuelve 501,
Evidork escribió:Grender escribió:Vale en el anterior programa que he subido he encontrado un error con "DIC", me devuelve 501,
Corrige lo que te he dicho de los else's, que te faltan paréntesis, y lo que te he indicado arriba. Por cierto, DIC no existe, será en todo caso DIX.
import java.util.Scanner;
public class RomanoAArabigo {
public static int NumRoman(String numeroRomano){
int numero = 0;
if (numeroRomano.charAt(0) == 'M')
numero = numero + 1000;
//indexOf, te devuelve la posición en la que se encuentra la cadena de texto que has introducido a buscar dentro de un string.
//charAt te devuelve el char que está en la posición indicada (primera letra = 0, etc)
if (numeroRomano.indexOf("CM") != -1){
numero = numero+ 900;
}else if (numeroRomano.indexOf("DCCC") != -1){
numero = numero + 800;
}else if (numeroRomano.indexOf("DCC") != -1){
numero = numero + 700;
}else if (numeroRomano.indexOf("DC") != -1){
numero = numero + 600;
}else if (numeroRomano.indexOf("CD") != -1){
numero = numero + 400;
}else if (numeroRomano.indexOf("D") != -1){
numero = numero + 500;
}else if (numeroRomano.indexOf("CCC") != -1){
numero = numero + 300;
}else if (numeroRomano.indexOf("CC") != -1){
numero = numero + 200;
}else if (numeroRomano.indexOf("C") != -1 && numeroRomano.charAt(0) != 'X' ){ //esto lo hago por que si por ejemplo la primera es X, si no lo restringiera entraria en los dos y seria 100+90
numero = numero + 100; //al estar restringido, solo entraria si el primer char no es una X, en caso de que lo sea, pasa al de abajo.
}
if (numeroRomano.indexOf("XC") != -1){
numero = numero+ 90;
}else if (numeroRomano.indexOf("LXXX") != -1){
numero = numero + 80;
}else if (numeroRomano.indexOf("LXX") != -1){
numero = numero + 70;
}else if (numeroRomano.indexOf("LX") != -1){
numero = numero + 60;
}else if (numeroRomano.indexOf("XL") != -1){
numero = numero + 40;
}else if (numeroRomano.indexOf("L") != -1){
numero = numero + 50;
}else if (numeroRomano.indexOf("XXX") != -1){
numero = numero + 30;
}else if (numeroRomano.indexOf("XX") != -1){
numero = numero + 20;
}else if (numeroRomano.indexOf("X") != -1 && numeroRomano.charAt(0) != 'I'){ //esto lo hago por que si por ejemplo la primera es I, si no lo restringiera entraria en los dos y seria 10+9
numero = numero + 10; //al estar restringido, solo entraria si el primer char no es un I, en caso de que lo sea, pasa al de abajo.
}
if (numeroRomano.indexOf("IX") != -1){
numero = numero + 9;
}else if (numeroRomano.indexOf("VIII") != -1){
numero = numero + 8;
}else if (numeroRomano.indexOf("VII") != -1){
numero = numero + 7;
}else if (numeroRomano.indexOf("VI") != -1){
numero = numero + 6;
}else if (numeroRomano.indexOf("IV") != -1){
numero = numero + 4;
}else if (numeroRomano.indexOf("V") != -1){
numero = numero + 5;
}else if (numeroRomano.indexOf("III") != -1){
numero = numero + 3;
}else if (numeroRomano.indexOf("II") != -1){
numero = numero + 2;
}else if (numeroRomano.indexOf("I") != -1){
numero = numero + 1;
}
return numero;
}
public static void main(String args[]) {
String numeroRomano="";
Scanner teclado = new Scanner (System.in);
System.out.print("Introduzca un numero romano en mayusculas: ");
numeroRomano = teclado.nextLine();
System.out.println("\n["+NumRoman(numeroRomano)+"]");
}
}
Grender escribió:Abokys escribió:Podrías hacer lo siguiente: memoriza el número romano como String, luego haces un recorrido(con un for) del String de manera que compruebe cada posición del String, si encuentra un "I" sume a un contador +1, si es una "X", +10; ¿Qué pasa con los números 4, 9, etc...)? pues con otro contador miras si el número anterior es un "I" y le restas uno. No sé si me he explicado bien.... hace un tiempo hice un programa similar. El código seria algo así:
int contador=o;
for(int i=0;StringRomano.length();i++){ //Este recorrido es el principal
for(int j=1;StringRomano.lenght();j++){//este recorrido empieza en una posición mas y sirve para comprobar el número posterior, por si tiene que restar
if StringRomano.charAt(i)=='I'{
contador++;
}else if(StringRomano.charAt(i)=='I' && StringRomano.charAt(j)=='V'){
contador=contador+4;
(Y ya solo es ir jugando con las posibilidades, de esta manera se simplifica mas el código)
.........
Algo así, perdona que no pueda darte una solución mas pulida, estoy liado con otro trabajo y no tengo mucho tiempo; espero que entiendas el concepto y si puedo mañana te pulo un poco mas la solución, pero la idea es jugar con dos bucles for, de manera que compruebes la posición que quieres avaluar y la siguiente (para comprobar si se trata de un 4,9, etc...) y luego dependiendo del resultado sumas un valor u otro al contador (que será el resultado obtenido).
El problema es que no nos dejan usar los bucles, son asi de cabrones para que nos comamos la cabeza xD