Numerador: creador de vectores.
Hacía mucho tiempo que no programaba nada en serio, pero en la época de exámenes siempre está uno más inspirado y ahora que por fin lo he terminado, lo publico :p
La idea principal era la de programar un script que fabricase diccionarios para luego utilizarlos para romper contraseñas, pero para ello he escrito este programita que es en sí mismo la base del creador de diccionarios.
La finalidad de este script escrito en BASH es obtener todos los vectores posibles del número de columnas que deseemos. Lo hace de forma secuencial hasta alcanzar el valor límite en cada una de las columnas por orden, desde la primera a la última.
El código es el siguiente:
#!/bin/bash # # Numerador. Crea vectores de $k componentes con números de hasta $l. r=0 # Aquí almacenaremos el valor leido de la columna que sea. k=15 # Número máximo de columnas l=2 # Límite que el número puede alcanzar en una columna cualquiera. # ¡Ojo, el 0 cuenta como el primer número.! c=0 # Columna en la que nos encontramos. c0=0 # Columna de seguridad (para cuando se llenan columnas). x=0 # Contador de seguridad, para no sobreescribir la columna de seguridad. declare array[$k] # Diría que esto es innecesario en este lenguaje. # Definimos las funciones que vamos a necesitar: function Asegurar(){ # Con esta función nos aseguraremos de no sobreescribir la columna # de seguridad. Puede que esta funcion sea prescindible. if test $x -eq 0; then c0=$(($c)) x=1 fi } function Limite(){ # Con esta función se comprueba si el número de la columna # en la que estamos, ha llegado o no a su límite. if test $r -eq $l; then # La columna ha llegado a su limite. # Llamamos a la función Asegurar para asegurar la posición. Asegurar # Pasamos a sumar uno a la siguiente columna llamando a la funcion Unidad. Unidad else # Volvemos a la posición de seguridad. c=$(($c0)) # Reiniciamos el contador de seguridad. x=0 fi } function Verificar(){ # Verificamos si hemos rellenado todas las columnas kk=${#array[@]} # Nos da el número de columnas que, #por ahora, lleva nuestro array if [ ${array[$(($kk-1))]} -eq $(($l)) ]; then # Este ciclo if verifica si la última columna ya llegado al límite. if test $kk == $k; then # Este ciclo if verifica si hemos alcanzado el límite de columnas. break fi fi } function Unidad(){ # Esta función es para sumar 1 a la columna que sea. # Llamamos a la función Verificar para ver si hemos acabado :p Verificar # Lo ponemos a 0 array[$c]=0 # Pasamos a la siguiente columna c=$(($c+1)) # Leemos el valor r=${array[$c]} # Sumamos 1 r=$(($r+1)) # Escribimos el valor array[$c]=$r Limite } # Ya hemos definido todas las funciones que necesitábamos. # Ahora empieza el ciclo principal del programa. while test $k == $k; do # Leemos el valor r=${array[$c]} # Sumamos 1 a la variable. r=$(($r+1)) # Escribimos el valor de la variable de nuevo en el array. array[$c]=$r # Llamamos a la función limite, para que compruebe si hemos # llegado al limite de la columna Limite # Esto es para mostrar en el shell la salida del programa. # Igualmente es la salida que se desvía a un archivo # externo para almacenar los vectores. echo Columnas ${array[*]} #>> prueba done
El código no está para nada optimizado (hay cosas que creo que sobran y otras que se podrían optimizar :p), pero funciona, que es lo importante. No utiliza ninguna programa externo (sólo BASH) por lo que se puede ejecutar perfectamente en cualquier sistema Linux (¿y puede que Unix y Mac OS?).
Probablemente, BASH no sea el lenguaje más rápido para esta tarea, pero a día de hoy no se ningún otro.
Espero que le sirva a alguien y que se ahorre un ratillo de programar jeje.
Y por supuesto quien quiera lo puede utilizar, modificar o lo que sea, siempre que respete mi autoría.
¡Un saludo! :d
Para el futuro quedan poder leer las opciones desde la entrada como en cualquier otro comando del terminal de linux, cambiar el ciclo While por un For (que es el que debería ir ahí) y optimizar un poco el programilla :p