RETOS C++

Iniciado por Stakewinner00, 20 Septiembre 2012, 18:20 PM

0 Miembros y 10 Visitantes están viendo este tema.

do-while

#20
1.

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

#define DIM 100

int main(int argc, char *argv[])
{
   char texto[DIM],*cifras[]={"cero","uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve"};
   int i;

   do{
       if(!fgets(texto,DIM,stdin))
           return 0;

       for(i = 0 ; texto[i] ; i++)
           if(texto[i] >= '0' && texto[i] <= '9')
               printf("%s\n",cifras[texto[i] - '0']);

   }while(texto[strlen(texto) - 1] != '\n');

   return 0;
}


Código (cpp) [Seleccionar]

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *agrv[])
{
   char *cifras[] = {"cero","uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve"};
   string texto;

   getline(cin,texto);

   for(int i = 0 ; i < texto.length() ; i++)
       if(texto[i] >= '0' && texto[i] <= '9')
           cout << cifras[texto[i] - '0'] << endl;

   return 0;
}


Y mas eficiente:
Código (cpp) [Seleccionar]

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *agrv[])
{
   char *cifras[] = {"cero","uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve"};
   string texto;

   getline(cin,texto);

    //no se dice nada sobre el orden
   for(int i = texto.length() - 1 ; i >= 0 ; i--)
       if(texto[i] >= '0' && texto[i] <= '9')
           cout << cifras[texto[i] - '0'] << endl;

   return 0;
}


2. Faltan datos: ¿Nombre del fichero? ¿Tipo de fichero? (binario/texto) ¿Leer completo, por bloques de una cantidad determinada de bytes, por palabras...?

3.

#include <stdio.h>

int main(int argc, char *argv[])
{
   int max, num,i;

   scanf("%d",&max);

   for(i = 1 ; i < 4 ; i++)
   {
       scanf("%d", &num);
       if(num > max)
           max = num;
   }

   printf("Max: %d\n",max);

   return 0;
}


4.
Código (cpp) [Seleccionar]

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
   string min, palabra;
   int i;

   cin >> min;

   for(i = 1 ; i < 4 ; i++)
   {
       cin >> palabra;

       if(palabra < min)
           min = palabra;
   }

   cout << min;

   return 0;
}


5. Faltan datos: ¿Alfabeto? ¿Longitud de la clave?
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Stakewinner00

#21
perdon  por los que se confundieron con el punto 4 fue error mio.

Estoy mirando los codigos y sumando los puntos.

do-while, en los que faltan datos es libre

ecfisa, en tu codigo falta un include despues lo añado

do-while

#22
2.

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

int main(int argc, char *argv[])
{
   FILE *f;
   char *contenido;
   unsigned long longitud;

   f=fopen("algunfichero","rb");

   fseek(f,0,SEEK_END);

   if(!(contenido = malloc(longitud = ftell(f))))
       return -1;

   fseek(f,0,SEEK_SET);

   fread(contenido,longitud,1,f);

   fclose(f);

   free(contenido);

   return 0;
}


5.
Este crashea con alfabetos de mas de 18 caracteres y longitud 6
Código (cpp) [Seleccionar]

/*
*  linea de comandos:
*      nombreprograma alfabeto longitud
*/

#include <iostream>
#include <list>
#include <string>
#include <cstring>
#include <cstdlib>

using namespace std;

unsigned long convertir(char *s);
void bruteforce(list<string> &resultado,char *alfabeto,unsigned long longitud);

int main(int argc, char *argv[])
{
   list<string> resultado;
   unsigned long l;

   if(argc != 3)
   {
       cerr << argv[0] << " alfabeto longitud" << endl;
       return -1;
   }

   if(!(l = strlen(argv[1])))
   {
       cerr << argv[0] << " alfabeto longitud" << endl;
       return -1;
   }


   //eliminamos caracteres repetidos del alfabeto
   for(int i = 0 ; i < strlen(argv[1]) ; i++)
       if(strchr(argv[1] + i + 1 , argv[1][i]))
       {
           memmove(argv[1] + i ,argv[1] + i  + 1, (l--) - i );
           i--;
       }

   //nos aseguramos de que el segundo argumento sea numerico
   for(int i = 0 ; argv[2][i] ; i++)
       if(argv[2][i] < '0' || argv[2][i] > '9')
       {
           cerr << argv[0] << " alfabeto longitud" << endl;
           return -1;
       }

   bruteforce(resultado,argv[1],convertir(argv[2]));

   for(list<string>::iterator it = resultado.begin() ; it != resultado.end() ; it++)
       cout << (*it) << endl;

   return 0;
}

