elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema en reto de programacion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema en reto de programacion  (Leído 2,405 veces)
daryo


Desconectado Desconectado

Mensajes: 1.070



Ver Perfil WWW
problema en reto de programacion
« en: 21 Diciembre 2014, 14:56 pm »

entenderia que nadie comente xDD.

es un juego de programacion uno de los niveles hay que pasar una cadena ascii a su equivalente binario para luego pasar el binario a su sistema"chuck norris".
http://www.codingame.com

el ejemplo que dan es c= 1000011
chuck norris c=0 0 00 0000 0 00
cc=10000111000011
chuck norris cc= 0 0 00 0000 0 000 00 0000 0 00

si comienza en 0(el primer bloque) los que le siguen(segundo bloque) hasta el espacio son unos y si comienza en 00 los ceros que le siguen son ceros hasta el espacio
mi codigo es:
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. /**
  6.  * Auto-generated code below aims at helping you parse
  7.  * the standard input according to the problem statement.
  8.  **/
  9.  
  10.  
  11. int main()
  12. {
  13.    char MESSAGE[100];
  14.    fgets(MESSAGE,100,stdin);
  15.    int size=strlen(MESSAGE);
  16.    int letra;
  17.    int Ascii;
  18.    int binario[50];
  19.    int temp;
  20.    int contador=0;
  21.    int reverso[700];
  22.    int indice=0;
  23.    char chuck_norris[700];
  24.    int unocero=0;
  25.    int unomas=0;
  26.    short bloque1=0;
  27.    // Write an action using printf(). DON'T FORGET THE TRAILING \n
  28.    // To debug: fprintf(stderr, "Debug messages...\n");
  29.    //---------------------------
  30.    for(int a=0;a<size;a++){
  31.        if(MESSAGE[a]!='\0' && MESSAGE[a]!='\n')
  32.        {
  33.            letra=MESSAGE[a];//tomo el valor ascii
  34.            if(letra<=64)
  35.            {
  36.                reverso[0]=0;
  37.                unomas=1; //si es menor a el codigo ascii 64 se le pone un cero al comienzo eso es uno mas
  38.            }
  39.            //----------------------------
  40.            contador=0;
  41.            temp=letra;
  42.  
  43.            //convierto el numero a binario
  44.            while(temp>0){
  45.                binario[contador]=(temp%2);
  46.                temp=temp/2;
  47.                contador++;
  48.            }
  49.            int conta3=contador-1; //contador es el largo de binario
  50.            contador=contador+unomas;//si es menor a 64 se le pone un cero al comienzo eso es uno mas
  51.            for(int inv=0;inv<contador;inv++)
  52.            {
  53.                reverso[inv+unomas]=binario[conta3];//  binario estan los numeros al reves asi que le doy la vuelta
  54.                conta3--;
  55.            }
  56.            //ahora lo pasare a el codigo chuck norris
  57.            for(int final=0;final<contador;final++){
  58.                //si bloque1=1 entonces estamos en el segundo bloque y se le agrega un cero si continua siendo el mismo del primer bloque unocero
  59.                if(bloque1==1){
  60.                    if(reverso[final]==unocero)
  61.                    {
  62.                       chuck_norris[indice]='0';indice++;
  63.                    }
  64.                    else
  65.                    {
  66.                            chuck_norris[indice]=' ';indice++;
  67.                            bloque1=0;                      
  68.                    }
  69.                }
  70.                //------------------------------------
  71.                if(reverso[final]==1 && bloque1==0) //si estamos en el primer bloque y es un uno escribe en la respuesta 0 0
  72.                {
  73.                    chuck_norris[indice]='0';indice++;
  74.                    chuck_norris[indice]=' ';indice++;
  75.                    chuck_norris[indice]='0';indice++;
  76.                    bloque1=1; // cambiamos de bloque
  77.                    unocero=1; //si cambia este numero es que se acabaron los unos repetidos
  78.                }
  79.                else if(reverso[final]==0 && bloque1==0) //si estamos en el primer bloque y es un cero escribe en la respuesta 00 0
  80.                {
  81.                    chuck_norris[indice]='0';indice++;
  82.                    chuck_norris[indice]='0';indice++;
  83.                    chuck_norris[indice]=' ';indice++;
  84.                    chuck_norris[indice]='0';indice++;
  85.                    bloque1=1;// cambiamos de bloque
  86.                    unocero=0;//si cambia este numero es que se acabaron los unos repetidos
  87.                }
  88.                //----------------------
  89.            }
  90.            chuck_norris[indice]='\0';// se le agrega el final de la cadena
  91.        }
  92.    }
  93.    printf("%s\n",chuck_norris);//escribe la respuesta
  94.  
pero no esta funcionando como deberia con c y cc funciona, o si le pasan % pero si le pasan:
http://www.codingame.com/ide/fileservlet?id=373674626189
la salida deberia ser:
http://www.codingame.com/ide/fileservlet?id=373685797831
pero no es alguna idea?








En línea

buenas
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: problema en reto de programacion
« Respuesta #1 en: 21 Diciembre 2014, 17:14 pm »

Hola daryo. Estoy trabajando en tu proyecto pero por favor explícame que significa la parte de:

Citar
unomas=1;  //si es menor a el codigo ascii 64 se le pone un cero al comienzo eso es uno mas

???


En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
daryo


Desconectado Desconectado

Mensajes: 1.070



Ver Perfil WWW
Re: problema en reto de programacion
« Respuesta #2 en: 21 Diciembre 2014, 17:29 pm »

Hola daryo. Estoy trabajando en tu proyecto pero por favor explícame que significa la parte de:

???
ok lo que sucede es que caracteres como % en binario son
010 0101
mientras que por ejemplo el caracter A es
100 0001

010 0101
100 0001

asi que el primer digito es cero, un int en c nunca comienza por cero simplemente lo borra asi que lo agrego al array de esa forma xD .
asi marco
unomas=1 entonces ya tiene un caracter y comienza desde ahi si por otro lado es cero pues no hace diferencia
« Última modificación: 21 Diciembre 2014, 17:33 pm por daryo » En línea

buenas
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: problema en reto de programacion
« Respuesta #3 en: 21 Diciembre 2014, 18:02 pm »

Ok, entiendo. Bueno yo humildemente hubiera trabajado la parte de convertir a chuck_norris de una manera diferente y creo que más breve. Tomo el array binario y agarro el primer digito. Luego reviso el segundo, tercero, etc, y así hasta encontrar uno diferente al primero. De esa manera delimito un primer bloque y además llevo la cuenta de la cantidad de dígitos que posee.

Luego, tomo como dígito de prueba el que encontré que era diferente al primero (justo donde se terminó el primer bloque), y repito el proceso para ver cuántos son iguales a este de prueba. Repitiendo el proceso logro convertir toda la secuencia.

Por ejemplo, cuando paso el carácter 'A' (ASCII 65), su binario es '1000001', que el programa me convierte a:

   0 0 00 00000 0 0

que según creo es lo que se quiere, ¿no?

Un detalle, reutilizar apropiadamente el espacio de variables y no desperdiciar memoria, empleé la variable 'letra' para representar los dígitos del binario.

El programa, con mi modificación propuesta, es:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. /**
  6.  * Auto-generated code below aims at helping you parse
  7.  * the standard input according to the problem statement.
  8.  **/
  9.  
  10.  
  11. int main()
  12. {
  13.    char MESSAGE[100];
  14.    fgets(MESSAGE,100,stdin);
  15.    int size=strlen(MESSAGE);
  16.    int letra;
  17.    int Ascii;
  18.    int binario[50];
  19.    int temp;
  20.    int contador=0;
  21.    int reverso[700];
  22.    int indice=0;
  23.    char chuck_norris[700];
  24.    int unocero=0;
  25.    int unomas=0;
  26.    short bloque1=0;
  27.  
  28.    // Write an action using printf(). DON'T FORGET THE TRAILING \n
  29.    // To debug: fprintf(stderr, "Debug messages...\n");
  30.    //---------------------------
  31.  
  32.    *chuck_norris = '\0'; /* inicializa cadena vacia */
  33.    for (int a=0; a<size; a++) {
  34.        if (MESSAGE[a]!='\0' && MESSAGE[a]!='\n')
  35.        {
  36.            letra=MESSAGE[a];//tomo el valor ascii
  37.            if (letra<=64)
  38.            {
  39.                reverso[0]=0;
  40.                unomas=1; //si es menor a el codigo ascii 64 se le pone un cero al comienzo eso es uno mas
  41.            }
  42.            //----------------------------
  43.            contador=0;
  44.            temp=letra;
  45.  
  46.            //convierto el numero a binario
  47.            while (temp>0) {
  48.                binario[contador]=(temp%2);
  49.                temp=temp/2;
  50.                contador++;
  51.            }
  52.            int conta3=contador-1; //contador es el largo de binario
  53.            contador=contador+unomas;//si es menor a 64 se le pone un cero al comienzo eso es uno mas
  54.  
  55.            for (int inv=0; inv<contador; inv++)
  56.            {
  57.                reverso[inv+unomas]=binario[conta3];//  binario estan los numeros al reves asi que le doy la vuelta
  58.                conta3--;
  59.            }
  60.  
  61.            /* imprimimos en binario para ver el resultado */
  62.            printf( "binario: " );
  63.            for ( int i = 0; i < contador; i++ )
  64.                putchar( '0' + reverso[i] );
  65.            printf("\n");
  66.  
  67.            //ahora lo pasare a el codigo chuck norris
  68.  
  69.            /* ============= MI PROPUESTA DE CHUCK NORRIS =======================
  70.              * --- Humildemente, Yoel.-
  71.             */
  72.            int i = 0;
  73.            /* convertiremos el binario reverso a chuck norris */
  74.            while ( i < contador ) {
  75.                /* NOTA: al final de este while, la variable n contendra la cantidad de veces que se repite
  76.                  * letra en el bloque actual
  77.                  */
  78.                int n = 0;
  79.                letra = reverso[i];
  80.                while ( i < contador && reverso[i] == letra ) {
  81.                    n++;
  82.                    i++;
  83.                }
  84.  
  85.                /* ahora transcribe a la cadena chuck_norris apropiadamente segun el caso */
  86.                if ( letra == 1 )
  87.                    strcat( chuck_norris, "0 ");
  88.                else if ( letra == 0 )
  89.                    strcat( chuck_norris, "00 ");
  90.  
  91.                while ( --n >= 0 ) {
  92.                    strcat( chuck_norris, "0" );
  93.                }
  94.                /* espacio para delimitar el fin de bloque */
  95.                strcat( chuck_norris, " ");
  96.            }
  97.            strcat( chuck_norris, "| ");
  98.            /*=============== FIN =================*/
  99.        }
  100.    }
  101.  
  102. #if 0
  103.    for (int final=0; final<contador; final++) {
  104.        //si bloque1=1 entonces estamos en el segundo bloque y se le agrega un cero si continua siendo el mismo del primer bloque unocero
  105.        if (bloque1==1) {
  106.            if (reverso[final]==unocero)
  107.            {
  108.                chuck_norris[indice]='0';
  109.                indice++;
  110.            }
  111.            else
  112.            {
  113.                chuck_norris[indice]=' ';
  114.                indice++;
  115.                bloque1=0;
  116.            }
  117.        }
  118.        //------------------------------------
  119.        if (reverso[final]==1 && bloque1==0) //si estamos en el primer bloque y es un uno escribe en la respuesta 0 0
  120.        {
  121.            chuck_norris[indice]='0';
  122.            indice++;
  123.            chuck_norris[indice]=' ';
  124.            indice++;
  125.            chuck_norris[indice]='0';
  126.            indice++;
  127.            bloque1=1; // cambiamos de bloque
  128.            unocero=1; //si cambia este numero es que se acabaron los unos repetidos
  129.        }
  130.        else if (reverso[final]==0 && bloque1==0) //si estamos en el primer bloque y es un cero escribe en la respuesta 00 0
  131.        {
  132.            chuck_norris[indice]='0';
  133.            indice++;
  134.            chuck_norris[indice]='0';
  135.            indice++;
  136.            chuck_norris[indice]=' ';
  137.            indice++;
  138.            chuck_norris[indice]='0';
  139.            indice++;
  140.            bloque1=1;// cambiamos de bloque
  141.            unocero=0;//si cambia este numero es que se acabaron los unos repetidos
  142.        }
  143.        //----------------------
  144.    }
  145.    chuck_norris[indice]='\0';// se le agrega el final de la cadena
  146. #endif
  147.  
  148.    printf("%s\n",chuck_norris);//escribe la respuesta
  149.  
  150.    return 0;
  151. }

Te muestro la salida generada con la cadena de entrada "ABC":


ABC
binario: 1000001
binario: 1000010
binario: 1000011
0 0 00 00000 0 0 | 0 0 00 0000 0 0 00 0 | 0 0 00 0000 0 00 |


donde he usado el separador '|' para distinguir a la vista un código del otro (aunque no se si realmente necesitas eso).

Revisa y me comentas!!!  :)
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
daryo


