problema en reto de programacion

Iniciado por daryo, 21 Diciembre 2014, 14:56 PM

0 Miembros y 1 Visitante están viendo este tema.

daryo

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:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/**
* Auto-generated code below aims at helping you parse
* the standard input according to the problem statement.
**/


int main()
{
    char MESSAGE[100];
    fgets(MESSAGE,100,stdin);
    int size=strlen(MESSAGE);
    int letra;
    int Ascii;
    int binario[50];
    int temp;
    int contador=0;
    int reverso[700];
    int indice=0;
    char chuck_norris[700];
    int unocero=0;
    int unomas=0;
    short bloque1=0;
    // Write an action using printf(). DON'T FORGET THE TRAILING \n
    // To debug: fprintf(stderr, "Debug messages...\n");
    //---------------------------
    for(int a=0;a<size;a++){
        if(MESSAGE[a]!='\0' && MESSAGE[a]!='\n')
        {
            letra=MESSAGE[a];//tomo el valor ascii
            if(letra<=64)
            {
                reverso[0]=0;
                unomas=1; //si es menor a el codigo ascii 64 se le pone un cero al comienzo eso es uno mas
            }
            //----------------------------
            contador=0;
            temp=letra;
           
            //convierto el numero a binario
            while(temp>0){
                binario[contador]=(temp%2);
                temp=temp/2;
                contador++;
            }
            int conta3=contador-1; //contador es el largo de binario
            contador=contador+unomas;//si es menor a 64 se le pone un cero al comienzo eso es uno mas
            for(int inv=0;inv<contador;inv++)
            {
                reverso[inv+unomas]=binario[conta3];//  binario estan los numeros al reves asi que le doy la vuelta
                conta3--;
            }
            //ahora lo pasare a el codigo chuck norris
            for(int final=0;final<contador;final++){
                //si bloque1=1 entonces estamos en el segundo bloque y se le agrega un cero si continua siendo el mismo del primer bloque unocero
                if(bloque1==1){
                    if(reverso[final]==unocero)
                    {
                       chuck_norris[indice]='0';indice++;
                    }
                    else
                    {
                            chuck_norris[indice]=' ';indice++;
                            bloque1=0;                       
                    }
                }
                //------------------------------------
                if(reverso[final]==1 && bloque1==0) //si estamos en el primer bloque y es un uno escribe en la respuesta 0 0
                {
                    chuck_norris[indice]='0';indice++;
                    chuck_norris[indice]=' ';indice++;
                    chuck_norris[indice]='0';indice++;
                    bloque1=1; // cambiamos de bloque
                    unocero=1; //si cambia este numero es que se acabaron los unos repetidos
                }
                else if(reverso[final]==0 && bloque1==0) //si estamos en el primer bloque y es un cero escribe en la respuesta 00 0
                {
                    chuck_norris[indice]='0';indice++;
                    chuck_norris[indice]='0';indice++;
                    chuck_norris[indice]=' ';indice++;
                    chuck_norris[indice]='0';indice++;
                    bloque1=1;// cambiamos de bloque
                    unocero=0;//si cambia este numero es que se acabaron los unos repetidos
                }
                //----------------------
            }
            chuck_norris[indice]='\0';// se le agrega el final de la cadena
        }
    }
    printf("%s\n",chuck_norris);//escribe la respuesta

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?






buenas

Yoel Alejandro

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

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

daryo

#2
Cita de: yoel_alejandro en 21 Diciembre 2014, 17:14 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
buenas

Yoel Alejandro

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 (cpp) [Seleccionar]

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/**
* Auto-generated code below aims at helping you parse
* the standard input according to the problem statement.
**/


int main()
{
    char MESSAGE[100];
    fgets(MESSAGE,100,stdin);
    int size=strlen(MESSAGE);
    int letra;
    int Ascii;
    int binario[50];
    int temp;
    int contador=0;
    int reverso[700];
    int indice=0;
    char chuck_norris[700];
    int unocero=0;
    int unomas=0;
    short bloque1=0;

    // Write an action using printf(). DON'T FORGET THE TRAILING \n
    // To debug: fprintf(stderr, "Debug messages...\n");
    //---------------------------

    *chuck_norris = '\0'; /* inicializa cadena vacia */
    for (int a=0; a<size; a++) {
        if (MESSAGE[a]!='\0' && MESSAGE[a]!='\n')
        {
            letra=MESSAGE[a];//tomo el valor ascii
            if (letra<=64)
            {
                reverso[0]=0;
                unomas=1; //si es menor a el codigo ascii 64 se le pone un cero al comienzo eso es uno mas
            }
            //----------------------------
            contador=0;
            temp=letra;

            //convierto el numero a binario
            while (temp>0) {
                binario[contador]=(temp%2);
                temp=temp/2;
                contador++;
            }
            int conta3=contador-1; //contador es el largo de binario
            contador=contador+unomas;//si es menor a 64 se le pone un cero al comienzo eso es uno mas

            for (int inv=0; inv<contador; inv++)
            {
                reverso[inv+unomas]=binario[conta3];//  binario estan los numeros al reves asi que le doy la vuelta
                conta3--;
            }

            /* imprimimos en binario para ver el resultado */
            printf( "binario: " );
            for ( int i = 0; i < contador; i++ )
                putchar( '0' + reverso[i] );
            printf("\n");

            //ahora lo pasare a el codigo chuck norris

            /* ============= MI PROPUESTA DE CHUCK NORRIS =======================
             * --- Humildemente, Yoel.-
            */
            int i = 0;
            /* convertiremos el binario reverso a chuck norris */
            while ( i < contador ) {
                /* NOTA: al final de este while, la variable n contendra la cantidad de veces que se repite
                 * letra en el bloque actual
                 */
                int n = 0;
                letra = reverso[i];
                while ( i < contador && reverso[i] == letra ) {
                    n++;
                    i++;
                }

                /* ahora transcribe a la cadena chuck_norris apropiadamente segun el caso */
                if ( letra == 1 )
                    strcat( chuck_norris, "0 ");
                else if ( letra == 0 )
                    strcat( chuck_norris, "00 ");

                while ( --n >= 0 ) {
                    strcat( chuck_norris, "0" );
                }
                /* espacio para delimitar el fin de bloque */
                strcat( chuck_norris, " ");
            }
            strcat( chuck_norris, "| ");
            /*=============== FIN =================*/
        }
    }

#if 0
    for (int final=0; final<contador; final++) {
        //si bloque1=1 entonces estamos en el segundo bloque y se le agrega un cero si continua siendo el mismo del primer bloque unocero
        if (bloque1==1) {
            if (reverso[final]==unocero)
            {
                chuck_norris[indice]='0';
                indice++;
            }
            else
            {
                chuck_norris[indice]=' ';
                indice++;
                bloque1=0;
            }
        }
        //------------------------------------
        if (reverso[final]==1 && bloque1==0) //si estamos en el primer bloque y es un uno escribe en la respuesta 0 0
        {
            chuck_norris[indice]='0';
            indice++;
            chuck_norris[indice]=' ';
            indice++;
            chuck_norris[indice]='0';
            indice++;
            bloque1=1; // cambiamos de bloque
            unocero=1; //si cambia este numero es que se acabaron los unos repetidos
        }
        else if (reverso[final]==0 && bloque1==0) //si estamos en el primer bloque y es un cero escribe en la respuesta 00 0
        {
            chuck_norris[indice]='0';
            indice++;
            chuck_norris[indice]='0';
            indice++;
            chuck_norris[indice]=' ';
            indice++;
            chuck_norris[indice]='0';
            indice++;
            bloque1=1;// cambiamos de bloque
            unocero=0;//si cambia este numero es que se acabaron los unos repetidos
        }
        //----------------------
    }
    chuck_norris[indice]='\0';// se le agrega el final de la cadena
#endif

    printf("%s\n",chuck_norris);//escribe la respuesta

    return 0;
}


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!!!  :)
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

daryo

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 .
buenas

Yoel Alejandro

Pues en ese caso no hay problema, pues getchar() requiere <stdio.h>, que ya la tienes.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)