Geração de palavra com loops aninhados

0

Eu fiz este script que gera todas as combinações de letras minúsculas e números e os ecoa. Ele funciona, mas eu estou querendo saber se existe uma maneira de simplificar o processo de adicionar um novo char em vez da minha maneira atual de ter que fazer uma nova função para cada novo caractere que eu queira adicionar. Aqui está meu script:

declare -r LIST=$(echo {a..z} {0..9})

function word_generation_2 {
    for char1 in  ${LIST}; do
        for char2 in  ${LIST}; do
            echo ${char1}${char2}
        done
    done
}

function word_generation_3 {
    for char1 in  ${LIST}; do
        for char2 in  ${LIST}; do
            for char3 in  ${LIST}; do
                echo ${char1}${char2}${char3}
            done
        done
    done
}


function word_generation_4 {
    for char1 in  ${LIST}; do
        for char2 in  ${LIST}; do
            for char3 in  ${LIST}; do
                for char4 in  ${LIST}; do
                    echo ${char1}${char2}${char3}${char4}
                done
            done
        done
    done
}


function word_generation_5 {
    for char1 in  ${LIST}; do
        for char2 in  ${LIST}; do
            for char3 in  ${LIST}; do
                for char4 in  ${LIST}; do
                    for char5 in  ${LIST}; do
                         echo ${char1}${char2}${char3}${char4}${char5}
                    done
                done
            done
        done
    done
}


for ((i = 2; i < 6; i++)); do
    word_generation_${i}
done

A saída é:

aa

...


99999

Eu quero continuar assim. Primeiro todas as combinações de 2 caracteres, depois todas as combinações de 3 caracteres, etc.

    
por B.P.R. 19.10.2016 / 11:19

1 resposta

1

No Bash ou em algo que suporte matrizes , você pode colocar o conjunto de caracteres em uma matriz e loop sobre a matriz novamente, prefixando os caracteres novamente:

chars=( {a,b,c} )
doubles=()
triplets=()
for c in "${chars[@]}" ; do 
    doubles+=( ${chars[@]/#/$c} )
done
for c in "${chars[@]}" ; do 
    triplets+=( ${doubles[@]/#/$c} )
done
echo "${triplets[@]}"

que imprime aaa aab aac ... ccc e você pode repetir conforme necessário para os mais longos ou transformá-lo em uma função recursiva. (O ${var//} é uma substituição de padrão em que # marcas o início da string.Quando é aplicado a um array, aplica-se a todos valores do array, um de cada vez.

    
por 19.10.2016 / 11:51