El flamante vencedor de este primer concurso de programación ha sido Hugo Ernesto, quien con su algoritmo ha conseguido realizar la tarea de convertir 10 números romanos en el menor tiempo posible, utilizando el lenguaje C para el compilador de CCS.
En la fase final del concurso, los números a convertir han sido:
0, 1, 3999, 1238, 99, 999, 41, 2666, 5, 3000
Resultados
Estos son los resultados de los distintos participantes:
Hugo Ernesto
0 =
1 = I
3999 = MMMCMXCIX
1238 = MCCXXXVIII
99 = XCIX
999 = CMXCIX
41 = XLI
2666 = MMDCLXVI
5 = V
3000 = MMM
Ha tardado 67503 ticks
Miguel Angel Martínez
0 =
1 = I
3999 = MMMCMXCIX
1238 = MCCXXXVIII
99 = XCIX
999 = CMXCIX
41 = XLI
2666 = MMDCLXVI
5 = V
3000 = MMM
Ha tardado 67806 ticks
Diego Matías
0 =
1 = I
3999 = MM …………………………. ERROR
1238 = MCCXXXVIII
99 = XCIX
999 = CMXCIX
41 = XLI
2666 = MMDCLXVI
5 = V
3000 = MMD …………………………. ERROR
Ha tardado 67938 ticks
Osropa
0 =
1 = I
3999 = MMMCMXCIX
1238 = MCCXXXVIII
99 = XCIX
999 = CMXCIX
41 = XLI
2666 = MMDCLXVI
5 = V
3000 = MMM
Ha tardado 68122 ticks
Picuino
0 =
1 = I
3999 = MMMCMXCIX
1238 = MCCXXXVIII
99 = XCIX
999 = CMXCIX
41 = XLI
2666 = MMDCLXVI
5 = V
3000 = MMM
Ha tardado 68222 ticks
Bruno
0 =
1 = I
3999 = MMMCMXCIX
1238 = MCCXXXVIII
99 = XCIX
999 = CMXCIX
41 = XLI
2666 = MMDCLXVI
5 = V
3000 = MMM
Ha tardado 69382 ticks
Gab163
CCC0 = …………………………. ERROR
1 = I
3999 = MMMCMXCIX
1238 = MXXXVIII …………………………. ERROR
99 = XCIX
999 = CMXCIX
41 = XLI
2666 = MMDLXVI …………………………. ERROR
5 = V
3000 = MMM
Ha tardado 72507 ticks
Caghetas
0 =
1 = I
3999 = MMMCMXCIX
1238 = MCCXXXVIII
99 = XCIX
999 = CMXCIX
41 = XLI
2666 = MMDCLXVI
5 = V
3000 = MMM
Ha tardado 73912 ticks
Spiderman
0 =
1 = I
3999 = MMMCMXCIX
1238 = MCCXXXVIII
99 = XCIX
999 = CMXCIX
41 = XLI
2666 = MMDCLXVI
5 = V
3000 = MMM
Ha tardado 83404 ticks
Algoritmo ganador
Este es el algoritmo del ganador.
inline void ConvierteARomano(int16 Numero) {
#byte FSR0L = 0xFE9
#byte POSTINC0= 0xFEE
#byte INDF0 = 0xFEF
FSR0L = &Resultado;
if(bit_test(Numero,11)) {
POSTINC0 = ‘M’;
POSTINC0 = ‘M’;
Numero -= 2000;
goto M;
}
if(bit_test(Numero,10)) {
POSTINC0 = ‘M’;
Numero -= 1000;
goto M;
}
if(bit_test(Numero,9)) {
goto M;
}
if(bit_test(Numero,8)) {
goto D;
}
if(bit_test(Numero,7)) {
goto C_1;
}
if(bit_test(Numero,6)) {
goto C_2;
}
if(bit_test(Numero,5)) {
goto L;
}
if(bit_test(Numero,4)) {
goto X;
}
if(bit_test(Numero,3)) {
goto X_1;
}
if(bit_test(Numero,2)) {
goto IVaVII;
}
if(bit_test(Numero,1)) {
goto IIoIII;
}
if(bit_test(Numero,0)) {
POSTINC0 = ‘I’;
INDF0 = ‘\0’;
return;
}
INDF0 = ‘\0’; return;
M:
if (Numero>999) {
POSTINC0 = ‘M’;
Numero -= 1000;
if(!Numero) {INDF0 = ‘\0’; return;}
}
CM:
if (Numero>899) {
POSTINC0 = ‘C’;
POSTINC0 = ‘M’;
Numero -= 900;
if(!(int8)Numero) {INDF0 = ‘\0’; return;}
else goto XC;
}
D:
if (Numero>499) {
POSTINC0 = ‘D’;
Numero -= 500;
if(!Numero) {INDF0 = ‘\0’; return;}
else goto C;
}
CD:
if (Numero>399) {
POSTINC0 = ‘C’;
POSTINC0 = ‘D’;
Numero -= 400;
if(!(int8)Numero) {INDF0 = ‘\0’; return;}
else goto XC;
}
C:
if(Numero>299) {
POSTINC0 = ‘C’;
POSTINC0 = ‘C’;
POSTINC0 = ‘C’;
(int8)Numero -= 300;
if(!(int8)Numero) {INDF0 = ‘\0’; return;}
else goto XC;
}
C_1:
if(Numero>199) {
POSTINC0 = ‘C’;
POSTINC0 = ‘C’;
(int8)Numero -= 200;
if(!(int8)Numero) {INDF0 = ‘\0’; return;}
else goto XC;
}
C_2:
if((int8)Numero> 99) {
POSTINC0 = ‘C’;
(int8)Numero -= 100;
if(!(int8)Numero) {INDF0 = ‘\0’; return;}
}
XC:
if ((int8)Numero > 89) {
POSTINC0 = ‘X’;
POSTINC0 = ‘C’;
(int8)Numero -= 90;
if(!(int8)Numero) {INDF0 = ‘\0’; return;} //***
else goto IX;
}
L:
if ((int8)Numero > 49) {
POSTINC0 = ‘L’;
(int8)Numero -= 50;
if(!(int8)Numero) {INDF0 = ‘\0’; return;}
else goto X;
}
XL:
if ((int8)Numero > 39) {
POSTINC0 = ‘X’;
POSTINC0 = ‘L’;
(int8)Numero -= 40;
if(!(int8)Numero) {INDF0 = ‘\0’; return;}
goto IX;
}
X:
if((int8)Numero>29) {
POSTINC0 = ‘X’;
POSTINC0 = ‘X’;
POSTINC0 = ‘X’;
(int8)Numero -= 30;
if(!(int8)Numero) {INDF0 = ‘\0’; return;}
}
if((int8)Numero>19) {
POSTINC0 = ‘X’;
POSTINC0 = ‘X’;
(int8)Numero -= 20;
if(!(int8)Numero) {INDF0 = ‘\0’; return;}
}
X_1:
if((int8)Numero> 9) {
POSTINC0 = ‘X’;
(int8)Numero -= 10;
}
IX:
if(bit_test(Numero,3)) {
if(bit_test(Numero,0)) {
POSTINC0 = ‘I’;
POSTINC0 = ‘X’;
INDF0 = ‘\0’;
return;
}
else {
POSTINC0 = ‘V’;
POSTINC0 = ‘I’;
POSTINC0 = ‘I’;
POSTINC0 = ‘I’;
INDF0 = ‘\0’;
return;
}
}
IVaVII:
if(bit_test(Numero,2)) {
if(bit_test(Numero,1)) {
if(bit_test(Numero,0)) {
POSTINC0 = ‘V’;
POSTINC0 = ‘I’;
POSTINC0 = ‘I’;
INDF0 = ‘\0’;
return;
}
else {
POSTINC0 = ‘V’;
POSTINC0 = ‘I’;
INDF0 = ‘\0’;
return;
}
}
if(bit_test(Numero,0)) {
POSTINC0 = ‘V’;
INDF0 = ‘\0’;
return;
}
if(!bit_test(Numero,0)){
POSTINC0 = ‘I’;
POSTINC0 = ‘V’;
INDF0 = ‘\0’;
return;
}
}
IIoIII:
if(bit_test(Numero,1)) {
if(bit_test(Numero,0)) {
POSTINC0 = ‘I’;
POSTINC0 = ‘I’;
POSTINC0 = ‘I’;
INDF0 = ‘\0’;
return;
}
POSTINC0 = ‘I’;
POSTINC0 = ‘I’;
INDF0 = ‘\0’;
return;
}
if(bit_test(Numero,0)) {
POSTINC0 = ‘I’;
INDF0 = ‘\0’;
return;
}
}
Como véis, el algoritmo no es bello, pero es extremadamente rápido. Lógicamente podría haberse escrito mucho más corto, pero también más lento.
Moraleja: según los recursos con los que cuentes en tu proyecto y las exigencias del mismo, tendrás que adaptar tu forma de programar para conseguir los mejores resultados.
Enhorabuena al ganador.
Y permaneced atentos que en breve organizaremos nuevos concursos.
