愚蠢的是,我忘记了我的gpg密码。
我知道密码是由“_”连接的六个字符串中的三个组成。
可能性是(假设)“1”,“2”,“3”,“4”,“5”和“6”。
假设密码实际上是“2_5_3”。
如何遍历所有组合?应该没有重复项(即“2_2_4”不是有效密码)!
我正在尝试用Perl写这个,但不知道从哪里开始。伪代码很好。
非常感谢,
更新:好的,我现在就开始工作了。
不如以下某些解决方案那么优雅......
#!/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";
}
}
}
}
答案 0 :(得分: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 :(得分: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)
更新: 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";
}
}
}
答案 2 :(得分:1)
有一个模块 - Algorithm::Combinatorics。