Autor
|
Tema: ¿ Tan dificil es hacer un generador de diccionario ? (Leído 6,315 veces)
|
snake_linux
Desconectado
Mensajes: 70
|
Hola a tod@s, esta mañana he intentado crear en C un generador de diccionario, en plan que tu le dices de 5 caracteres y en teoría debería de ir desde "aaaaa" hasta "zzzzz" pero me ha sido un infierno, he probado de todo, he concatenado 3 fors que fueran desplazando la posicion he hecho de todo y no lo he conseguido, no quiero que me deis el código para ver como se hace (no me gusta que me den el trabajo hecho, y tampoco estaría bien pediros eso), solo quiero saber si realmente, es tan dificil o si realmente soy malo programando por que es que me ha frustado muchísimo.
Hice algo así en batch cuando tenía 15 años pero eran un montón de for anidados y digamos que el método no era muy "elegante" pero funcionar funcionaba, el caso es que ahora que "en teoría" se C me habría gustado conseguirlo, pero es que me he tirado horas delante del PC y solo he conseguido pillarme un cabreo.
|
|
|
En línea
|
|
|
|
tincopasan
Desconectado
Mensajes: 1.286
No es lo mismo conocer el camino que recorrerlo.
|
Si no entendí mal, lo que estás buscando, es hacer combinaciones, que se usa en matemáticas, empezá buscando sobre desarrollo de combinaciones y permutaciones.
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
Hola a tod@s, esta mañana he intentado crear en C un generador de diccionario, en plan que tu le dices de 5 caracteres y en teoría debería de ir desde "aaaaa" hasta "zzzzz" pero me ha sido un infierno, he probado de todo, he concatenado 3 fors que fueran desplazando la posicion he hecho de todo y no lo he conseguido, no quiero que me deis el código para ver como se hace (no me gusta que me den el trabajo hecho, y tampoco estaría bien pediros eso), solo quiero saber si realmente, es tan dificil o si realmente soy malo programando por que es que me ha frustado muchísimo.
Bueno, ese programa que pides es algo bastante simple... No diré que eres malo programando, sino simplemente que aun estás muy verde y necesitas practicar mucho. Saludos, y no te desanimes!
|
|
|
En línea
|
|
|
|
snake_linux
Desconectado
Mensajes: 70
|
He encontrado este código en internet: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { if(argc < 2 || !strcmp(argv [1], "-h")) //Texto de ayuda { puts("HELP: \nsintax: dic [len_dic] (optional)[list]"); return 1; } int len =0, cont =atoi(argv [1]), *cad , i , ver =1; //Declaracion cad =(int *)malloc(sizeof(int) * atoi(argv [1])); //Reserva de memoria para un array int memset((int *)cad ,0,sizeof(int) * atoi(argv [1]));//Inicializamos el array a 0 char *lst;//Declaracion de la lista que contendra las posibilidades if(argc < 3) //Comprobamos el numero de parametros introducidos para hacer una cosa u otra { strcpy(lst , "abcdefghijklmnopqrstuvwxyz"); } else if(argc == 3) { if(!lst) { puts("No se pudo reservar la memoria"); return 1; } } while(len+1<=cont)//Comienza el ciclo de generacion { if(lst[cad[0]]!='\0') { for(i=0;i<=len;i++) { } } if(lst[cad[0]]!='\0') { cad[0]++; } else { ver=0; for(i=0;i<=len;i++) { if(lst[cad[i]]=='\0') { cad[i]=0; cad[i+1]++; } else { ver=1; } } } if(ver==0) { len++; for(i=0;i<=len;i++) { cad[i]=0; } ver=1; } } return 0; }
Funciona a la perfección y se ve muy simple, pero sinceramente aunque me guste la programación creo que novoy a valer para esto, por que este código ya digo, tiene pinta de ser muy simple, pero me hago un lio y no entiendo nada.
|
|
|
En línea
|
|
|
|
T. Collins
Desconectado
Mensajes: 206
|
Hay que tener bastante experiencia para leer código de otra persona, al principio no es fácil, no te rindas a la primera. Intenta simplificar los problemas para no frustrarte. En vez de intentar con 5 caracteres empieza con 2, por ejemplo, y un diccionario más pequeño: diccionario = "abcdef"; for(x=0;x<strlen(diccionario);x++) { for(i=0;i<strlen(diccionario);i++) { print diccionario[x], diccionario[i]; } }
|
|
|
En línea
|
|
|
|
snake_linux
Desconectado
Mensajes: 70
|
Hay que tener bastante experiencia para leer código de otra persona, al principio no es fácil, no te rindas a la primera. Intenta simplificar los problemas para no frustrarte. En vez de intentar con 5 caracteres empieza con 2, por ejemplo, y un diccionario más pequeño: diccionario = "abcdef"; for(x=0;x<strlen(diccionario);x++) { for(i=0;i<strlen(diccionario);i++) { print diccionario[x], diccionario[i]; } }
Ese método es el que yo usé hace años en batch, y funciona bien, el problema está en que quiero que sea modular, es decir, quiero poder elegir el número de caracteres, además el problema de ese método es que para por ejemplo 10 caracteres necesitas 10 fors anidados. Gracias por tus animos, me he frustado mucho y llevo un mal dia.
|
|
|
En línea
|
|
|
|
snake_linux
Desconectado
Mensajes: 70
|
El código se quedaría así, es una chorrada yo lo quería hacer mucho más elegante: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char caracteres[]="abcdefghijklmnopqrstuvwxyz"; int x, y; for(x=0;x<strlen(caracteres);x++) { for(y=0;y<strlen(caracteres);y++) { printf("%c%c\n", caracteres [x ], caracteres [y ]); } } }
PD: ¿ Alguien me explica un método más elegante y sobretodo, más reutilizable donde pueda elegir el número de caracteres, o por lo menos, explicarme el código de arriba que he puesto ?.
|
|
« Última modificación: 5 Septiembre 2015, 18:06 pm por snake_linux »
|
En línea
|
|
|
|
someRandomCode
Desconectado
Mensajes: 250
|
Te doy una idea y te mejoro el concepto: Se llama generar permutaciones de un grupo. Dado un grupo A = { 'a','b','c' } todas las permutaciones de dos valores con repeticion, no hace falta hacer tres bucles. Te paso un pedacito de codigo que me robe de stackoverflow porque no estoy encasa: #include <stdio.h> #include <string.h> #include <stdlib.h> unsigned powu(unsigned base, unsigned exp){ unsigned result = 1; while(exp > 0){ if(exp & 1) result *= base; base = base * base; exp >>=1; } return result; } int main(int argc, char *argv[]){ if(argc != 3){ fprintf(stderr, "Usage : RepeatedPermutation abcd 3\n"); return -1; } char *list = argv[1]; unsigned gp_len = atoi(argv[2]); unsigned list_len = strlen(list); char *gp = calloc(gp_len+1, sizeof(char)); int total_n = powu(list_len, gp_len); int i, j; for(i=0;i<total_n;++i){ int n = i; for(j=0;j<gp_len;++j){ gp[gp_len -j -1] = list[n % list_len]; n /= list_len; } printf("[%s]\n", gp); } free(gp); return 0; }
No hace falta que te lo comente, pero si necesitas explicacion de algo me decis..
|
|
|
En línea
|
|
|
|
RockPosts
Desconectado
Mensajes: 28
|
Para dejar mi miga de pan, os dejo un simple ejemplo de como generar el diccionario y a su vez guardarlo en un archivo: #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> int main() { FILE * lpstFilePointer = NULL; char lpszFilePath[256]; char *lpString = NULL; int nNumCharacters = 0; std::cout << "Cuantos caracteres necesitas? "; std::cin >> nNumCharacters; std::cout << "Donde deseas guardar los datos? "; std::cin >> lpszFilePath; lpstFilePointer = fopen((const char *)lpszFilePath, "w"); if(lpstFilePointer == NULL) { std::cout << "Error al abrir el archivo en la ruta '" << lpszFilePath << "'. El programa se va a cerrar"; std::cin.get(); return 1; } lpString = new char[nNumCharacters]; if(lpString == NULL) { std::cout << "Error al declarar la cadena temporal para generar el diccionario."; std::cin.get(); return 1; } for(int i = 0; i <= (int)pow(26, nNumCharacters); i++) { itoa(i, lpString, 26); for(int e = 0; e < nNumCharacters; e++) { if(lpString[e] != 0) { if(lpString[e] <= 57) lpString[e] += 49; else lpString[e] += 10; } } fputs(lpString, lpstFilePointer); fputc('\n', lpstFilePointer); } std::cout << "El programa ha finalizado el proceso."; fclose(lpstFilePointer); std::cin.get(); return 0; }
|
|
|
En línea
|
|
|
|
snake_linux
Desconectado
Mensajes: 70
|
Te doy una idea y te mejoro el concepto: Se llama generar permutaciones de un grupo. Dado un grupo A = { 'a','b','c' } todas las permutaciones de dos valores con repeticion, no hace falta hacer tres bucles. Te paso un pedacito de codigo que me robe de stackoverflow porque no estoy encasa: #include <stdio.h> #include <string.h> #include <stdlib.h> unsigned powu(unsigned base, unsigned exp){ unsigned result = 1; while(exp > 0){ if(exp & 1) result *= base; base = base * base; exp >>=1; } return result; } int main(int argc, char *argv[]){ if(argc != 3){ fprintf(stderr, "Usage : RepeatedPermutation abcd 3\n"); return -1; } char *list = argv[1]; unsigned gp_len = atoi(argv[2]); unsigned list_len = strlen(list); char *gp = calloc(gp_len+1, sizeof(char)); int total_n = powu(list_len, gp_len); int i, j; for(i=0;i<total_n;++i){ int n = i; for(j=0;j<gp_len;++j){ gp[gp_len -j -1] = list[n % list_len]; n /= list_len; } printf("[%s]\n", gp); } free(gp); return 0; }
No hace falta que te lo comente, pero si necesitas explicacion de algo me decis.. Muchas gracias, me ha servido de mucho, solo unos cuantos detalles: - Para que sirven los operadores ">>" y el operador "&" (este último lo había visto pero solo como "&&") - Me gustaría que, si no es mucho pedir, me explicaras o me pasaras algún enlace que explique, el algoritmo (la fórmula) para las permutaciones con repetición de grupo ( que es lo que me has dicho ), lo he estado buscando yo por mi cuenta, pero solo encuentro con números y no se como aplicarlo a esto (leo el código pero si no se la fórmula "original" me cuesta un poco leerlo, aunque es bastante claro) Saludos y gracias por la ayuda.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Batch] Generador de Diccionario
Scripting
|
SmartGenius
|
8
|
7,091
|
16 Diciembre 2008, 19:46 pm
por SmartGenius
|
|
|
Generador de diccionario StrinGenerator1.1
« 1 2 »
Hacking Wireless
|
|FluiD|
|
10
|
22,171
|
17 Enero 2016, 02:30 am
por northsay
|
|
|
Generador de diccionario p/bruteforce
Hacking
|
taul
|
1
|
4,727
|
8 Diciembre 2009, 01:20 am
por Constantinoplero
|
|
|
Generador de diccionario
Hacking Wireless
|
magp_90
|
6
|
6,336
|
7 Septiembre 2012, 03:24 am
por El_Andaluz
|
|
|
Generador diccionario numérico
Programación C/C++
|
hossman92
|
1
|
4,166
|
24 Noviembre 2014, 19:12 pm
por engel lex
|
|