como hacer un generador??

Iniciado por jaime.urizar, 11 Julio 2012, 08:34 AM

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

DickGumshoe

#10
Mi código no se salta ninguna combinación (aunque, como ya he dicho, se para en un momento determinado por la ineficiencia) y además lo imprime bien  :huh:

EDITO: Además, genera el .txt... Sigo comprobando pero no encuentro errores...

0xDani

https://foro.elhacker.net/programacion_cc/brute_force_by_n0body-t278082.0.html
No se muy bien como va eso de recursividad e iteracion, pero tengo entendido por el post que eso es un generador recursivo. En el recopilatorio de sources interesantes hay otro iterativo, creo.

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

DickGumshoe

Cita de: daniyo en 12 Julio 2012, 02:31 AM
https://foro.elhacker.net/programacion_cc/brute_force_by_n0body-t278082.0.html
No se muy bien como va eso de recursividad e iteracion, pero tengo entendido por el post que eso es un generador recursivo. En el recopilatorio de sources interesantes hay otro iterativo, creo.

Saludos.

Gracias por el link! Es algo parecido, pero no exactamente igual.

Por cierto, ¡he editado el programa y ya va bien y es más eficiente! Lo que he modificado es la función numeros(). Ya no tiene mil y una condiciones, y el programa va perfecto (al menos por ahora no se me ha calado como otras veces, va escribiendo todo en el fichero correctamente, imprimiendo todo bien por pantalla... Aquí lo dejo:

#include <stdio.h>

FILE *fp;

void numeros(char *Letras, int n)
{
int i;
for(i=0;i<100000;i++)
{
     printf("%s%.5d\n",Letras, i);
     fprintf(fp, "%s%.5d\n", Letras, i);
}

}

void PrimeraLetra(char *Letras, int n)
{

    numeros(Letras, n);
    Letras[n]++; //Pasamos al siguiente carácter [al siguiente valor ASCII]
    if(Letras[n] <= 90) PrimeraLetra(Letras, n); /*90 es el valor ASCII de  'Z'. Si no se ha superado
                                                                                  ese valor, significa que el nuevo carácter está
                                                                                  comprendido entre la 'A' y la 'Z', y, por tanto, es
                                                                                  un carácter de los que queremos generar. Así, llamamos
                                                                                  a la función de nuevo.*/
    else Letras[n] = 65;
}

void SegundaLetra(char *Letras, int n) //Algo similar a la función anterior.
{
    PrimeraLetra(Letras, n);
    Letras[n-1]++;
    if(Letras[n-1] <= 90) SegundaLetra(Letras, n);
    else Letras[n-1] = 65;
}

void TerceraLetra(char *Letras, int n)
{
    SegundaLetra(Letras, n);
    Letras[n-2]++;
    if(Letras[n-2] <= 90) TerceraLetra(Letras, n);
    else Letras[n-2] = 65;
}

void CuartaLetra(char *Letras, int n)
{
    TerceraLetra(Letras, n);
    Letras[n-3]++;
    if(Letras[n-3] <= 90) CuartaLetra(Letras, n);
    else  Letras[n-3] = 65;
}

void QuintaLetra(char *Letras, int n)
{
    CuartaLetra(Letras, n);
    Letras[n-4]++;
    if(Letras[n-4] <= 90) QuintaLetra(Letras, n);
    else Letras[n-4] = 65;
}

int main()
{
    char Letras[] = "AAAAA";
    fp = fopen("combinacion.txt", "w");
    QuintaLetra(Letras, 4);

    fclose(fp);
    return 0;
}


¡A ver si me animo y sigo editándolo para hacerlo aún mejor!

Saludos!

dato000

#13

FILE *fp;

void numeros(char *Letras, int n)
{
int i;
for(i=0;i<100000;i++)
{
    printf("%s%.5d\n",Letras, i);
    fprintf(fp, "%s%.5d\n", Letras, i);
}

}


No termino de entender porque debe haber printf y fprint??? no es suficiente imprimir el valor en el archivo?? (fprint)? o eso solo imprime el valor en el archivo más no proporciona una salida en consola??

y sobre el archivo combinacion.txt, en donde se crea?????? al cerrarse el archivo se elimina???

Es increible el tiempo que tomo para imprimir todos los caracteres desde "AAAAA" hasta "ZZZZZ", el primer intento tuyo hizo que se bloqueara la terminal, con el fp (hey esa es otra, porque debe referenciarse *fp??) funciono mejor, aunque pues viendo el código, pues todas las funciones de quinta hasta primera letra se parecen bastante.  No soy un experto, pero intentare aligerar tanta linea.


---------------------------------------------------------------------------------------------------

Editado: Viejo me salieron nuevas dudas modificando un poco el código, viejo, quise imprimir desde "AAAAA" hasta "FFFFF", y me surgio una duda pues me salian valores númericos cuando salia en terminal, mirando la funcion numeros(char *Letras, int n) me encontre que imprimes el caracter junto con ".5%d" que es el valor numerico que representa el caracter, porque haces eso??? es por referencia?? pero si solo lo estas imprimiendo?? y porque no salia ese caracter en el codigo original??


por ende lo deje así:


#include <stdio.h>

FILE *fp;

void numeros(char *Letras, int n)
{
int i;
for(i=0;i<1;i++)
{
    printf("%s\n",Letras, i);
    fprintf(fp, "%s%.5d\n", Letras, i);
}

}

void PrimeraLetra(char *Letras, int n)
{

   numeros(Letras, n);
   Letras[n]++;
   if(Letras[n] <= 70) PrimeraLetra(Letras, n);
   else Letras[n] = 65;
}

void SegundaLetra(char *Letras, int n)
{
   PrimeraLetra(Letras, n);
   Letras[n-1]++;
   if(Letras[n-1] <= 70) SegundaLetra(Letras, n);
   else Letras[n-1] = 65;
}

void TerceraLetra(char *Letras, int n)
{
   SegundaLetra(Letras, n);
   Letras[n-2]++;
   if(Letras[n-2] <= 70) TerceraLetra(Letras, n);
   else Letras[n-2] = 65;
}

void CuartaLetra(char *Letras, int n)
{
   TerceraLetra(Letras, n);
   Letras[n-3]++;
   if(Letras[n-3] <= 70) CuartaLetra(Letras, n);
   else  Letras[n-3] = 65;
}

void QuintaLetra(char *Letras, int n)
{
   CuartaLetra(Letras, n);
   Letras[n-4]++;
   if(Letras[n-4] <= 70) QuintaLetra(Letras, n);
   else Letras[n-4] = 65;
}

int main()
{
   char Letras[] = "AAAAA";
   fp = fopen("combinacion.txt", "w");
   QuintaLetra(Letras, 4);

   fclose(fp);
   return 0;
}



Aun estoy mirando las formas de reducir el codigo...

Imprimir hasta "ZZZZZ" toma demasiado tiempo XD



DickGumshoe

Pongo printf y fprintf porque fprintf no imprime en consola, y es bueno ir viendo por dónde va.

El archivo se crea en la misma carpeta donde ejecutas el .exe, y no se borra (a no ser que lo hagas tú manualmente).

Al nombre de la variable le he puesto fp, pero puedes ponerle cualquier otro nombre. A mí se me ocurre cómo poder simplificar un poco el código, pero para ello necesitaré poner en una función muchos condicionales. Lo intentaré, a ver qué pasa...

Saludos!


dato000

Cita de: DickGumshoe en 12 Julio 2012, 17:24 PM
Pongo printf y fprintf porque fprintf no imprime en consola, y es bueno ir viendo por dónde va.

ah! como pensaba imprime en el archivo verdad???

Cita de: DickGumshoe en 12 Julio 2012, 17:24 PM
El archivo se crea en la misma carpeta donde ejecutas el .exe, y no se borra (a no ser que lo hagas tú manualmente).
pues jajaj yo lo compilo desde emacs en linux mint asi que pues...
pero es verdad se crea contiguo al compilado, antes no lo veia, pero ya todo va bien, aunque mira como imprime:

Citar
Recuerda que imprimo desde 'A' hasta 'F'

AAAAA00000
AAAAB00000
...
...
...
FFFFE00000
FFFFF00000

no entiendo esos numeros... de verdad que no me queda claro, es un dword o algo??


Cita de: DickGumshoe en 12 Julio 2012, 17:24 PM
Al nombre de la variable le he puesto fp, pero puedes ponerle cualquier otro nombre. A mí se me ocurre cómo poder simplificar un poco el código, pero para ello necesitaré poner en una función muchos condicionales. Lo intentaré, a ver qué pasa...

Saludos!

no si yo se que es un nombre, pero mi pregunta es porque se define como un tipo FILE *tp, porque se usa como una referencia?? es un archivo apuntando a algo, o que significa??

muchos condicionales...muchos condicionales???? ummmmmmmmm yo estaba pensando en recursividad, aun no me funciona, pero sigo viendo.

Cuando imprimia TODO, la cpu llego a un 60% de uso (quede o.O cuando vi esto!) y me pregunto porque llego a ese punto?? parece que en memoria no consumio tanto.



DickGumshoe

Sí, imprime en el archivo.

File *fp es un puntero porque el programa necesita un puntero a un archivo para leer de este mismo o escribir en él.

¿Eso te imprime? A mí me imprime:

AAAAA00000
AAAAA00001
...
ZZZZZ99999

Y mientras el programa está en ejecución, llega al 100% de la CPU (y eso que tengo 6GB de RAM...), y sin embargo, ahora que estoy usando bastantes programas a la vez, estoy usando un 9%...

A ver si conseguimos hacer más eficiente el programa! Es un reto bastante divertido  :D

SXF

Por cierto y como que 14348907000000 ?¿ si solo se ha generado 7777 combinaciones con el programa.

SXF

Ese es el problema de usar tanta recursividad  el programa hace demasiado llamadas en foma de arbol, si se hiciera iterativo en ves de recursivo....

DickGumshoe

#19
Cita de: SXF en 12 Julio 2012, 18:57 PM
Ese es el problema de usar tanta recursividad  el programa hace demasiado llamadas en foma de arbol, si se hiciera iterativo en ves de recursivo....

¿7777 combinaciones? Son demasiado pocas. A mí me hace todas (comprobado desde el fichero que genera) y son muchísimas más...

Edito:

Hay 2,75854735 × 1015 combinaciones, creo.

Saludos!