elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Python (Moderador: Danielㅤ)
| | |-+  Buscador de combinaciones inexistentes no funciona.
0 Usuarios y 5 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Buscador de combinaciones inexistentes no funciona.  (Leído 539 veces)
Tachikomaia


Conectado Conectado

Mensajes: 1.479


Hackentifiko!


Ver Perfil
Buscador de combinaciones inexistentes no funciona.
« en: 3 Enero 2025, 05:20 am »

Relacionado con:
https://foro.elhacker.net/hacking/descartar_combinaciones_de_caracteres_al_buscar_password-t522886.0.html

Código dado por GPT:
Código
  1. import itertools
  2.  
  3. def cargar_diccionario(ruta):
  4.    """Carga el diccionario desde un archivo .txt y devuelve un conjunto de palabras en minúsculas."""
  5.    with open(ruta, 'r', encoding='utf-8') as archivo:
  6.        return set(palabra.strip().lower() for palabra in archivo)
  7.  
  8. def generar_combinaciones(alfabeto):
  9.    """Genera todas las combinaciones posibles de dos letras del alfabeto."""
  10.    return {a + b for a, b in itertools.product(alfabeto, repeat=2)}
  11.  
  12. def buscar_combinaciones(diccionario, combinaciones):
  13.    """Busca combinaciones dentro de las palabras del diccionario."""
  14.    presentes = set()
  15.  
  16.    # Buscar combinaciones dentro de palabras individuales
  17.    for palabra in diccionario:
  18.        for i in range(len(palabra) - 1):
  19.            presentes.add(palabra[i:i+2])
  20.  
  21.    # Buscar combinaciones entre palabras consecutivas
  22.    lista_palabras = sorted(diccionario)  # Ordenar las palabras
  23.    for i in range(len(lista_palabras) - 1):
  24.        ultima_letra = lista_palabras[-1]
  25.        primera_letra = lista_palabras[i + 1][0]
  26.        presentes.add(ultima_letra + primera_letra)
  27.  
  28.    return combinaciones - presentes
  29.  
  30. # Paso 1: Cargar diccionarios
  31. diccionario_es = cargar_diccionario('diccionario_es.txt')
  32. diccionario_en = cargar_diccionario('diccionario_en.txt')
  33.  
  34. # Paso 2: Generar combinaciones posibles
  35. alfabeto_es = 'abcdefghijklmnñopqrstuvwxyz'
  36. alfabeto_en = 'abcdefghijklmnopqrstuvwxyz'
  37. combinaciones_es = generar_combinaciones(alfabeto_es)
  38. combinaciones_en = generar_combinaciones(alfabeto_en)
  39.  
  40. # Paso 3: Buscar combinaciones inexistentes en cada diccionario
  41. inexistentes_es = buscar_combinaciones(diccionario_es, combinaciones_es)
  42. inexistentes_en = buscar_combinaciones(diccionario_en, combinaciones_en)
  43.  
  44. # Paso 4: Combinar resultados y mostrar combinaciones inexistentes en ambos idiomas
  45. inexistentes_totales = inexistentes_es.intersection(inexistentes_en)
  46.  
  47. print(f"Combinaciones inexistentes en ambos idiomas ({len(inexistentes_totales)}):")
  48. print(sorted(inexistentes_totales))

Tengo los diccionarios y les puse los nombres que dice ahí:
diccionario_es.txt
diccionario_en.txt

El programa se cierra enseguida sin que yo pueda ver qué pasa. ¿Cual es la falla, cómo lo arreglo?


En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.183



Ver Perfil
Re: Buscador de combinaciones inexistentes no funciona.
« Respuesta #1 en: 3 Enero 2025, 13:54 pm »

Citar
El programa se cierra enseguida sin que yo pueda ver qué pasa. ¿Cual es la falla, cómo lo arreglo?

O_o? Es un aplicación/script de consola o línea de comando (como john the ripper), usa una consola (CMD, Símbolo del Sistema, PowerShell, etc), también puedes poner una "pausa" antes de que se cierre pero si hay errores no los mostrará a no ser que lo ejecutes en una consola que es como debe de ser.

Para poner la pausa puedes agregar un input al final o donde quieras la pausa:

Código
  1. input("Presione Enter para continuar ...")


En línea

Tachikomaia


Conectado Conectado

Mensajes: 1.479


Hackentifiko!


Ver Perfil
Re: Buscador de combinaciones inexistentes no funciona.
« Respuesta #2 en: 3 Enero 2025, 22:14 pm »

Es un archivo py abierto con Python, eso me lo enseñaron aquí, posiblemente tú.

Luego te digo el resultado.
En línea

Tachikomaia


Conectado Conectado

Mensajes: 1.479


Hackentifiko!


Ver Perfil
Re: Buscador de combinaciones inexistentes no funciona.
« Respuesta #3 en: Hoy a las 13:16 »

No cambió el resultado, se cierra enseguida.

Código
  1. import itertools
  2.  
  3. def cargar_diccionario(ruta):
  4.    """Carga el diccionario desde un archivo .txt y devuelve un conjunto de palabras en minúsculas."""
  5.    with open(ruta, 'r', encoding='utf-8') as archivo:
  6.        return set(palabra.strip().lower() for palabra in archivo)
  7.  
  8. def generar_combinaciones(alfabeto):
  9.    """Genera todas las combinaciones posibles de dos letras del alfabeto."""
  10.    return {a + b for a, b in itertools.product(alfabeto, repeat=2)}
  11.  
  12. def buscar_combinaciones(diccionario, combinaciones):
  13.    """Busca combinaciones dentro de las palabras del diccionario."""
  14.    presentes = set()
  15.  
  16.    # Buscar combinaciones dentro de palabras individuales
  17.    for palabra in diccionario:
  18.        for i in range(len(palabra) - 1):
  19.            presentes.add(palabra[i:i+2])
  20.  
  21.    # Buscar combinaciones entre palabras consecutivas
  22.    lista_palabras = sorted(diccionario)  # Ordenar las palabras
  23.    for i in range(len(lista_palabras) - 1):
  24.        ultima_letra = lista_palabras[-1]
  25.        primera_letra = lista_palabras[i + 1][0]
  26.        presentes.add(ultima_letra + primera_letra)
  27.  
  28.    return combinaciones - presentes
  29.  
  30. # Paso 1: Cargar diccionarios
  31. diccionario_es = cargar_diccionario('diccionario_es.txt')
  32. diccionario_en = cargar_diccionario('diccionario_en.txt')
  33.  
  34. # Paso 2: Generar combinaciones posibles
  35. alfabeto_es = 'abcdefghijklmnñopqrstuvwxyz'
  36. alfabeto_en = 'abcdefghijklmnopqrstuvwxyz'
  37. combinaciones_es = generar_combinaciones(alfabeto_es)
  38. combinaciones_en = generar_combinaciones(alfabeto_en)
  39.  
  40. # Paso 3: Buscar combinaciones inexistentes en cada diccionario
  41. inexistentes_es = buscar_combinaciones(diccionario_es, combinaciones_es)
  42. inexistentes_en = buscar_combinaciones(diccionario_en, combinaciones_en)
  43.  
  44. # Paso 4: Combinar resultados y mostrar combinaciones inexistentes en ambos idiomas
  45. inexistentes_totales = inexistentes_es.intersection(inexistentes_en)
  46.  
  47. print(f"Combinaciones inexistentes en ambos idiomas ({len(inexistentes_totales)}):")
  48. print(sorted(inexistentes_totales))
  49. input("Presione Enter para continuar ...")

¿Será que requiere una versión más nueva que la que tengo?

El problema que describes probablemente no está relacionado con la versión de Python, sino con un **error en tu código** que provoca que el programa termine antes de lo esperado. Vamos a analizarlo detalladamente.

### Posibles problemas en el código

1. **Error en la sección de combinaciones entre palabras consecutivas**:
   En el método `buscar_combinaciones`, en esta línea:

   ```python
   ultima_letra = lista_palabras[-1]
   primera_letra = lista_palabras[i + 1][0]
   presentes.add(ultima_letra + primera_letra)
   ```
   
   Hay un error de lógica. La variable `ultima_letra` intenta tomar el valor de la última palabra completa de la lista (`lista_palabras[-1]`), pero lo que necesitas es la **última letra de la palabra actual** (`palabra_actual[-1]`). Aquí tienes una corrección:

   ```python
   ultima_letra = lista_palabras[-1]  # Última letra de la palabra actual
   primera_letra = lista_palabras[i + 1][0]  # Primera letra de la siguiente palabra
   presentes.add(ultima_letra + primera_letra)
   ```

2. **Falta de manejo de excepciones en la lectura de los archivos**:
   Si los archivos `diccionario_es.txt` o `diccionario_en.txt` no existen, el programa lanzará un error y se cerrará. Asegúrate de manejar este caso con un bloque `try-except` para evitar que el programa termine inesperadamente:

   ```python
   def cargar_diccionario(ruta):
       """Carga el diccionario desde un archivo .txt y devuelve un conjunto de palabras en minúsculas."""
       try:
           with open(ruta, 'r', encoding='utf-8') as archivo:
               return set(palabra.strip().lower() for palabra in archivo)
       except FileNotFoundError:
           print(f"Error: No se encontró el archivo {ruta}.")
           return set()
   ```

3. **Errores en los datos de entrada**:
   Si el archivo de diccionario contiene caracteres especiales, líneas vacías o palabras que no se procesan correctamente, el programa podría comportarse de manera inesperada. Asegúrate de que los archivos de entrada estén en el formato correcto (palabras en minúsculas, una por línea).

