Resultados primer concurso de programación: Números Romanos

17 junio, 2013

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.

 

Share

Etiquetas: ,