Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jaime.urizar en 11 Julio 2012, 08:34 am



Título: como hacer un generador??
Publicado por: jaime.urizar en 11 Julio 2012, 08:34 am
hola amigos

les pido ayuda con algo que vi desde hace mucho, es como realizar un generador que muestre como resultado:

AAAAA
AAAAB
AAAAC
.........
.........
ZZZZZ

y algo mucho mas desafiante que no pude ni encontrar partes en internet y bueno mi conocimiento no es tan amplio pero decearia aprender a poder generar un..


AAAAA00000
AAAAA00001
AAAAA00002
....
....
....
AAAAB00000
AAAAB00001
....
.....
ZZZZZ99999

solo pude sacar cuantos resultados tendre :-( (son 14348907000000 posibles combinaciones)


una ayudita porfavor enserio me mata la curiosidad de aprender a hacer un contador o generador de ese tipo, y gracias de antemano por todo


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 11 Julio 2012, 14:06 pm
Al ver este tema, me ha parecido interesante y he creado uno del primer tipo que pides (solo con letras).

Por ahora solo tiene todas las posibles combinaciones de cinco caracteres comprendidos entre la 'A' a 'Z'. Después lo mejoraré para que acepte números y para que sea de n caracteres. Eso sí, creo que el programa no es muy eficiente, así que también tengo que corregir este punto.

Código
  1. #include <stdio.h>
  2.  
  3. void PrimeraLetra(char *Letras, int n)
  4. {
  5.    printf("%s\n", Letras);
  6.    Letras[n]++;
  7.    if(Letras[n] <= 90) PrimeraLetra(Letras, n);
  8.    else Letras[n] = 65;
  9. }
  10.  
  11. void SegundaLetra(char *Letras, int n)
  12. {
  13.    PrimeraLetra(Letras, n);
  14.    Letras[n-1]++;
  15.    if(Letras[n-1] <= 90) SegundaLetra(Letras, n);
  16.    else Letras[n-1] = 65;
  17. }
  18.  
  19. void TerceraLetra(char *Letras, int n)
  20. {
  21.    SegundaLetra(Letras, n);
  22.    Letras[n-2]++;
  23.    if(Letras[n-2] <= 90) TerceraLetra(Letras, n);
  24.    else Letras[n-2] = 65;
  25. }
  26.  
  27. void CuartaLetra(char *Letras, int n)
  28. {
  29.    TerceraLetra(Letras, n);
  30.    Letras[n-3]++;
  31.    if(Letras[n-3] <= 90) CuartaLetra(Letras, n);
  32.    else  Letras[n-3] = 65;
  33. }
  34.  
  35. void QuintaLetra(char *Letras, int n)
  36. {
  37.    CuartaLetra(Letras, n);
  38.    Letras[n-4]++;
  39.    if(Letras[n-4] <= 90) QuintaLetra(Letras, n);
  40.    else Letras[n-4] = 65;
  41. }
  42.  
  43. int main()
  44. {
  45.    char Letras[] = "AAAAA";
  46.    QuintaLetra(Letras, 4);
  47.    return 0;
  48. }
  49.  

Si tienes alguna duda pregunta  :D

Saludos.


Título: Re: como hacer un generador??
Publicado por: SXF en 11 Julio 2012, 18:16 pm
Una pregunta 90 y 65 que indican?¿


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 11 Julio 2012, 18:19 pm
Una pregunta 90 y 65 que indican?¿

Se me olvidó poner un comentario para explicarlo. 65 es el valor ASCII del carácter 'A', y 90 el del carácter 'Z'.

Sé que también se podría poner así:

Código
  1. if(Letras[n] <= 'Z') PrimeraLetra(Letras, n);

Pero he cogido la costumbre de poner el valor en ASCII.


Título: Re: como hacer un generador??
Publicado por: jaime.urizar en 11 Julio 2012, 19:09 pm
Gracias SXF es muy bueno, para agregar los números sería un buen desafío ya que tendríamos que unificar todo el método "LETRA X Número" gracias de nuevo SXF me daba curiosidad saber como genera ese tipo de código, dime algo más vi en algunos códigos que guardan lo que imprimen en pantalla con una extensión ".txt" como hacen eso???


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 11 Julio 2012, 19:43 pm
He editado mi código para que puedas poner todo en un archivo. Aquí te lo dejo:

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void PrimeraLetra(char *Letras, int n)
  6. {
  7.    printf("%s\n", Letras); //Imprimimos
  8.    fputs(Letras, fp);
  9.    fputc('\n', fp);
  10.    Letras[n]++; //Pasamos al siguiente carácter [al siguiente valor ASCII]
  11.    if(Letras[n] <= 90) PrimeraLetra(Letras, n); /*90 es el valor ASCII de  'Z'. Si no se ha superado
  12.                                                                                   ese valor, significa que el nuevo carácter está
  13.                                                                                   comprendido entre la 'A' y la 'Z', y, por tanto, es
  14.                                                                                   un carácter de los que queremos generar. Así, llamamos
  15.                                                                                   a la función de nuevo.*/
  16.    else Letras[n] = 65;
  17. }
  18.  
  19. void SegundaLetra(char *Letras, int n) //Algo similar a la función anterior.
  20. {
  21.    PrimeraLetra(Letras, n);
  22.    Letras[n-1]++;
  23.    if(Letras[n-1] <= 90) SegundaLetra(Letras, n);
  24.    else Letras[n-1] = 65;
  25. }
  26.  
  27. void TerceraLetra(char *Letras, int n)
  28. {
  29.    SegundaLetra(Letras, n);
  30.    Letras[n-2]++;
  31.    if(Letras[n-2] <= 90) TerceraLetra(Letras, n);
  32.    else Letras[n-2] = 65;
  33. }
  34.  
  35. void CuartaLetra(char *Letras, int n)
  36. {
  37.    TerceraLetra(Letras, n);
  38.    Letras[n-3]++;
  39.    if(Letras[n-3] <= 90) CuartaLetra(Letras, n);
  40.    else  Letras[n-3] = 65;
  41. }
  42.  
  43. void QuintaLetra(char *Letras, int n)
  44. {
  45.    CuartaLetra(Letras, n);
  46.    Letras[n-4]++;
  47.    if(Letras[n-4] <= 90) QuintaLetra(Letras, n);
  48.    else Letras[n-4] = 65;
  49. }
  50.  
  51. int main()
  52. {
  53.    char Letras[] = "AAAAA";
  54.    fp = fopen("combinacion.txt", "w");
  55.    QuintaLetra(Letras, 4);
  56.    fclose(fp);
  57.    return 0;
  58. }
  59.  

Las funciones que he utilizado, para que veas cómo lo he hecho, son:

fopen (http://www.cplusplus.com/reference/clibrary/cstdio/fopen/), fclose (http://www.cplusplus.com/reference/clibrary/cstdio/fclose/), fputc (http://www.cplusplus.com/reference/clibrary/cstdio/fputc/), fputs (http://www.cplusplus.com/reference/clibrary/cstdio/fputs/)

Cuando vaya editando el código iré poniéndolo, a ver si después lo hago más eficiente y además meto los números.

Saludos.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 11 Julio 2012, 21:54 pm
He terminado el código para que muestre todas las combinaciones posibles desde AAAAA00000 hasta ZZZZZ99999.

El algoritmo está bien, sin embargo, es tan ineficiente que a mitad del programa me sale un mensaje que dice "Generador.exe dejó de funcionar. Windows está buscando una solución al problema", pulso en aceptar y se cierra el programa...

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7.    printf("%s\n", Letras); //Imprimimos
  8.    fputs(Letras, fp);
  9.    fputc('\n', fp);
  10.  
  11.    Letras[n+5]++;
  12.  
  13.    if(Letras[n+2] > 57)
  14.    {
  15.        Letras[n+2] = 48;
  16.        Letras[n+1]++;
  17.    }
  18.    else if(Letras[n+3] > 57)
  19.    {
  20.        Letras[n+3] = 48;
  21.        Letras[n+2]++;
  22.    }
  23.    else if (Letras[n+4] > 57)
  24.    {
  25.        Letras[n+4] = 48;
  26.        Letras[n+3]++;
  27.    }
  28.    else if(Letras[n+5] > 57)
  29.    {
  30.        Letras[n+5] = 48;
  31.        Letras[n+4]++;
  32.    }
  33.    if(Letras[n+1] <= 57) numeros(Letras, n);
  34.  
  35. }
  36.  
  37. void PrimeraLetra(char *Letras, int n)
  38. {
  39.  
  40.    numeros(Letras, n);
  41.    Letras[n]++; //Pasamos al siguiente carácter [al siguiente valor ASCII]
  42.    if(Letras[n] <= 90) PrimeraLetra(Letras, n); /*90 es el valor ASCII de  'Z'. Si no se ha superado
  43.                                                                                   ese valor, significa que el nuevo carácter está
  44.                                                                                   comprendido entre la 'A' y la 'Z', y, por tanto, es
  45.                                                                                   un carácter de los que queremos generar. Así, llamamos
  46.                                                                                   a la función de nuevo.*/
  47.    else Letras[n] = 65;
  48. }
  49.  
  50. void SegundaLetra(char *Letras, int n) //Algo similar a la función anterior.
  51. {
  52.    PrimeraLetra(Letras, n);
  53.    Letras[n-1]++;
  54.    if(Letras[n-1] <= 90) SegundaLetra(Letras, n);
  55.    else Letras[n-1] = 65;
  56. }
  57.  
  58. void TerceraLetra(char *Letras, int n)
  59. {
  60.    SegundaLetra(Letras, n);
  61.    Letras[n-2]++;
  62.    if(Letras[n-2] <= 90) TerceraLetra(Letras, n);
  63.    else Letras[n-2] = 65;
  64. }
  65.  
  66. void CuartaLetra(char *Letras, int n)
  67. {
  68.    TerceraLetra(Letras, n);
  69.    Letras[n-3]++;
  70.    if(Letras[n-3] <= 90) CuartaLetra(Letras, n);
  71.    else  Letras[n-3] = 65;
  72. }
  73.  
  74. void QuintaLetra(char *Letras, int n)
  75. {
  76.    CuartaLetra(Letras, n);
  77.    Letras[n-4]++;
  78.    if(Letras[n-4] <= 90) QuintaLetra(Letras, n);
  79.    else Letras[n-4] = 65;
  80. }
  81.  
  82. int main()
  83. {
  84.    char Letras[] = "AAAAA00000";
  85.    fp = fopen("combinacion.txt", "w");
  86.    QuintaLetra(Letras, 4);
  87.  
  88.    fclose(fp);
  89.    return 0;
  90. }
  91.  

Me parece a mí que la dificultad de este problema está más en la eficiencia... Al menos tenemos ya para que nos haga desde AAAAA hasta ZZZZZ...

Saludos!


Título: Re: como hacer un generador??
Publicado por: jaime.urizar en 12 Julio 2012, 01:46 am
muchas gracias DickGumshoe lo estoy probando, mira yo encontre este codigo dame tu opinion de que tal esta:

{
char a,b,c,d,e,n1,n2,n3,n4,n5;

  for(a = 'A'; a<= 'Z'; a++)
   for(b = 'A'; b <= 'Z'; b++)
    for(c = 'A'; c <= 'Z'; c++)
     for(d = 'A'; d <= 'Z'; d++)
      for(e = 'A'; e <= 'Z'; e++)
       for(n1 = 0; n1 < 10; n1++)
        for(n2 = 0; n2 < 10; n2++)
         for(n3 = 0; n3 < 10; n3++)
          for(n4 = 0; n4 < 10; n4++)
           for(n5 = 0; n5 < 10; n5++)
             printf("%c%c%c%c%c%d%d%d%d%d\n",a,b,c,d,e,n1,n2,n3,n4,n5);
}



y una ultima pregunta como se utiliza para guardar lo que se imprime en pantalla en un ".txt"

probando tu codigo me di cuenta que imprime de esta manera:

AAAAIW:0232
AAAAIX:0233
AAAAIY:0234
AAAAIZ:0235


deberia de imprimir

AAAAIW00232
AAAAIW00233
AAAAIW00234
AAAAIW00235
AAAAIW00236
AAAAIW00237

se salta muchas combinaciones existentes
muchas gracias


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 12 Julio 2012, 02:10 am
Ese código debe salir también, pero yo hice el programa a mi manera porque me pareció muy típico eso de hacer tantos for anidados, y me gustó hacerlo de otra forma, con recursividad.

Eso sí, en ese código las variables n1, n2, n3, n4 y n5 son char, no debes imprimirlas como %d, y en el bucle for no es desde 0 hasta 9, sino que tienes que hacer desde 48 hasta 57 (valor ASCII de 0 y 9, respectivamente).

Para imprimirlo en un .txt tienes que declarar una variable así:

FILE *nombre_variable;

Entonces, para editar el .txt, eliges un nombre y el modo en que lo vas a abrir:

nombre_variable = fopen ("nombre_archivo.txt", "w");

En este caso es un .txt, pero también puedes poner .dat o la extensión que quieras. El modo en que abrimos el archivo es "w", (write, escritura). Pero hay muchos más. Para conocerlos, puedes ver el enlace que te pasé en un mensaje anterior con la función fopen() explicada.

Ya usas la función fputs() para poner una cadena en el fichero (también te pasé el enlace a cómo usarla).

Y para cerrar el fichero, poner:

fclose(nombre_variable);

A ver si conseguimos que nos salga (aunque el algoritmo mío está bien, pero no llega a terminar, no sé por qué, a ver si alguien me puede comentar por qué...)

Saludos!


Título: Re: como hacer un generador??
Publicado por: jaime.urizar en 12 Julio 2012, 02:25 am
probando tu codigo me di cuenta que imprime de esta manera:

AAAAIW:0232
AAAAIX:0233
AAAAIY:0234
AAAAIZ:0235


deberia de imprimir

AAAAIW00232
AAAAIW00233
AAAAIW00234
AAAAIW00235
AAAAIW00236
AAAAIW00237

se salta muchas combinaciones existentes ademas no genera el .txt
muchas gracias


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 12 Julio 2012, 02:28 am
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...


Título: Re: como hacer un generador??
Publicado por: 0xDani 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.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 12 Julio 2012, 07:50 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:

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7. int i;
  8. for(i=0;i<100000;i++)
  9. {
  10.     printf("%s%.5d\n",Letras, i);
  11.     fprintf(fp, "%s%.5d\n", Letras, i);
  12. }
  13.  
  14. }
  15.  
  16. void PrimeraLetra(char *Letras, int n)
  17. {
  18.  
  19.    numeros(Letras, n);
  20.    Letras[n]++; //Pasamos al siguiente carácter [al siguiente valor ASCII]
  21.    if(Letras[n] <= 90) PrimeraLetra(Letras, n); /*90 es el valor ASCII de  'Z'. Si no se ha superado
  22.                                                                                   ese valor, significa que el nuevo carácter está
  23.                                                                                   comprendido entre la 'A' y la 'Z', y, por tanto, es
  24.                                                                                   un carácter de los que queremos generar. Así, llamamos
  25.                                                                                   a la función de nuevo.*/
  26.    else Letras[n] = 65;
  27. }
  28.  
  29. void SegundaLetra(char *Letras, int n) //Algo similar a la función anterior.
  30. {
  31.    PrimeraLetra(Letras, n);
  32.    Letras[n-1]++;
  33.    if(Letras[n-1] <= 90) SegundaLetra(Letras, n);
  34.    else Letras[n-1] = 65;
  35. }
  36.  
  37. void TerceraLetra(char *Letras, int n)
  38. {
  39.    SegundaLetra(Letras, n);
  40.    Letras[n-2]++;
  41.    if(Letras[n-2] <= 90) TerceraLetra(Letras, n);
  42.    else Letras[n-2] = 65;
  43. }
  44.  
  45. void CuartaLetra(char *Letras, int n)
  46. {
  47.    TerceraLetra(Letras, n);
  48.    Letras[n-3]++;
  49.    if(Letras[n-3] <= 90) CuartaLetra(Letras, n);
  50.    else  Letras[n-3] = 65;
  51. }
  52.  
  53. void QuintaLetra(char *Letras, int n)
  54. {
  55.    CuartaLetra(Letras, n);
  56.    Letras[n-4]++;
  57.    if(Letras[n-4] <= 90) QuintaLetra(Letras, n);
  58.    else Letras[n-4] = 65;
  59. }
  60.  
  61. int main()
  62. {
  63.    char Letras[] = "AAAAA";
  64.    fp = fopen("combinacion.txt", "w");
  65.    QuintaLetra(Letras, 4);
  66.  
  67.    fclose(fp);
  68.    return 0;
  69. }
  70.  

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

Saludos!


Título: Re: como hacer un generador??
Publicado por: dato000 en 12 Julio 2012, 16:45 pm
Código
  1. FILE *fp;
  2.  
  3. void numeros(char *Letras, int n)
  4. {
  5. int i;
  6. for(i=0;i<100000;i++)
  7. {
  8.     printf("%s%.5d\n",Letras, i);
  9.     fprintf(fp, "%s%.5d\n", Letras, i);
  10. }
  11.  
  12. }
  13.  

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í:

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7. int i;
  8. for(i=0;i<1;i++)
  9. {
  10.     printf("%s\n",Letras, i);
  11.     fprintf(fp, "%s%.5d\n", Letras, i);
  12. }
  13.  
  14. }
  15.  
  16. void PrimeraLetra(char *Letras, int n)
  17. {
  18.  
  19.    numeros(Letras, n);
  20.    Letras[n]++;
  21.    if(Letras[n] <= 70) PrimeraLetra(Letras, n);
  22.    else Letras[n] = 65;
  23. }
  24.  
  25. void SegundaLetra(char *Letras, int n)
  26. {
  27.    PrimeraLetra(Letras, n);
  28.    Letras[n-1]++;
  29.    if(Letras[n-1] <= 70) SegundaLetra(Letras, n);
  30.    else Letras[n-1] = 65;
  31. }
  32.  
  33. void TerceraLetra(char *Letras, int n)
  34. {
  35.    SegundaLetra(Letras, n);
  36.    Letras[n-2]++;
  37.    if(Letras[n-2] <= 70) TerceraLetra(Letras, n);
  38.    else Letras[n-2] = 65;
  39. }
  40.  
  41. void CuartaLetra(char *Letras, int n)
  42. {
  43.    TerceraLetra(Letras, n);
  44.    Letras[n-3]++;
  45.    if(Letras[n-3] <= 70) CuartaLetra(Letras, n);
  46.    else  Letras[n-3] = 65;
  47. }
  48.  
  49. void QuintaLetra(char *Letras, int n)
  50. {
  51.    CuartaLetra(Letras, n);
  52.    Letras[n-4]++;
  53.    if(Letras[n-4] <= 70) QuintaLetra(Letras, n);
  54.    else Letras[n-4] = 65;
  55. }
  56.  
  57. int main()
  58. {
  59.    char Letras[] = "AAAAA";
  60.    fp = fopen("combinacion.txt", "w");
  61.    QuintaLetra(Letras, 4);
  62.  
  63.    fclose(fp);
  64.    return 0;
  65. }
  66.  
  67.  

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

Imprimir hasta "ZZZZZ" toma demasiado tiempo XD


Título: Re: como hacer un generador??
Publicado por: 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.

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!



Título: Re: como hacer un generador??
Publicado por: dato000 en 12 Julio 2012, 17:59 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???

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??


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.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 12 Julio 2012, 18:47 pm
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


Título: Re: como hacer un generador??
Publicado por: SXF en 12 Julio 2012, 18:54 pm
Por cierto y como que 14348907000000 ?¿ si solo se ha generado 7777 combinaciones con el programa.


Título: Re: como hacer un generador??
Publicado por: 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....


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 12 Julio 2012, 19:03 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!


Título: Re: como hacer un generador??
Publicado por: dato000 en 13 Julio 2012, 02:45 am
¿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!

jajaj seeee 7777 es algo minusculo realmente.

Código:
printf("%s%.5d\n",Letras, i);

lo deje a
Código:
printf("%s\n",Letras);

para no imprimir esos numeros, pues no entiendo porque lo dejaste, alguna info sobre el porque debe hacerse seria de gran ayuda.
Je en esta tarde me dedique a dormir por el cansancio que tenia, y hasta hace poco tengo que mirar otras cosas, pero me voy a dedicar a hacer este problema, como dices, es algo divertido mirar como podria dejar mejor el funcionamiento, si la recursividad es algo, ummm como decirlo, jodido, pero vale la pena entenderlo.


Título: Re: como hacer un generador??
Publicado por: xiruko en 13 Julio 2012, 06:11 am
una pregunta asi por curiosidad... cuanto os dura el programa ejecutandose y cuanto os ocupa el archivo generado?

lo pregunto porque yo para hacer esta combinacion mas corta "AAAA000 hasta ZZZZ9999" llevaba unos 20 minutos o mas y 35GB de archivo cuando le he dado a cancelar. no se si me he liado haciendo el programa o que...

gracias!


Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 06:37 am
te dejo este codigo en vb6...

http://foro.elhacker.net/programacion_visual_basic/palabras_aleatorias_sin_repeticion_ayuda-t296715.0.html

en si la parte que genera las combinaciones es este... muy simple y corto verdad?...

Código
  1.  
  2. Private Sub CombinateString(ByRef Str_String As String, Optional ByRef str_Fix As String, Optional ByRef Cancel As Boolean)
  3. Dim Lng_LenStr                                  As Long
  4. Dim Lng_LenStrIndex                             As Long
  5.    If Cancel Then Exit Sub
  6.    Lng_LenStr = Strings.Len(Str_String)
  7.    If Lng_LenStr <> 1 Then
  8.        For Lng_LenStrIndex = 1 To Lng_LenStr
  9.            Call CombinateString(Strings.Left$(Str_String, Lng_LenStrIndex - 1) & Strings.Mid$(Str_String, Lng_LenStrIndex + 1), str_Fix & Strings.Mid$(Str_String, Lng_LenStrIndex, 1), Cancel)
  10.        Next
  11.    Else
  12.        RaiseEvent StrOuput(str_Fix & Str_String, Cancel) ' <--- este en C++ seria un callback a un proceso X el cual otendria por un parametro la cadena combinada, se ejecutaria N veces... el segundo parametro seria una variable booleana para cancelar el generador de cadenas (combinaciones)...
  13.    End If
  14. End Sub
  15.  
  16.  

En unos segundos te lo subo en C++.

Duñlces Lunas.


Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 07:30 am
creo que la cague en mi post anterior... te dejo la funcion que hace lo que tu quieres.

Código
  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. string &AddWord(string &text) {
  6.    string::reverse_iterator it = text.rbegin();
  7.    for (; it != text.rend(); it++) {
  8.        ++(*it);
  9.        if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break;
  10.        (*it) = (islower(*it))? 'a': 'A';
  11.    }
  12.    return text;
  13. }
  14.  
  15. int main() {
  16.    string text = "ZZZx";
  17.    cout << AddWord(text) << endl;
  18.    cout << AddWord(text) << endl;
  19.    cout << AddWord(text) << endl;
  20.    cout << AddWord(text) << endl;
  21.    cout << AddWord(text) << endl;
  22.    cout << AddWord(text) << endl;
  23.    cout << AddWord(text) << endl;
  24.    cout << AddWord(text) << endl;
  25.    cout << AddWord(text) << endl;
  26.    cin.get();
  27.    return 0;
  28. }
  29.  
  30.  

y aquí el de las permutaciones del post anterior...

Código
  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. size_t permutaciones (string text, string textFix, void (*callback)(string, bool), bool cancel = false) {
  6.    size_t ret = 0;
  7.    if (cancel) return ret;
  8.    if (text.size()) {
  9.        for (register size_t i = 0; i < text.size(); i++) {
  10.            ret += permutaciones (text.substr(0, i) + text.substr(i + 1), textFix + text.substr(i, 1), callback, cancel);
  11.            if (cancel) return ret;
  12.        }
  13.    } else {
  14.        callback(textFix + text, cancel);
  15.    }
  16.    return ret;
  17. }
  18.  
  19. void showWord(string text, bool cancel) {
  20.    cout << text << endl;
  21. }
  22.  
  23. int main() {
  24.    permutaciones ("hola", "", showWord);
  25.    cin.get();
  26.    return 0;
  27. }
  28.  
  29.  

Dulces Lunas!¡.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 13:12 pm
Citar
jajaj seeee 7777 es algo minusculo realmente.


Código:
printf("%s%.5d\n",Letras, i);

lo deje a

Código:
printf("%s\n",Letras);

para no imprimir esos numeros, pues no entiendo porque lo dejaste, alguna info sobre el porque debe hacerse seria de gran ayuda.
Je en esta tarde me dedique a dormir por el cansancio que tenia, y hasta hace poco tengo que mirar otras cosas, pero me voy a dedicar a hacer este problema, como dices, es algo divertido mirar como podria dejar mejor el funcionamiento, si la recursividad es algo, ummm como decirlo, jodido, pero vale la pena entenderlo.

El %.5d debe ponerse porque en esta versión del código para mejorar la eficiencia hice que los números fueran separados de las letras.

Citar
una pregunta asi por curiosidad... cuanto os dura el programa ejecutandose y cuanto os ocupa el archivo generado?

lo pregunto porque yo para hacer esta combinacion mas corta "AAAA000 hasta ZZZZ9999" llevaba unos 20 minutos o mas y 35GB de archivo cuando le he dado a cancelar. no se si me he liado haciendo el programa o que...

gracias!

El tiempo exacto no lo sé, pero sí que tarda muchísimo en finalizar y ocupa también mucho... ¿Será malo para el ordenador?  :-[

Gracias por el código, BlackZeroX (Astaroth). Ahora los miro!

Saludos!

EDITO: Finalmente son 1 188 125 718 624 combinaciones posibles!


Título: Re: como hacer un generador??
Publicado por: 0xDani en 13 Julio 2012, 13:37 pm
11881125718624 combinaciones a 10 caracteres por combinacion, 118811257186240 x sizeof(char) = 118811257186240 bytes no es asi?

Saludos.

PD: Si hicieses un programa que crease varios fork() haciendo eso mismo, podrias colapsar un superordenador  :xD :xD


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 13:44 pm
Sí... Demasiada memoria ocupa...

Ahora me pongo a ver qué puedo hacer para mejorarlo, pero creo que no hay mucho que hacer salvo reducir el código..., porque las combinaciones, queramos o no, van a ser 11881125718624, y como dice daniyo eso serían 11881125718624 bytes... Bueno, ya veré sobre la marcha qué hago  :xD

Saludos!


Título: Re: como hacer un generador??
Publicado por: 0xDani en 13 Julio 2012, 14:20 pm
Sí... Demasiada memoria ocupa...

Ahora me pongo a ver qué puedo hacer para mejorarlo, pero creo que no hay mucho que hacer salvo reducir el código..., porque las combinaciones, queramos o no, van a ser 11881125718624, y como dice daniyo eso serían 11881125718624 bytes... Bueno, ya veré sobre la marcha qué hago  :xD

Saludos!

Te ha faltado un cero, piensa que son 10 caracteres por combinacion. 118811257186240  bytes = 116026618345,9375 KB = 113307244,47845459 MB = 110651,605935991 GB = 108,058208922 TB
 :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o

Creo que esta bien...


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 14:24 pm
Sí, copié mal tu resultado, pero sí que lleva el 0.

¿¿¡¡108,058208922 TB!!??  Por lo tanto, es imposible hacer el programa para ejecutarse en un ordenador "normal", ¿no? Aunque el mío sea bastante potente dudo que tenga 108,05 TB xD...

Saludos  :-[


Título: Re: como hacer un generador??
Publicado por: SXF en 13 Julio 2012, 14:30 pm
jejej había compilado el otro còdigo ... con razón ya me parecía extraño...


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 14:47 pm
jejej había compilado el otro còdigo ... con razón ya me parecía extraño...

Si compilaste el primer código que puse yo deberían haberte salido 11 881 376 combinaciones... Qué raro...



Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 15:03 pm
.
La cantidad de combinaciones desde A-Z (sin contar la Ñ) en una cadena de 10 segun este algoritmo es de (26 ^ 10) = 141167095653376 combinaciones posibles desde AAAAAAAAAA hasta ZZZZZZZZZZ.

Dulces Lunas!¡.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 15:08 pm
La cantidad de combinaciones desde A-Z en una cadena de 10 es  ¨(26 ^ 10) = 141167095653376

Dulces Lunas!¡.

Pero en el código que va de la A a la Z es de cinco caracteres por combinación, y por lo tanto es de 265= 11881376 combinaciones posibles.

Por cierto, a espera de que alguien conteste si es posible hacer el programa para ejecutarlo en un ordenador "normal", dejo la última versión que he hecho. En esta reduzco la extensión del código, le quito la mayor parte de las funciones recursivas y mejoro la eficiencia:

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7. int i;
  8. for(i=0;i<100000;i++)
  9. {
  10.     printf("%s%.5d\n",Letras, i);
  11.     fprintf(fp, "%s%.5d\n", Letras, i);
  12. }
  13. }
  14.  
  15. void Generador(char *Letras, int n)
  16. {
  17.    int count, resta=1, llamada;
  18.    while(llamada != 5)
  19.    {
  20.        numeros(Letras, n);
  21.        count = n;
  22.        Letras[n]++;
  23.        llamada = 0;
  24.        while(count >= 0)
  25.        {
  26.            if(Letras[count] > 90)
  27.            {
  28.                Letras[count] = 65;
  29.                Letras[n-resta]++;
  30.                llamada++;
  31.            }
  32.            count--;
  33.            resta++;
  34.        }
  35.    }
  36. }
  37. int main()
  38. {
  39.    char Letras[] = "AAAAA";
  40.    fp = fopen("combinacion.txt", "w");
  41.    Generador(Letras, 4);
  42.    fclose(fp);
  43.    return 0;
  44. }
  45.  

Saludos!


Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 15:19 pm
Queda claro que la cantidad esta dada por 26^N y debido a esto le hice una modificación a mi código...

http://foro.elhacker.net/programacion_cc/como_hacer_un_generador-t366597.0.html;msg1765220#msg1765220

Código
  1.  
  2. #include <iostream>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6. inline string &addWord(string &text) {
  7.    string::reverse_iterator it = text.rbegin();
  8.    for (; it != text.rend(); it++) {
  9.        ++(*it);
  10.        if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break;
  11.        (*it) = (islower(*it))? 'a': 'A';
  12.    }
  13.    return text;
  14. }
  15.  
  16. size_t addAllWord(string text, void (*callback)(string&, bool&) = NULL) {
  17.    bool cancel = false;
  18.    register size_t i = 0, lim = pow(26, text.size());
  19.    if (!callback) return lim;
  20.    for (;(i < lim) && (cancel ==false); i++) {
  21.        callback(addWord(text), cancel);
  22.    }
  23.    return i;
  24. }
  25.  
  26. void showWords(string& text, bool& cancel) {
  27.    cout << text << endl;
  28. }
  29.  
  30. int main() {
  31.    string text = "ZZZx";
  32.    cout << addAllWord(text, showWords) << endl;
  33.    cin.get();
  34.    return 0;
  35. }
  36.  
  37.  


Título: Re: como hacer un generador??
Publicado por: 0xDani en 13 Julio 2012, 15:22 pm
DickGumshoe, yo supongo que si se puede ejecutar en un ordenador "normal", sin salida por consola y sin almacenar el resultado en un archivo de texto claro >:D No en serio, quiza se pueda hacer con combinaciones de 4 o 5, a lo sumo 6 caracteres.

Saludos.


Título: Re: como hacer un generador??
Publicado por: dato000 en 13 Julio 2012, 15:23 pm
siempre se queda muuuuy lento cuando va como en "FMMMM" ummm supongo que un core 2 duo tambien demora bastante para esta tarea  :xD :xD

el codigo en visual es nuevo para mi, porque apenas si se algo de basic, y absolutamente nada de .NET o C#.

Citar
La cantidad de combinaciones desde A-Z en una cadena de 10 es  ¨(26 ^ 10) = 141167095653376

ouch ouch ouch, es en serio?????? ouch ouch ouch.

DickGumshoe, yo supongo que si se puede ejecutar en un ordenador "normal", sin salida por consola y sin almacenar el resultado en un archivo de texto claro >:D No en serio, quiza se pueda hacer con combinaciones de 4 o 5, a lo sumo 6 caracteres.

Saludos.

pues eso hice, lo deje en 5 caracteres, y de 'A' hasta 'F' funciona sin problemas. me podrian explicar como hicieron el calculo de permutaciones?? el clasico nCr???


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 15:32 pm
Daniyo, como bien dices, uno de 5 caracteres sí es posible ejecutarlo en un ordenador "normal", ya que el primer código que puse en este tema era de combinaciones desde AAAAA hasta ZZZZZ, y funcionaba perfectamente.

jaime.urizar (el autor del tema): Por lo que parece generar todas las combinaciones posibles desde AAAAA00000 hasta ZZZZZ99999 (sin mezclar letras y números) es imposible en un ordenador "normal". Pero eso no quiere decir que no tengamos bien el código, que era la finalidad del tema, y entonces supongo que nos quedaremos con el último, que es el más corto y eficiente:

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7. int i;
  8. for(i=0;i<100000;i++)
  9. {
  10.     printf("%s%.5d\n",Letras, i);
  11.     fprintf(fp, "%s%.5d\n", Letras, i);
  12. }
  13. }
  14.  
  15. void Generador(char *Letras, int n)
  16. {
  17.    int count, resta=1, llamada;
  18.    while(llamada != 5)
  19.    {
  20.        numeros(Letras, n);
  21.        count = n;
  22.        Letras[n]++;
  23.        llamada = 0;
  24.        while(count >= 0)
  25.        {
  26.            if(Letras[count] > 90)
  27.            {
  28.                Letras[count] = 65;
  29.                Letras[n-resta]++;
  30.                llamada++;
  31.            }
  32.            count--;
  33.            resta++;
  34.        }
  35.    }
  36. }
  37. int main()
  38. {
  39.    char Letras[] = "AAAAA";
  40.    fp = fopen("combinacion.txt", "w");
  41.    Generador(Letras, 4);
  42.    fclose(fp);
  43.    return 0;
  44. }
  45.  

Saludos!

EDITO:

Dato000, no había visto tu mensaje. Te explico:

Para todas las combinaciones posibles entre de 5 caracteres usando las letras del abecedario sin contar la 'Ñ', lo calculamos haciendo 265=11881376 combinaciones posibles.

Así, como para cada combinación de letras la repetimos 99999 veces (en el código que va desde AAAAA00000 hasta ZZZZZ99999), multiplicamos las combinaciones posibles desde AAAAA hasta ZZZZZ por 99999 (11881376 * 99999 = 1188125718624 combinaciones en total).

Saludos!


Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 15:39 pm

jaime.urizar (el autor del tema): Por lo que parece generar todas las combinaciones posibles desde AAAAA00000 hasta ZZZZZ99999 (sin mezclar letras y números) es imposible en un ordenador "normal". Pero eso no quiere decir que no tengamos bien el código, que era la finalidad del tema, y entonces supongo que nos quedaremos con el último, que es el más corto y eficiente:


* No digas imposible por que si se puede.
* Tu código Tiene Bastantes errores... revisa-lo con el mio y veras la diferencia... (cuando llega a por ejemplo AAAAZ se devuelve a AAAAA)...
http://foro.elhacker.net/programacion_cc/como_hacer_un_generador-t366597.0.html;msg1765302#msg1765302
* En el tema de los núcleos se tendría que separar La cadena en N donde N es la cantidad de núcleos, a su vez crear N hilos... esto es un poco mas tedioso por mi parte lo dejo asi.

Bueno mi código ya funciona al 100%

Dulces Lunas!¡.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 15:41 pm
Pero el tuyo no va de AAAAA00000 hasta ZZZZZ99999, ¿no?

Digo que es imposible porque al final hemos quedado en que se necesitaban 108,058208922 TB, ¿no?

EDITO: ¿Qué error tiene el mío? Hasta donde he probado funciona perfectamente...


Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 15:44 pm
La problemática de almacenamiento es despreciable... lee bien lo que se quiere.

hola amigos

les pido ayuda con algo que vi desde hace mucho, es como realizar un generador que muestre como resultado:

AAAAA
AAAAB
AAAAC
.........
.........
ZZZZZ

y algo mucho mas desafiante que no pude ni encontrar partes en internet y bueno mi conocimiento no es tan amplio pero decearia aprender a poder generar un..


AAAAA00000
AAAAA00001
AAAAA00002
....
....
....
AAAAB00000
AAAAB00001
....
.....
ZZZZZ99999

solo pude sacar cuantos resultados tendre :-( (son 14348907000000 posibles combinaciones)


una ayudita porfavor enserio me mata la curiosidad de aprender a hacer un contador o generador de ese tipo, y gracias de antemano por todo

Dulces Lunas!¡.


Título: Re: como hacer un generador??
Publicado por: xiruko en 13 Julio 2012, 15:46 pm
me gustaria a mi tambien compartir el codigo que he hecho, seguramente para nada sea el mas eficiente pero me gustaria saber como podria optimizarlo. genera la combinacion de AAAAA00000 a ZZZZZ99999 (no en el orden tipico).

Código
  1. #include <stdio.h>
  2.  
  3. #define NUM 5 //numero de letras
  4.  
  5. void cambiar_letras(char* letras, int* pos);
  6.  
  7. int main(int argc, char** argv)
  8. {
  9. FILE *fd;
  10. char letras[]="AAAAA";
  11. int posLet=0, i;
  12.  
  13. fd=fopen("diccionario.txt", "w");
  14.  
  15. while (posLet < NUM)
  16. {
  17. for (i=0; i<100000; i++)
  18. fprintf(fd, "%s%.5d\n", letras, i);
  19.  
  20. cambiar_letras(letras, &posLet);
  21. }
  22.  
  23. fclose(fd);
  24. return 0;
  25. }
  26.  
  27. void cambiar_letras(char* letras, int* pos)
  28. {
  29. int i;
  30.  
  31. for (i=0; i<=*pos && *pos<=NUM; i++)
  32. {
  33. if (letras[i] < 'Z') {
  34. (letras[i])++;
  35. break;
  36. } else {
  37. letras[i]='A';
  38. if ( i==*pos && (letras[i+1]=='A' || letras[i+1]=='\0') )
  39. (*pos)++;
  40. }
  41. }
  42. }

pd. gracias DickGumshoe por el especificador de formato %.5d en los enteros, no tenia ni idea de que podia representarse el 1 como 00001.


Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 15:49 pm
.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 15:50 pm
La problemática de almacenamiento es despreciable... lee bien lo que se quiere.

Dulces Lunas!¡.

Pero después nos pide cómo almacenarlo en un .txt... y por tanto es imposible (o eso creo xD).

Por cierto, estoy volviendo a hacer una modificación de mi código que he encontrado un error...

Saludos!


Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 15:54 pm
si tienes un error cambia tu limite del for y veras...

* No es imposible, solo se tendrían que usar varios HDD y a su vez varios archivos...

Dulces Lunas!¡.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 15:56 pm
si tienes un error cambia tu limite del for y veras...

Dulces Lunas!¡.

No me refería a eso... El límite del for lo tengo puesto así porque el programa es para generar hasta 99999. Claro que si cambio el límite y pongo más saldrá mal, pero porque pongo %.5d, no por otra cosa...

Sí, eso de usar varios archivos es una buena idea!

Saludos!


Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 16:01 pm
Yo te decía que cambiaras el limite para que vieras tu error...

Dulces Lunas!¡.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 16:04 pm
He cambiado el código arreglando errores:

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7. int i;
  8. for(i=0;i<100000;i++)
  9. {
  10.     printf("%s%.5d\n",Letras, i);
  11.     fprintf(fp, "%s%.5d\n", Letras, i);
  12. }
  13. }
  14.  
  15. void Generador(char *Letras, int n)
  16. {
  17.    int count, resta=1, llamada;
  18.    while(llamada != 5)
  19.    {
  20.        numeros(Letras, n);
  21.        count = n;
  22.        Letras[n]++;
  23.        llamada = 0;
  24.        while(count >= 0)
  25.        {
  26.            if(Letras[count] > 90)
  27.            {
  28.                Letras[count] = 65;
  29.                Letras[count-1]++;
  30.                llamada++;
  31.            }
  32.            count--;
  33.            resta++;
  34.        }
  35.    }
  36. }
  37. int main()
  38. {
  39.    char Letras[] = "AAAAA";
  40.    fp = fopen("combinacion.txt", "w");
  41.    Generador(Letras, 4);
  42.    fclose(fp);
  43.    return 0;
  44. }
  45.  

¿Te referías a ese error?

Saludos.



Título: Re: como hacer un generador??
Publicado por: BlackZeroX en 13 Julio 2012, 16:13 pm
.
En efecto ese era el error... y como no me quiero quedar atras con los numeros aqui lo dejo ya completo:

Código
  1.  
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. inline string &addWord(string &text) {
  9.    string::reverse_iterator it = text.rbegin();
  10.    for (; it != text.rend(); it++) {
  11.        ++(*it);
  12.        if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break;
  13.        (*it) = (islower(*it))? 'a': 'A';
  14.    }
  15.    return text;
  16. }
  17.  
  18. size_t addAllWord(string text, void (*callback)(string&, bool&) = NULL) {
  19.    bool cancel = false;
  20.    register size_t i = 0, lim = pow(26, text.size());
  21.    if (!callback) return lim;
  22.    for (;(i < lim) && (cancel ==false); i++) {
  23.        callback(addWord(text), cancel);
  24.    }
  25.    return i;
  26. }
  27.  
  28. void showWords(string& text, bool& cancel) {
  29.    for (register int i = 0; i <= 9999; i++) {
  30.        cout << text << setw(4) << setfill('0') << i << endl;
  31.    }
  32. }
  33.  
  34. int main() {
  35.    string text = "ZZZx";
  36.    cout << addAllWord(text, showWords) << endl;
  37.    cin.get();
  38.    return 0;
  39. }
  40.  
  41.  

Dulces Lunas!¡.


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 16:16 pm
Bueno, entonces ya tenemos varios códigos que generan lo que se pedía en el tema  :D

BlackZeroX (Astaroth), con lo de imposible en un ordenador normal me refería a uno cualquiera, sin discos duros extras ni nada...

Saludos y gracias por avisar del error!

EDITO:

Bueno, creo que ya, a no ser que el autor del tema diga lo contrario, su duda ya está solucionada.


Título: Re: como hacer un generador??
Publicado por: dato000 en 13 Julio 2012, 18:19 pm
Voy a dejar un post resumen de este tema, muy interesante, queria dejar el mio pero no es tan bueno jaajaj sigo mirando varias cosas. Es practicamente uno que DickGumshoe deja pero trate de corregir la recursividad pero no me funciono muy bien, en fin, dejo las soluciones publicadas.