Desconectado Desconectado

Mensajes: 1.070



Ver Perfil WWW
Re: problema en reto de programacion
« Respuesta #4 en: 21 Diciembre 2014, 22:29 pm »

gracias probare tu solucion , tengo la mania(no se si buena o mala xD) de usar la minina cantidad de librerias cuando uso c xD .
En línea

buenas
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: problema en reto de programacion
« Respuesta #5 en: 22 Diciembre 2014, 01:19 am »

Pues en ese caso no hay problema, pues getchar() requiere <stdio.h>, que ya la tienes.
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problema en programacion..!
Programación General
ThonyMaster 0 1,922 Último mensaje 14 Julio 2010, 20:40 pm
por ThonyMaster
Reto Programación « 1 2 »
Programación General
Oblivi0n 10 6,144 Último mensaje 22 Diciembre 2010, 00:09 am
por ace332
Reto de programacion
Programación General
dx671 3 3,033 Último mensaje 24 Junio 2011, 00:50 am
por Littlehorse
Reto de programacion
Programación C/C++
SXF 9 3,363 Último mensaje 7 Marzo 2012, 19:29 pm
por Eternal Idol
Reto algoritmo mezcla cifras y letras (RETO REMUNERADO)
Desafíos - Wargames
kingMezlo 3 5,089 Último mensaje 31 Diciembre 2013, 19:47 pm
por #Aitor
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines