Hrubá síla mé gpg heslo

hlasů
1

Hloupě, Zapomněl jsem gpg heslo.

Vím, že heslo se skládá ze tří na šest řetězců, které jsou propojeny „_“.

Mezi další možnosti jsou (řekněme) 1, 2, 3, 4, 5 a 6.

Řekněme, že heslo je vlastně „2_5_3“.

Jak procházet všechny kombinace? Měla by existovat žádné duplicity (tj „2_2_4“ není platné heslo)!

Snažím se psát to v jazyce Perl, ale opravdu nevím, kde začít. Pseudo-kód je dobrá.

Předem děkuji,

UPDATE: OK, mám teď to funguje.

Není tak elegantní jako některé z níže uvedených řešení ...

#!/usr/bin/perl

use strict;
use warnings;

my @possibilities=(111,222,333,444,555,666,777);

my $size=scalar(@possibilities);
print $size.\n;

for(my $i=0;$i<$size;$i++){
        for(my $j=0;$j<$size;$j++){
                for(my $k=0;$k<$size;$k++){
                        if($i==$j || $j==$k || $i==$k){

                        }else{
                                print $i._.$j._.$k.\n;
                        }
                }
        }
}
Položena 05/03/2012 v 11:27
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
10

Zde způsob, jak to udělat s perl:

my @l = glob "{1,2,3,4,5,6}_{1,2,3,4,5,6}_{1,2,3,4,5,6}";
@l = grep{!/(\d)[_\d]*\1/}@l;
Odpovězeno 05/03/2012 v 11:54
zdroj uživatelem

hlasů
3

V podstatě budete potřebovat tři třídy pro smyčky pro iteraci přes každé slovo (nebo multi-index). Vzhledem k tomu, budete chtít, aby zajistily, že tam nejsou žádné duplikáty musíte přeskočit ty (Python kód):

names = ["abc","def","ghi","jkl","mno","pqr"]

for x in names:
    for y in names:
        if y in [x]: # word already used?
            continue # skip duplicates
        for z in names:
            if z in [x,y]: # word already used?
                continue   # skip duplicates
            print(x+"_"+y+"_"+z)

UPDATE: Perl kód (vůbec první, co jsem kdy napsal, takže myslím, že je to hrubý pro Perl vývojáře oka ...)

use strict;
use warnings;

my @words = ("abc","def","ghi","jkl","mno","pqr");
foreach my $w1 (@words){
    foreach my $w2(@words){
        next if $w1 eq $w2;
        foreach my $w3(@words){
        next if $w3 eq $w1;
        next if $w3 eq $w2;
            print $w1.'_'.$w2.'_'.$w3."\n";
        }
    }
}
Odpovězeno 05/03/2012 v 11:37
zdroj uživatelem

hlasů
1

K dispozici je modul pro který - algoritmus :: Combinatorics .

Odpovězeno 19/07/2013 v 14:26
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more