muy buen post realmente muy bueno


Aqui el primero de DickGumshoe

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7. int i;
  8. for(i=0;i<100000;i++)
  9. {
  10.     printf("%s%.5d\n",Letras, i);
  11.     fprintf(fp, "%s%.5d\n", Letras, i);
  12. }
  13. }
  14.  
  15. void Generador(char *Letras, int n)
  16. {
  17.    int count, resta=1, llamada;
  18.    while(llamada != 5)
  19.    {
  20.        numeros(Letras, n);
  21.        count = n;
  22.        Letras[n]++;
  23.        llamada = 0;
  24.        while(count >= 0)
  25.        {
  26.            if(Letras[count] > 90)
  27.            {
  28.                Letras[count] = 65;
  29.                Letras[count-1]++;
  30.                llamada++;
  31.            }
  32.            count--;
  33.            resta++;
  34.        }
  35.    }
  36. }
  37. int main()
  38. {
  39.    char Letras[] = "AAAAA";
  40.    fp = fopen("combinacion.txt", "w");
  41.    Generador(Letras, 4);
  42.    fclose(fp);
  43.    return 0;
  44. }
  45.  


Otra solución aportada por BlackZeroX

Código
  1.  
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. inline string &addWord(string &text) {
  9.    string::reverse_iterator it = text.rbegin();
  10.    for (; it != text.rend(); it++) {
  11.        ++(*it);
  12.        if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break;
  13.        (*it) = (islower(*it))? 'a': 'A';
  14.    }
  15.    return text;
  16. }
  17.  
  18. size_t addAllWord(string text, void (*callback)(string&, bool&) = NULL) {
  19.    bool cancel = false;
  20.    register size_t i = 0, lim = pow(26, text.size());
  21.    if (!callback) return lim;
  22.    for (;(i < lim) && (cancel ==false); i++) {
  23.        callback(addWord(text), cancel);
  24.    }
  25.    return i;
  26. }
  27.  
  28. void showWords(string& text, bool& cancel) {
  29.    for (register int i = 0; i <= 9999; i++) {
  30.        cout << text << setw(4) << setfill('0') << i << endl;
  31.    }
  32. }
  33.  
  34. int main() {
  35.    string text = "ZZZx";
  36.    cout << addAllWord(text, showWords) << endl;
  37.    cin.get();
  38.    return 0;
  39. }
  40.  
  41.  




Y otra alternativa aportada por xiruko

Código
  1. #include <stdio.h>
  2.  
  3. #define NUM 5 //numero de letras
  4.  
  5. void cambiar_letras(char* letras, int* pos);
  6.  
  7. int main(int argc, char** argv)
  8. {
  9. FILE *fd;
  10. char letras[]="AAAAA";
  11. int posLet=0, i;
  12.  
  13. fd=fopen("diccionario.txt", "w");
  14.  
  15. while (posLet < NUM)
  16. {
  17. for (i=0; i<100000; i++)
  18. fprintf(fd, "%s%.5d\n", letras, i);
  19.  
  20. cambiar_letras(letras, &posLet);
  21. }
  22.  
  23. fclose(fd);
  24. return 0;
  25. }
  26.  
  27. void cambiar_letras(char* letras, int* pos)
  28. {
  29. int i;
  30.  
  31. for (i=0; i<=*pos && *pos<=NUM; i++)
  32. {
  33. if (letras[i] < 'Z') {
  34. (letras[i])++;
  35. break;
  36. } else {
  37. letras[i]='A';
  38. if ( i==*pos && (letras[i+1]=='A' || letras[i+1]=='\0') )
  39. (*pos)++;
  40. }
  41. }
  42. }

EXCELENTES SOLUCIONES, REALMENTE ESTAN A OTRO NIVEL.


Título: Re: como hacer un generador??
Publicado por: do-while en 13 Julio 2012, 19:38 pm
¡Buenas!

Viendo que hay tantos codigos, aqui dejo uno mas. XD

Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char *argv[])
  4. {
  5.    int i,numero;
  6.    FILE *f;
  7.    char letras[] = "AAAAA";
  8.  
  9.    f = fopen("diccionario.txt","w");
  10.  
  11.    do{
  12.        for(numero = 0 ; numero < 100000 ; numero ++)
  13.            fprintf(f,"%s%05d\n",letras,numero);
  14.  
  15.        letras[4]++;
  16.  
  17.        if(letras[4] - 1 == 'Z')
  18.            for(i = 4 ; i  > 0 ; i--)
  19.                if(letras[i] - 1 == 'Z')
  20.                {
  21.                    letras[i - 1]++;
  22.                    letras[i] = 'A';
  23.                }
  24.    }while(letras[0] - 1 != 'Z');
  25.  
  26.    fclose(f);
  27.  
  28.    return 0;
  29. }
  30.  

¡Saludos!


Título: Re: como hacer un generador??
Publicado por: dato000 en 13 Julio 2012, 20:44 pm
ummm uno sin llamada de funciones, funciona sin problemas, pero lo detuve cuando el archivo.txt estaba en 2.1 GB... :silbar: :silbar:


Título: Re: como hacer un generador??
Publicado por: DickGumshoe en 13 Julio 2012, 21:10 pm
ummm uno sin llamada de funciones, funciona sin problemas, pero lo detuve cuando el archivo.txt estaba en 2.1 GB... :silbar: :silbar:

Lo malo es que eso no tiene remedio... (sin discos duros ni cosas extras).

Bueno, gracias a tu post-resumen el autor del tema podrá ver todas las soluciones aportadas  fácilmente.  ;)

Saludos!


Título: Re: como hacer un generador??
Publicado por: SXF en 13 Julio 2012, 21:36 pm
ufffff el code de do-while si que lo hace rapido¡¡ muy bueno,aunque los demás también están muy bien.


Título: Re: como hacer un generador??
Publicado por: dato000 en 13 Julio 2012, 23:42 pm
ufffff el code de do-while si que lo hace rapido¡¡ muy bueno,aunque los demás también están muy bien.

lo que pasa es que no imprime nada en terminal, asi que solo escribiendo en disco le rinde más. Pero si uno no detiene el proceso se llena el disco, es como si fuera un gusano XDD