Primer concurso de programación MicroPIC: Números Romanos

28 mayo, 2013

Hola amigo, ya está bien de leer, ahora toca remangarse y participar.

Acompáñanos en este primer concurso de programación y diviértete por el camino. Y si ganas podrás optar a un interesante premio.

El concurso consiste en desarrollar un algoritmo que traduzca a números romanos cualquier número por debajo de 4000, y hacerlo lo más rápido posible. De hecho, el ganador será el desarrollador de aquel algoritmo que, dando todas las respuestas correctas, lo haga en el menor tiempo.

No se tendrá en cuenta el consumo de memoria ni otro tipo de recursos, sólo la velocidad.

Para facilitar el desarrollo y test, podremos probar el algoritmo con un programa matriz en CCS y el simulador Proteus.

El programa matriz se adjunta a continuación y, como podéis ver, enviará una lista de 10 números de 16 bits a la función, que debe encargarse de imprimir sobre el terminal serie su valor en números romanos, tal que así:

resultado

PROGRAMA BASE

Este es el programa que utilizaremos, en el que debes completar la función void ConvierteARomano (int16 Numero)

#include <18F458.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES OSCSEN                   //Oscillator switching is enabled
#FUSES PUT                      //Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=8000000)

#use rs232(baud=9600,UART1)
#include <string.h>

int16 ListaNumeros[10]={54,1238,41,2500,640,99,1,999,1001,2666};
char Resultados[10][16];
char Resultado[16];

int16 Contador=0;

void ConvierteARomano(int16 Numero) {
 
}

#INT_TIMER1
void Incrementa_Contador() {
   Contador++;
}

void main()
{
   int i;
   int16 Duracion;
   
   setup_timer_1 ( T1_INTERNAL);
   

   printf ("Primer concurso de programacion. NUMEROS ROMANOS\n\r");
   printf ("www.micropic.es\n\r\n\r");
   set_timer1(0);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   for (i=0;i<10;i++) {
      ConvierteARomano(ListaNumeros[i]);
      memcpy(Resultados[i], Resultado, sizeof Resultado);
   }
   disable_interrupts(INT_TIMER1);
   Duracion=get_timer1();
   
   for (i=0;i<10;i++)
      printf ("%LU = %s\n\r", ListaNumeros[i], Resultados[i]);

   printf ("Ha tardado %LU ticks\n\r",make32(Contador,Duracion));
   while(TRUE);

}

Como ves el programa inicializa el Timer1, luego entra en un bucle que llama 10 veces a la función de conversión y por último muestra en pantalla el número de ticks del Timer1 transcurridos. La lista de 10 números que se utilizarán en la evaluación final de todas las respuestas recibidas no tiene porqué ser la que se ve en el ejemplo, así que tendrás que intentar optimizar tu programa para cualquier combinación de números a traducir.

El circuito diseñado bajo el simulador Proteus es el siguiente:

Esquema concurso

Puedes descargar tanto el programa como el fichero de Proteus desde aquí.

PREMIO

El ganador recibirá totalmente gratis un módulo SIM508:

SIM508

SIM508



El diseño compacto del SIM508 hace que sea fácil de integrar GSM / GPRS y GPS en una solución todo-en-uno.

La combinación de ambas tecnologías puede ofrecer aplicaciones tales como teléfonos PDA, dispositivos GPS de mano y cualquier otro tipo de dispositivos móviles, permitiendo a vehículos y personas realizar un seguimiento sin problemas en cualquier lugar y momento.

☞ Tri-Banda GSM / GPRS
☞ Receptor GPS (20 canales)
☞ Conector placa a placa de 80-pin con paso de 0,5 mm
☞ GPRS multi-slot clase 10
☞ Pila TCP/IP integrada
☞ Opción de conectar teclado y LCD
☞ Certificados: TLC, CE, RoHS, FCC

El módulo SIM508 se enviará por correo postal ordinario.

MECÁNICA

Los concursantes podrán utilizar el foro de MicroPIC para consultar dudas, pedir ayuda, ofrecerla. Dado que el objetivo es encontrar el algoritmo más rápido, no se vetará la publicación de distintas soluciones. Se podrá utilizar un algoritmo ajeno y mejorarlo para que sea más rápido.

El compilador que utilizaremos para realizar las pruebas de velocidad es CCS en su versión 4.140

Cada concursante que quiera participar en el concurso, deberá publicar en el foro una captura de pantalla del resultado de su algoritmo, como la mostrada al principio de este artículo. En esa captura deben verse claramente las 10 conversiones realizadas y el tiempo total consumido. El algoritmo se enviará por correo electrónico a concursos@micropic.es indicando nombre y dirección (para poder enviar el regalo en caso de resultar vencedor).

El plazo de recepción de algoritmos estará abierto hasta el 16 de Junio de 2013. La semana del 17 de Julio se confirmará que el algoritmo que haya producido la solución más rápida publicada en el foro sea correcto y se hará público el ganador.

También se publicarán en el foro todos los algoritmos recibidos, con lo que podremos analizar cómo han afrontado el reto cada uno de los participantes.

 

¿A qué estás esperando?, descarga ya el programa base y ponte a programar. Estamos esperando tu participación.

Podrás usar este hilo del foro como soporte para el concurso y podrás publicar el resultado de tu algoritmo.

Y recuerda, cuando esté terminado, envía tu algoritmo a concursos@micropic.es

¡SUERTE!

Share

Etiquetas: , , ,