unsigned long convertir(char *s)
{
   unsigned long ret = 0;

   for(int i = 0 ; s[i] ; i++)
   {
       ret *= 10;
       ret += s[i] - '0';
   }

   return ret;
}

void bruteforce(list<string> &resultado,char *alfabeto,unsigned long longitud)
{
   static string cadena;
   static unsigned long posicion = 0;

   if(posicion == longitud)
   {
       //si hemos llegado a la ultima posicion almacenamos la variacion
       resultado.push_back(cadena);
       return;
   }

   //si es la primera llamada damos la longitud deseada a la cadena
   if(posicion == 0)
       cadena.resize(longitud);

   //para cada una de los caracteres del alfabeto
   for(int i = 0 ; alfabeto[i] ; i++)
   {
       cadena[posicion] = alfabeto[i]; //asignamos a la posicion correspondiente el caracter del alfabeto.

       //avanzamos una posicion
       posicion++;

       //y calculamos el siguiente caracter
       bruteforce(resultado , alfabeto , longitud);

       //volvemos a la posicion original
       posicion--;
   }

   //posicion termina a cero para la siguiente llamada
    if(!posicion)
        cadena.resize(0);
}


Alternativa:
Código (cpp) [Seleccionar]

/*
*  linea de comandos:
*      nombreprograma alfabeto longitud
*/

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>

using namespace std;

unsigned long convertir(char *s);
void bruteforce(char *alfabeto,unsigned long longitud);

int main(int argc, char *argv[])
{
   unsigned long l;

   if(argc != 3)
   {
       cerr << argv[0] << " alfabeto longitud" << endl;
       return -1;
   }

   if(!(l = strlen(argv[1])))
   {
       cerr << argv[0] << " alfabeto longitud" << endl;
       return -1;
   }


   //eliminamos caracteres repetidos del alfabeto
   for(int i = 0 ; i < strlen(argv[1]) ; i++)
       if(strchr(argv[1] + i + 1 , argv[1][i]))
       {
           memmove(argv[1] + i ,argv[1] + i  + 1, (l--) - i );
           i--;
       }

   //nos aseguramos de que el segundo argumento sea numerico
   for(int i = 0 ; argv[2][i] ; i++)
       if(argv[2][i] < '0' || argv[2][i] > '9')
       {
           cerr << argv[0] << " alfabeto longitud" << endl;
           return -1;
       }

   bruteforce(argv[1],convertir(argv[2]));

   return 0;
}

unsigned long convertir(char *s)
{
   unsigned long ret = 0;

   for(int i = 0 ; s[i] ; i++)
   {
       ret *= 10;
       ret += s[i] - '0';
   }

   return ret;
}

void bruteforce(char *alfabeto,unsigned long longitud)
{
   static string cadena;
   static unsigned long posicion = 0;

   if(posicion == longitud)
   {
       //si hemos llegado a la ultima posicion almacenamos la variacion
       cout << (cadena) << endl;
       return;
   }

   //si es la primera llamada damos la longitud deseada a la cadena
   if(posicion == 0)
       cadena.resize(longitud);

   //para cada una de los caracteres del alfabeto
   for(int i = 0 ; alfabeto[i] ; i++)
   {
       cadena[posicion] = alfabeto[i]; //asignamos a la posicion correspondiente el caracter del alfabeto.

       //avanzamos una posicion
       posicion++;

       //y calculamos el siguiente caracter
       bruteforce(alfabeto , longitud);

       //volvemos a la posicion original
       posicion--;
   }

   //posicion termina a cero para la siguiente llamada
    if(!posicion)
        cadena.resize(0);
}
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Stakewinner00

#23
do-while el 2 no compila

a.cpp:14: ANSI C++ forbids implicit conversion from `void *' in assignment

el otro te subo los puntos

quien haga otro programa más rápido que el de el ganara más puntos
o si alguien lo hace más lento ganaras mas puntos tu do-while

do-while

¡Buenas!


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

int main(int argc, char *argv[])
{
   FILE *f;
   char *contenido;
   unsigned long longitud;

   f=fopen("algunfichero","rb");

   fseek(f,0,SEEK_END);

   if(!(contenido = (char*) malloc(longitud = ftell(f))))
       return -1;

   fseek(f,0,SEEK_SET);

   fread(contenido,longitud,1,f);

   fclose(f);

   free(contenido);

   return 0;
}


Prueba ahora, que en C++ me parece que no se puede asignar un punter void a un puntero no void. Obliga a hacer el cast.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Stakewinner00

Cita de: do-while en 21 Septiembre 2012, 16:48 PM
¡Buenas!


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

int main(int argc, char *argv[])
{
   FILE *f;
   char *contenido;
   unsigned long longitud;

   f=fopen("algunfichero","rb");

   fseek(f,0,SEEK_END);

   if(!(contenido = (char*) malloc(longitud = ftell(f))))
       return -1;

   fseek(f,0,SEEK_SET);

   fread(contenido,longitud,1,f);

   fclose(f);

   free(contenido);

   return 0;
}


Prueba ahora, que en C++ me parece que no se puede asignar un punter void a un puntero no void. Obliga a hacer el cast.

¡Saludos!

ami no me salta ningun error pero no me habre ningun archivo ya probe de crear un archivo con ese nombre y camiar el nombre pero no muestra el texto del documento

0xDani

El programa de do-while que es el crackeador de md5 o el generador de diccionarios? Lo digo porque ya he solucionado lo de que no escribiera en el mio.

Es simple, pero se puede hacer mas complejo.


#include <stdio.h>

int main()
{
char vars[6];
vars[5]='\n';
FILE* diccionario = fopen("diccionario", "w");
for(vars[0]='a'; vars[0]<'z'; vars[0]++)
{
   for(vars[1]='a'; vars[1]<'z'; vars[1]++)
   {
     for(vars[2]='a'; vars[2]<'z'; vars[2]++)
      {
        for(vars[3]='a';vars[3]<'z'; vars[3]++)
         {

          for(vars[4]='a';vars[4]<'z'; vars[4]++)
           {fprintf(diccionario, "%s", vars);}
         }
      }
   }
}
fclose(diccionario);
return 0;
}


Es C, ahora lo subo en C++.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Stakewinner00

Cita de: 0xDani en 21 Septiembre 2012, 16:58 PM
El programa de do-while que es el crackeador de md5 o el generador de diccionarios? Lo digo porque ya he solucionado lo de que no escribiera en el mio.

Es simple, pero se puede hacer mas complejo.


#include <stdio.h>

int main()
{
char vars[6];
vars[5]='\n';
FILE* diccionario = fopen("diccionario", "w");
for(vars[0]='a'; vars[0]<'z'; vars[0]++)
{
   for(vars[1]='a'; vars[1]<'z'; vars[1]++)
   {
     for(vars[2]='a'; vars[2]<'z'; vars[2]++)
      {
        for(vars[3]='a';vars[3]<'z'; vars[3]++)
         {

          for(vars[4]='a';vars[4]<'z'; vars[4]++)
           {fprintf(diccionario, "%s", vars);}
         }
      }
   }
}
fclose(diccionario);
return 0;
}


Es C, ahora lo subo en C++.

el suyo es el de fuerza bruta de momento dowhile va ganando haber si lo superas

do-while

¡Buenas!

¿A que te refieres con un crackeador de MD5? ¿A redibir como argumento un hash y generar una cadena que de el mismo hash?
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

0xDani

Cita de: Stakewinner00 en 21 Septiembre 2012, 16:59 PM
el suyo es el de fuerza bruta de momento dowhile va ganando haber si lo superas

Ok, pero yo gano puntos o no? Se me ha adelantado por segundos :-[

Aqui esta en C++:

Código (cpp) [Seleccionar]
#include <fstream>

int main()
{
char vars[6];
vars[5]='\n';
ofstream diccionario.open("diccionario", ios::out);
for(vars[0]='a'; vars[0]<'z'; vars[0]++)
{
   for(vars[1]='a'; vars[1]<'z'; vars[1]++)
   {
     for(vars[2]='a'; vars[2]<'z'; vars[2]++)
      {
        for(vars[3]='a';vars[3]<'z'; vars[3]++)
         {

          for(vars[4]='a';vars[4]<'z'; vars[4]++)
           {diccionario.write(vars, 6);}
         }
      }
   }
}
diccionario.close();
return 0;
}
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM