como hacer un generador??

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

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

dato000

Cita de: DickGumshoe en 12 Julio 2012, 19:03 PM
¿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.

printf("%s%.5d\n",Letras, i);

lo deje a
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.



xiruko

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!

BlackZeroX

#22
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 (vb) [Seleccionar]


Private Sub CombinateString(ByRef Str_String As String, Optional ByRef str_Fix As String, Optional ByRef Cancel As Boolean)
Dim Lng_LenStr                                  As Long
Dim Lng_LenStrIndex                             As Long
    If Cancel Then Exit Sub
    Lng_LenStr = Strings.Len(Str_String)
    If Lng_LenStr <> 1 Then
        For Lng_LenStrIndex = 1 To Lng_LenStr
            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)
        Next
    Else
        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)...
    End If
End Sub



En unos segundos te lo subo en C++.

Duñlces Lunas.
The Dark Shadow is my passion.

BlackZeroX

#23
creo que la cague en mi post anterior... te dejo la funcion que hace lo que tu quieres.

Código (cpp) [Seleccionar]


#include <iostream>
using namespace std;

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;
}

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



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

Código (cpp) [Seleccionar]


#include <iostream>
using namespace std;

size_t permutaciones (string text, string textFix, void (*callback)(string, bool), bool cancel = false) {
    size_t ret = 0;
    if (cancel) return ret;
    if (text.size()) {
        for (register size_t i = 0; i < text.size(); i++) {
            ret += permutaciones (text.substr(0, i) + text.substr(i + 1), textFix + text.substr(i, 1), callback, cancel);
            if (cancel) return ret;
        }
    } else {
        callback(textFix + text, cancel);
    }
    return ret;
}

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

int main() {
    permutaciones ("hola", "", showWord);
    cin.get();
    return 0;
}



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

DickGumshoe

#24
Citarjajaj seeee 7777 es algo minusculo realmente.


printf("%s%.5d\n",Letras, i);

lo deje a

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.

Citaruna 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!

0xDani

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

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!

0xDani

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

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

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

SXF

jejej había compilado el otro còdigo ... con razón ya me parecía extraño...