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

Re: Comando per generare permutazioni di caratteri



Il 21/07/2010 13:12, Premoli, Roberto ha scritto:
Mi ricordo di aver usato in passato in comando che ricevendo in input in
intervallo generava tutte le pemutazioni di lettere comprese in tale
intervallo, una cosa del tipo:

Comando -quantita' 2 -intervallo a-z

Output:

aa
..
zz

Il problema, ovviamente, e' che NON mi ricodo questo comando e google
non sono riuscito ad usarlo in modo tale da avere risposta.
Qualcuno si ricorda questo comando? Certo, potrei fare uno script, ma
credo il comando sia molto piu' veloce.
Penso sia questo che cerchi:
#!/bin/bash
function anagram(){
    local array
    word=$1
    len=${#word}
    if [[ $len == 1 ]]; then echo $word; return; fi
    end=$(($len - 1))
    for i in $(seq 0 $end)
      do
      array[$i]=${word:$i:1}
    done
    for i in $(seq 0 $end)
      do
      tmp=${array[$i]}
      array[$i]=${array[0]}
      array[0]=$tmp
      new=$(echo ${array[@]:1} | sed s/" "//g)
      for j in $(anagram $new)
        do
        echo ${array[0]}$j
      done
    done
    return
}
word=$(echo $1 | tr "A-Z" "a-z")
anagram $word


oppure in perl:

#!/usr/bin/perl
# da riga di comando
# perl -e 'a("",split("",$ARGV[0]));sub a{my ($p,@s)=@_;if(@s){my $r=@s;while($r--){my $c=shift @s;a($p.$c,@s);push @s,$c}}else{print "$p\n"}}'

a("",split("",$ARGV[0]));


sub a{
   my ( $p, @s ) = @_;
   if ( @s ) {
       my $r = @s;
       while ( $r-- ) {
           my $c = shift @s;
           a($p. $c, @s);
           push @s, $c
       }
   } else {
       print "$p\n"
   }
}



ciao
Beppe

P.S.:
non chiedermi come funziona l'ho copiato da una risposta tempo fa!!!

--
le nuvole non hanno regole,
perchè non hanno mai rinunciato
alla libertà di sognare.



Reply to: