Autor Tema: Concurso de programación: números romanos  (Leído 8006 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Concurso de programación: números romanos
« Respuesta #30 en: 30 de Mayo de 2013, 06:37:34 »
No entiendo lo que pasa, Don Bruno.
Lo estoy simulando con MPLAB SIM (ya he aprendido a hacer printf en el debugger) y lo he compilado con las versiones 4.119, 4.124, 4.134 y 4.140.

En todos los casos el resultado es este:
Primer concurso de programacion. NUMEROS ROMANOS

www.micropic.es


54 = LIV

1238 = MCCXXXVIII

41 = XLI

2500 = MMD

640 = DCXL

99 = XCIX

1 = I

999 = CMXCIX

1001 = MI

2666 = MMDCLXVI

Ha tardado 321368 ticks

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Concurso de programación: números romanos
« Respuesta #31 en: 30 de Mayo de 2013, 08:11:41 »
Lo que pasa es que aqui en Argentina todo es mas rapido que en Europa !!  :D :D :lol: :lol:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Concurso de programación: números romanos
« Respuesta #32 en: 30 de Mayo de 2013, 10:09:34 »
Pues no estarán muy contentas las argentinas con eso   :D

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Concurso de programación: números romanos
« Respuesta #33 en: 30 de Mayo de 2013, 10:27:42 »
15 en lugar de 3 te parece mal ??   :shock: :shock: ;-) ;-)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Concurso de programación: números romanos
« Respuesta #34 en: 30 de Mayo de 2013, 11:50:44 »
Si hablas de frecuencia no está mal, pero si hablas de periodo, 15 semanas es mucho.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Concurso de programación: números romanos
« Respuesta #35 en: 30 de Mayo de 2013, 12:06:52 »
je!! :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Concurso de programación: números romanos
« Respuesta #36 en: 30 de Mayo de 2013, 14:23:00 »
Tras la participación de Bruno, hemos visto que las diferencias en los distintos algoritmos son muy escasas, lo cual era sumamente sospechoso.

Bruno ha llegado a la conclusión de que el principal consumo de tiempo se debía a la impresión de los resultados con la USART, por lo que la influencia del algoritmo quedaba completamente oculta bajo las esperas de la USART.

La solución para medir perfectamente la eficacia de los distintos algoritmos pasa por hacer una modificación al funcionamiento, que ha consistido en que la función devuelva el resultado en un string de 16 posiciones.

char Resultado[16];

Puedes descargar la nueva plantilla desde aquí

Para no marear a los concursantes que ya han enviado su algoritmo, haré yo las modificaciones y publicaré los resultados.

Por cierto, este es el resultado de Bruno con su algoritmo:

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Concurso de programación: números romanos
« Respuesta #37 en: 30 de Mayo de 2013, 15:50:03 »
Ya están publicados los resultados de los distintos algoritmos con la nueva estructura.
Podéis verlos aquí:

http://www.micropic.es/mpforo/index.php?topic=1475.msg7124#msg7124

Ahora mismo se sitúa en cabeza Picuino, seguido de cerca por Bruno

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Concurso de programación: números romanos
« Respuesta #38 en: 30 de Mayo de 2013, 16:17:48 »
Ahora el tiempo medido es solo el de la conversión a romano, ya sin impresion??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Concurso de programación: números romanos
« Respuesta #39 en: 30 de Mayo de 2013, 16:21:36 »
Si.

Parece que no voy a ganar, pero que hasta el momento es el más rebuscado, estoy seguro que sí. Pensé que iba a ser más veloz.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Concurso de programación: números romanos
« Respuesta #40 en: 30 de Mayo de 2013, 17:32:07 »
Viva el open-source  :-/

Mi algoritmo está publicado aquí  ;-) :

http://www.todopic.com.ar/foros/index.php?topic=40865.msg339997#msg339997

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Concurso de programación: números romanos
« Respuesta #41 en: 30 de Mayo de 2013, 17:39:57 »
Dejo el nuevo algoritmo modificado, bajo licencia GNU GPL (se puede utilizar siempre que se publique el algoritmo modificado)

