2012-03-05 120 views
1

愚蠢的是,我忘記了我的gpg密碼。蠻力我的gpg密碼

我知道密碼是由由「_」連接的六個字符串中的三個組成的。

可能性是(比方說)「1」,「2」,「3」,「4」,「5」和「6」。

假設密碼實際上是「2_5_3」。

如何遍歷所有組合?不應有重複項(即「2_2_4」不是有效的密碼)!

我試圖用Perl寫這篇文章,但並不知道從哪裏開始。僞碼很好。

提前許多感謝,

UPDATE: OK,我現在的工作。

不一樣優雅一些下面的解決方案......

#!/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"; 
         } 
       } 
     } 
} 
+10

嗯。這聽起來像是功課...... – 2012-03-05 10:29:52

+0

'幫我破解我的密碼'。我並不擔心幫助做功課,而是擔心現在正在發送黑色直升機。 – 2012-03-05 10:58:15

+2

我對這些評論的推論不滿意 – Eamorr 2012-03-05 11:03:45

回答

3

基本上你需要三個for循環遍歷每個單詞(或多指標)。既然你要確保沒有任何重複,你必須跳過這些(Python代碼):

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代碼(最先我曾經寫過,所以我想這是總的開發商的Perl的眼睛...)

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"; 
     } 
    } 
} 
+0

«foreach我的$ wd(@words)»會是更好的循環方式。而使用if語句修飾符而不是&&會使代碼更清晰,接下來如果$ w1 eq $ w2»,或者它可以在foreach語句本身中被清除。 – 2012-03-05 11:30:54

10

下面的方式使用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; 
+1

+1,漂亮,從不知道你可以用glob做到這一點 – Hasturkun 2012-03-05 11:21:23