Embaralhando elementos de um vetor
Publicado por Sandro Marcell 19/03/2009
[ Hits: 7.528 ]
Homepage: http://sanmarcell.wordpress.com
Um exemplo que mostra como embaralhar os elementos de um vetor em shell script.
Este script é um "quase equivalente" à função "shuffle" de linguagens com Perl, PHP, etc... Como dito acima, isso é apenas um exemplo, então se for o caso adapte-o (ou melhore-o!) conforme desejado.
Falou!!! =)
#!/bin/zsh -f
#
# Embaralhando de forma simples elementos dum vetor.
#
# Sandro Marcell (sandro_marcell@yahoo.com.br)
# Boa Vista, Roraima - 13/03/2009. (Sexta-feira 13!!!)
#
# Uso: script <valores>
#
# Ex.:
# ./script 1 2 3 4 5 a b c d e
# ./script `cat /etc/group`
#
# Obs.:
# - Isto e apenas um esboco de codigo, a intencao e mostrar ao usuario uma
# forma BEM SIMPLES de embaralhar elementos dum vetor. Portanto se for o
# caso, adapte-o (ou melhore-o!) conforme desejar;
# - Os dados de entrada/saida sao tratados como vetor;
# - Este script e um 'quase equivalente' a funcao 'shuffle' de linguagens
# como Perl, PHP, etc...;
# - Quanto maior o array, melhor sera o nivel de 'embaralhamento';
# - Voce tambem pode utilizar a variavel $RANDOM, ao inves do modulo
# de funcoes matematicas do zsh;
# - Mais detalhes: 'man zsh';
# - Script passivel de melhorias! =)
zmodload -i zsh/mathfunc
seed=$$
default="zero um dois tres quatro cinco seis sete oito nove"
# 'array' tera seus elementos embaralhados e 'shuffled' os armazenara.
typeset -a array shuffled
array=($*)
shuffled=()
[ -z "$array" ] && array=($(print $default))
# O 'pulo do gato' =)
# A variavel 'size' ira conter como valor o tamanho do vetor, e com isso
# determinara a quantidade de interacoes a serem realizadas pelo loop.
size=${(w)#array}
while ((i++ < size))
do
# Gera-se um valor com base no tamanho do vetor. Esse valor sera
# utilizado como indice, para referenciar elementos no vetor.
#index=$((1 + (${(w)#array} * RANDOM / 32767)))
index=$((1 + int(${(w)#array} * rand48(seed))))
# Utilizando o indice gerado, armazena-se o elemento por ele
# referenciado em 'shuffled'.
shuffled+=($array[$index])
# E para evitar que o elemento armazenado seja reutilizado, basta
# remove-lo do vetor!
# Obs.: Note que o vetor 'array' ao final do processo tera todos
# os seus elementos removidos.
array[$index]=()
done
print "$shuffled[*]"
# Fim
Bloqueando ataque de força bruta em ssh através de script bash
Srt2vtt in Shell Script (Beta)
Desenvolvimento Java Para para máquinas "leves" (ou pra quem não quer eclipse, :P)
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
ERRO: LAZARUS 4.2 64 no Linux MINT não entra mais apos ajustar desktop... (0)
Pergunta: Meu teclado não está respondendo direito como e consertar? (2)
Secure boot, artigo interessante, nada técnico. (6)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (0)