Código: C
  1. void ConvierteARomano(int16 Numero) {
  2.     unsigned char Num;
  3.     unsigned int8 posicion = 0;
  4.      
  5.     #define PUTCH(c) Resultado[posicion++]=c
  6.      
  7.       if (Numero>>8) {
  8.          while (Numero >= 1000) {
  9.             PUTCH('M');
  10.             Numero -= 1000;
  11.          }
  12.          if (Numero >= 900) {
  13.             PUTCH('C');
  14.             PUTCH('M');
  15.             Numero -= 900;
  16.          }
  17.          if (Numero >= 500) {
  18.             PUTCH('D');
  19.             Numero -= 500;
  20.          }
  21.          if (Numero >= 400) {
  22.             PUTCH('C');
  23.             PUTCH('D');
  24.             Numero -= 400;
  25.          }
  26.          while(Numero>>8) {
  27.             PUTCH('C');
  28.             Numero -= 100;
  29.          };
  30.       }
  31.       Num = Numero;
  32.       while(Num >= 100) {
  33.          PUTCH('C');
  34.          Num -= 100;
  35.       };
  36.       if (Num >= 90) {
  37.          PUTCH('X');
  38.          PUTCH('C');
  39.          Num -= 90;
  40.       }
  41.       if (Num >= 50) {
  42.          PUTCH('L');
  43.          Num -= 50;
  44.       }
  45.       if (Num >= 40) {
  46.          PUTCH('X');
  47.          PUTCH('L');
  48.          Num -= 40;
  49.       }
  50.       while(Num >= 10) {
  51.          PUTCH('X');
  52.          Num -= 10;
  53.       };
  54.       if (Num >= 9) {
  55.          PUTCH('I');
  56.          PUTCH('X');
  57.          Num -= 9;
  58.       }
  59.       if (Num >= 5) {
  60.          PUTCH('V');
  61.          Num -= 5;
  62.       }
  63.       if (Num >= 4) {
  64.          PUTCH('I');
  65.          PUTCH('V');
  66.          Num -= 4;
  67.       }
  68.       while(Num > 0) {
  69.          PUTCH('I');
  70.          Num--;
  71.       }
  72.       Resultado[posicion] = '\0';
  73.     }

Saludos.
« Última modificación: 30 de Mayo de 2013, 17:46:06 por Picuino »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Concurso de programación: números romanos
« Respuesta #42 en: 30 de Mayo de 2013, 17:48:56 »
Hombre, que si bien tener open source ayuda casi siempre, aquí también puede impidir y condicionar el desarrollo de la imaginación.

Felicitaciones por llevar la punta.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Concurso de programación: números romanos
« Respuesta #43 en: 30 de Mayo de 2013, 18:04:15 »
Si aparecen más códigos publicados, eso al final estimula a combinar ideas y hacer nuevos programas.
No es obligatorio seguir mi código, puede utilizarse como base para nuevas ideas que no lo copien.

Saludos.

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Concurso de programación: números romanos
« Respuesta #44 en: 31 de Mayo de 2013, 01:14:32 »
Bueno con algunas ideas nuevas, tomando como idea la asignación de datos de Picuino adapte un pequeño algoritmo de búsqueda para evitar algunas comparaciones se deja el codigo  bajo licencia GNU GPL como comento Picuino y pues a seguir depurando. Esto es lo que resulto:

Código: [Seleccionar]
void ConvierteARomano(int16 Numero) {
unsigned char Num;
    unsigned int8 posicion = 0;
    #define PUTCH(c) Resultado[posicion++]=c
    
    if(Numero>>8){
//*********************Miles****************************************************
         if(Numero>=1000){
            while(Numero>=1000){
            Numero-=1000;
            PUTCH('M');
            }
         }
//*********************Cientos**************************************************        
         if(Numero>=100){
            if(Numero>=500){
               if(Numero>=900){PUTCH('C');PUTCH('M');Numero-=900;}
               else{PUTCH('D');Numero-=500;}
            }
            if(Numero>=400){PUTCH('C');PUTCH('D');Numero-=400;}
            while(Numero>>8){PUTCH('C');Numero-=100;}
         }
    }
    Num=Numero;
    while(Num>=100){PUTCH('C');Num-=100;}
//***********************Decenas************************************************    
    if(Num>=50){
         if(Num>=90){PUTCH('X');PUTCH('C');Num-=90;}
         else{PUTCH('L');Num-=50;}
    }
    if(Num>=40){PUTCH('X');PUTCH('L');Num-=40;}
    while(Num>=10){PUTCH('X');Num-=10;}
//******************************Unidades****************************************
    if(Num){
         if(Num>5){
               if(Num==9){PUTCH('I');PUTCH('X');Num-=9;}
               else{PUTCH('V');Num-=5;}
         }
         if(Num==4){PUTCH('I');PUTCH('V');Num-=4;}
         while(Num){PUTCH('I');Num-=1;}
         }
//******************************************************************************        
     Resultado[posicion] = '\0';
  }


 

anything