Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Gerador de combinações

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Perl Gerador de combinações

    Desenvolvi esse código para gerar da forma mais rápida possível as combinações, sendo esse o resultado final do que obtive de mais rápido.

    Você só precisa mudar as as 3 primeiras linhas do código onde se encontram: o tamanho da combinação; os caracteres usados; e o arquivo onde irá salvar.

    Vale lembrar que do modo que se encontra o código ele vai gerar 78.074.896 combinações que no meu PC demorou 53,7976429462433 segundos (Usei o Time::HiRes para marcar o tempo). Mas já cheguei a gerar 1bilhão em 600 segundos. Estou usando versao 32 bits do perl no windows com computador i7 2.8ghz para quem quiser usar como comparação.

    Faça o uso que desejar. Abraços!

    Código:
    #!/usr/bin/perl
    my $q = 4; #Tamanho da combinação, mas cuidado, quanto maior for mais tempo irá demorar para gerar...
    my @chars = ((0..9),(a..z),(A..Z),qw(! @ # $ % ^ & * - _ + = ; : " ' < > , . ? / \ | ` ~ ( ) { } [ ])); #Caracteres usados para gerar a combinação, você pode retirar ou acrescentar caracteres, desde que inseridos como arrays.
    my $file = 'combinacoes.txt'; #arquivo onde você deseja salvar as combinações
    my $ncs = $#chars;
    my $totalcom = scalar(@chars)**$q;
    print "Caracteres usados: @chars\n\nTotal de caracteres:".scalar(@chars)."\n\nTamanho da combinacao: $q\n\nTotal de combincacoes: $totalcom\n\nPara interromper use Ctrl+C\n";
    open $fh,'>',$file or die "Falha ao abrir para escrever no arquivo $file!";
    my $inc = 0;
    my $i = $q -1;
    for my $x (0..$i) {
      $c[$x] = ($x == $i) ? -1:0;
      $n[$x] = $chars[$c[$x]];
    }
    my @a = reverse(0..$i);
    inicio:
    $inc++;
    for my $x (@a) {
      if ($c[$x] < $ncs) {
        $c[$x]++;
    	$n[$x] = $chars[$c[$x]];
    	last;
      }
      $c[$x] = 0;
      $n[$x] = $chars[$c[$x]];
    }
    print $fh join("",@n)."\n";
    goto inicio if ($inc < $totalcom);
    close $fh;
    print "\nFIM!";
    exit 0;
X
Working...
X