4. **El programa finaliza correctamente pero no esperas ese comportamiento**:
   Si el programa no tiene errores, la última línea:

   ```python
   input("Presione Enter para continuar ...")
   ```

   debería mantener la ventana abierta hasta que presiones **Enter**. Sin embargo, si estás ejecutándolo desde un entorno donde la ventana se cierra automáticamente al finalizar (por ejemplo, al ejecutar un archivo `.py` en Windows haciendo doble clic), esto puede parecer un cierre inesperado.

   Para evitar este problema, te recomiendo ejecutar el programa desde una terminal o consola manualmente con:

   ```bash
   python tu_programa.py
   ```

   Esto asegurará que la ventana no se cierre automáticamente después de la ejecución.

---

### Solución ajustada del código

Aquí está el código corregido con las observaciones mencionadas:

```python
import itertools

def cargar_diccionario(ruta):
    """Carga el diccionario desde un archivo .txt y devuelve un conjunto de palabras en minúsculas."""
    try:
        with open(ruta, 'r', encoding='utf-8') as archivo:
            return set(palabra.strip().lower() for palabra in archivo if palabra.strip())
    except FileNotFoundError:
        print(f"Error: No se encontró el archivo {ruta}.")
        return set()

def generar_combinaciones(alfabeto):
    """Genera todas las combinaciones posibles de dos letras del alfabeto."""
    return {a + b for a, b in itertools.product(alfabeto, repeat=2)}

def buscar_combinaciones(diccionario, combinaciones):
    """Busca combinaciones dentro de las palabras del diccionario."""
    presentes = set()
   
    # Buscar combinaciones dentro de palabras individuales
    for palabra in diccionario:
        for i in range(len(palabra) - 1):
            presentes.add(palabra[i:i+2])
   
    # Buscar combinaciones entre palabras consecutivas
    lista_palabras = sorted(diccionario)  # Ordenar las palabras
    for i in range(len(lista_palabras) - 1):
        ultima_letra = lista_palabras[-1]  # Última letra de la palabra actual
        primera_letra = lista_palabras[i + 1][0]  # Primera letra de la siguiente palabra
        presentes.add(ultima_letra + primera_letra)
   
    return combinaciones - presentes

# Paso 1: Cargar diccionarios
diccionario_es = cargar_diccionario('diccionario_es.txt')
diccionario_en = cargar_diccionario('diccionario_en.txt')

# Verificar si los diccionarios se cargaron correctamente
if not diccionario_es or not diccionario_en:
    print("No se pudieron cargar los diccionarios. Por favor, verifica los archivos.")
    exit()

# Paso 2: Generar combinaciones posibles
alfabeto_es = 'abcdefghijklmnñopqrstuvwxyz'
alfabeto_en = 'abcdefghijklmnopqrstuvwxyz'
combinaciones_es = generar_combinaciones(alfabeto_es)
combinaciones_en = generar_combinaciones(alfabeto_en)

# Paso 3: Buscar combinaciones inexistentes en cada diccionario
inexistentes_es = buscar_combinaciones(diccionario_es, combinaciones_es)
inexistentes_en = buscar_combinaciones(diccionario_en, combinaciones_en)

# Paso 4: Combinar resultados y mostrar combinaciones inexistentes en ambos idiomas
inexistentes_totales = inexistentes_es.intersection(inexistentes_en)

print(f"Combinaciones inexistentes en ambos idiomas ({len(inexistentes_totales)}):")
print(sorted(inexistentes_totales))
input("Presione Enter para continuar ...")
```

---

### Resumen de los cambios

1. **Corrección de la lógica al buscar combinaciones entre palabras consecutivas.**
2. **Manejo de excepciones al cargar los archivos.**
3. **Validación para asegurarte de que los diccionarios se carguen correctamente.**
4. **Sugerencia de ejecutar el programa desde la terminal para evitar que la ventana se cierre automáticamente.**

Con estas correcciones, el programa debería funcionar correctamente si tienes una versión de Python reciente (3.6 o superior).


Demasiado lío, el código me lo dió él, si ahora dice que tiene errores mejor empiezo por algo más simple que yo pueda entender.
« Última modificación: Hoy a las 13:25 por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
buscador en php... q no funciona. AYUDA POR FAVOR
PHP
miguelangelss4 4 3,410 Último mensaje 25 Abril 2009, 11:19 am
por miguelangelss4
No funciona mi buscador
GNU/Linux
Choclito 7 4,676 Último mensaje 25 Diciembre 2010, 08:07 am
por Choclito
Buscador de combinaciones numéricas
Dudas Generales
hcalderon11 0 3,529 Último mensaje 16 Febrero 2012, 21:49 pm
por hcalderon11
Google explica a los usuarios cómo funciona el algoritmo de su buscador de....
Noticias
wolfbcn 0 2,033 Último mensaje 6 Marzo 2013, 22:35 pm
por wolfbcn
Un buscador de torrents sin anuncios, enfocado en la privacidad y que funciona
Noticias
wolfbcn 0 1,280 Último mensaje 20 Enero 2018, 02:14 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines