Autor
|
Tema: como hacer un generador?? (Leído 25,205 veces)
|
DickGumshoe
|
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 EDITO: Además, genera el .txt... Sigo comprobando pero no encuentro errores...
|
|
« Última modificación: 12 Julio 2012, 07:55 am por DickGumshoe »
|
En línea
|
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
https://foro.elhacker.net/programacion_cc/brute_force_by_n0body-t278082.0.htmlNo 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.
|
|
|
En línea
|
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
|
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++) { 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); return 0; }
¡A ver si me animo y sigo editándolo para hacerlo aún mejor! Saludos!
|
|
|
En línea
|
|
|
|
dato000
Desconectado
Mensajes: 3.034
|
FILE *fp; void numeros(char *Letras, int n) { int i; for(i=0;i<100000;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++) { 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); return 0; }
Aun estoy mirando las formas de reducir el codigo... Imprimir hasta "ZZZZZ" toma demasiado tiempo XD
|
|
« Última modificación: 12 Julio 2012, 17:21 pm por dato000 »
|
En línea
|
|
|
|
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!
|
|
|
En línea
|
|
|
|
dato000
Desconectado
Mensajes: 3.034
|
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: 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.
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
SXF
|
Por cierto y como que 14348907000000 ?¿ si solo se ha generado 7777 combinaciones con el programa.
|
|
|
En línea
|
|
|
|
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....
|
|
|
En línea
|
|
|
|
DickGumshoe
|
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 × 10 15 combinaciones, creo. Saludos!
|
|
« Última modificación: 13 Julio 2012, 01:09 am por DickGumshoe »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
hacer un generador de id con muestras
Ingeniería Inversa
|
robertofd1995
|
4
|
5,167
|
31 Octubre 2013, 15:13 pm
por robertofd1995
|
|
|
Como conseguir un generador de digito de control
Ingeniería Inversa
|
wiredbob
|
3
|
3,170
|
22 Julio 2014, 12:02 pm
por wiredbob
|
|
|
***Como hacer un generador de licencias en python
« 1 2 »
Scripting
|
Arn_dj
|
10
|
10,414
|
22 Diciembre 2014, 16:19 pm
por Arn_dj
|
|
|
MOVIDO: ***Como hacer un generador de licencias en python
Programación General
|
Eleкtro
|
0
|
2,031
|
8 Diciembre 2014, 23:17 pm
por Eleкtro
|
|
|
como hacer un vbs generador de batch
Scripting
|
destructor000
|
4
|
10,249
|
15 Septiembre 2024, 14:22 pm
por Eleкtro
|
|