Aqui está uma solução bash que leva o tamanho desejado como parâmetro (você faria permute 5
no seu caso):
#!/bin/bash
charset=({a..z} {A..Z} {0..9})
permute(){
(($1 == 0)) && { echo "$2"; return; }
for char in "${charset[@]}"
do
permute "$((${1} - 1 ))" "$2$char"
done
}
permute "$1"
É dolorosamente lento, no entanto. Ouso eu recomendo C? link
#include <stdio.h>
//global variables and magic numbers are the basis of good programming
const char* charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
char buffer[50];
void permute(int level) {
const char* charset_ptr = charset;
if(level == -1){
puts(buffer);
}else {
while(buffer[level]=*charset_ptr++) {
permute(level - 1);
}
}
}
int main(int argc, char **argv)
{
int length;
sscanf(argv[1], "%d", &length);
//Must provide length (integer < sizeof(buffer)==50) as first arg;
//It will crash and burn otherwise
buffer[length]='make CFLAGS=-O3 permute && time ./permute 5 >/dev/null #about 20s on my PC
';
permute(length - 1);
return 0;
}
Execute:
#!/bin/bash
charset=({a..z} {A..Z} {0..9})
permute(){
(($1 == 0)) && { echo "$2"; return; }
for char in "${charset[@]}"
do
permute "$((${1} - 1 ))" "$2$char"
done
}
permute "$1"
As linguagens de alto nível são contra o uso de força bruta (que é basicamente o que você está fazendo).