shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

calcular permutações usando bash


From: Tiago Barcellos Peczenyj
Subject: calcular permutações usando bash
Date: Fri, 3 Feb 2006 19:30:14 -0200

eu, sem muito o que fazer, peguei um problema de encontrar permutações
de valores com bash, segue o exemplo:

#!/bin/bash
a=(0 1 2)

permut(){
local j
if [ "$#" -eq "${#a[@]}" ]
then echo $@
else for j in $( echo ${a[@]} | tr ' ' '\n' | grep -v -f<(echo $@ | tr
' ' '\n') )
do permut $@ $j
done
fi
}

for i in ${a[@]}
do permut $i
done
exit 0

Segue explicação maluca:
Forma: Recursiva

Se vc tem um vetor A de X posições, o que vc pode fazer é : fazer um
laço percorrendo todos os elementos do vetor, passando como argumento
para uma função recursiva, exemplo .

A = [ 0 1 2 ]

funcao 0
funcao 1
funcao 2

Este é o primeiro passo. O que esta funcao faz ? um outro laco. so que
agora chamando ela mesmo com 2 argumentos ! o original e mais outro...
veja só :

funcao 0 1
funcao 0 2

humm como assim ? ora, se a funcao recebe um argumento Z qualquer, ela
faz um laço, pegando todos os elementos do vetor diferentes de Z. no
caso de 0, sao o 1 e 2.

Ta mais pq ? ora... vc ta montando as permutacoes. veja agora a
jogada: vc chamou a funcao 0 2, logo ela tem que fazer um laco entre
todos os valores diferentes de 0 e 2 sendo passados como terceito
argumento !
funcao 0 2 1
funcao 0 2 3
...
funcao 0 2 9

ou seja, vc faz um laço com o que vc nao fornece pra funcao, ai ela
vai se replicando... replicando...

bueno e ai ? ai que quando ela tiver 10 valores como argumento, não
tem que fazer laço nenhum, tem que imprimir o resultado na tela !

o for em j de dentro da permut faz o seguinte

echo ${a[@]} | tr ' ' '\n' | grep -v -f<(echo $@ | tr ' ' '\n')

bah q troço bizarro... mas acompanha comigo

${a[@]} são todos os elementos do vetor a
$@ são todos os argumentos que permut recebe

essa maluquice com echo, tr e grep -v serve pra pegar todos os
elementos de 'a' que não foram encontrados nos parametros da funcao.

pega um terminal unix e manda esse bichinho rodar pra tu ver...

MAS PRA 10 É muito lento !!!

segue um pedaço do que ele ta calculando agora:

0 1 2 8 6 5 9 3 4 7
0 1 2 8 6 5 9 3 7 4
0 1 2 8 6 5 9 4 3 7
0 1 2 8 6 5 9 4 7 3
0 1 2 8 6 5 9 7 3 4
0 1 2 8 6 5 9 7 4 3
0 1 2 8 6 7 3 4 5 9
0 1 2 8 6 7 3 4 9 5
0 1 2 8 6 7 3 5 4 9
0 1 2 8 6 7 3 5 9 4
0 1 2 8 6 7 3 9 4 5
0 1 2 8 6 7 3 9 5 4
0 1 2 8 6 7 4 3 5 9
0 1 2 8 6 7 4 3 9 5
0 1 2 8 6 7 4 5 3 9
0 1 2 8 6 7 4 5 9 3
0 1 2 8 6 7 4 9 3 5
0 1 2 8 6 7 4 9 5 3

tem outras formas de fazer ? obvio... mas teste é um algoritmo que funfa...

Desculpem a forma esquizofrenica de explicar... mas estou semi
empolgado. alias devem existir outras formas de fazer estas coisas em
bash ;-)

--
Tiago B Peczenyj
Linux User #405772

echo 435991959574767208964049173891616024402182829083447460457482P | dc


reply via email to

[Prev in Thread] Current Thread [Next in Thread]