como hacer un generador??

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

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

DickGumshoe

#30
Cita de: 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...

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


BlackZeroX

#31
.
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!¡.
The Dark Shadow is my passion.

DickGumshoe

Cita de: BlackZeroX (Astaroth) en 13 Julio 2012, 15:03 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:

#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 Generador(char *Letras, int n)
{
   int count, resta=1, llamada;
   while(llamada != 5)
   {
       numeros(Letras, n);
       count = n;
       Letras[n]++;
       llamada = 0;
       while(count >= 0)
       {
           if(Letras[count] > 90)
           {
               Letras[count] = 65;
               Letras[n-resta]++;
               llamada++;
           }
           count--;
           resta++;
       }
   }
}
int main()
{
   char Letras[] = "AAAAA";
   fp = fopen("combinacion.txt", "w");
   Generador(Letras, 4);
   fclose(fp);
   return 0;
}


Saludos!

BlackZeroX

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


#include <iostream>
#include <cmath>
using namespace std;

inline string &addWord(string &text) {
    string::reverse_iterator it = text.rbegin();
    for (; it != text.rend(); it++) {
        ++(*it);
        if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break;
        (*it) = (islower(*it))? 'a': 'A';
    }
    return text;
}

size_t addAllWord(string text, void (*callback)(string&, bool&) = NULL) {
    bool cancel = false;
    register size_t i = 0, lim = pow(26, text.size());
    if (!callback) return lim;
    for (;(i < lim) && (cancel ==false); i++) {
        callback(addWord(text), cancel);
    }
    return i;
}

void showWords(string& text, bool& cancel) {
    cout << text << endl;
}

int main() {
    string text = "ZZZx";
    cout << addAllWord(text, showWords) << endl;
    cin.get();
    return 0;
}

The Dark Shadow is my passion.

0xDani

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

dato000

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

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

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

Cita de: daniyo 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.

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



DickGumshoe

#36
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:

#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 Generador(char *Letras, int n)
{
   int count, resta=1, llamada;
   while(llamada != 5)
   {
       numeros(Letras, n);
       count = n;
       Letras[n]++;
       llamada = 0;
       while(count >= 0)
       {
           if(Letras[count] > 90)
           {
               Letras[count] = 65;
               Letras[n-resta]++;
               llamada++;
           }
           count--;
           resta++;
       }
   }
}
int main()
{
   char Letras[] = "AAAAA";
   fp = fopen("combinacion.txt", "w");
   Generador(Letras, 4);
   fclose(fp);
   return 0;
}


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!

BlackZeroX

#37
Cita de: DickGumshoe en 13 Julio 2012, 15:32 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!¡.
The Dark Shadow is my passion.

DickGumshoe

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

BlackZeroX

La problemática de almacenamiento es despreciable... lee bien lo que se quiere.

Cita de: 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

Dulces Lunas!¡.
The Dark Shadow is my passion.