从不完整的输入生成可能性列表

时间:2018-01-18 18:32:02

标签: perl

给定一个包含9个十六进制字符的字符串,我需要生成一个包含所有可能包含给定9个字符的10个字符十六进制字符串的列表。该清单无需按任何特定顺序排列。

我认为完整列表将包含16x10 = 160项,但其中9项将是重复项。不要担心删除重复项,但如果您的解决方案不包含它们也不错。

例如,给定0ae4bb830,列表将包括:

00ae4bb830
10ae4bb830
20ae4bb830
30ae4bb830
40ae4bb830
50ae4bb830
60ae4bb830
70ae4bb830
80ae4bb830
90ae4bb830
a0ae4bb830
b0ae4bb830
c0ae4bb830
d0ae4bb830
e0ae4bb830
f0ae4bb830
00ae4bb830*
01ae4bb830
02ae4bb830
03ae4bb830
04ae4bb830
...
*重复

2 个答案:

答案 0 :(得分:1)

正如你的等式(10x16)所示,这只需要两个嵌套循环。

my $s = '0ae4bb830';

for my $pos (0..length($s)) {
   for my $nibble ('0'..'9', 'a'..'f') {
      say substr($s, 0, $pos) . $nibble . substr($s, $pos);
   }
}

这是我们获得副本的方式:

     inserted
        v
 ...aaa b b   ccc... = ...aaabbccc...
 ...aaa   b b ccc... = ...aaabbccc...
            ^
         inserted

一个简单的检查解决了这个问题。

my $s = '0ae4bb830';

for my $pos (0..length($s)) {
   for my $nibble ('0'..'9', 'a'..'f') {
      if ($nibble ne substr($s, $pos, 1)) {
         say substr($s, 0, $pos) . $nibble . substr($s, $pos);
      }
   }
}

顺便说一下

say substr($s, 0, $pos) . $nibble . substr($s, $pos);

可以替换为

substr(my $t = $s, $pos, 0, $nibble); say $t;

我怀疑后者的速度稍慢。

答案 1 :(得分:0)

无视重复,这只是将十六个字符放在十个可能位置中的每一个

use strict;
use warnings 'all';
use feature 'say';

my $s = '0ae4bb830';

for my $i ( 0 ..length $s ) {

    for my $h ( '0' .. '9', 'a' .. 'f' ) {

        substr my $ss = $s, $i, 0, $h;

        say $ss;
    }
}

输出

00ae4bb830
10ae4bb830
20ae4bb830
30ae4bb830
40ae4bb830
50ae4bb830
60ae4bb830
70ae4bb830
80ae4bb830
90ae4bb830
a0ae4bb830
b0ae4bb830
c0ae4bb830
d0ae4bb830
e0ae4bb830
f0ae4bb830
00ae4bb830
01ae4bb830
02ae4bb830
03ae4bb830
04ae4bb830
05ae4bb830
06ae4bb830
07ae4bb830
08ae4bb830
09ae4bb830
0aae4bb830
0bae4bb830
0cae4bb830
0dae4bb830
0eae4bb830
0fae4bb830
0a0e4bb830
0a1e4bb830
0a2e4bb830
0a3e4bb830
0a4e4bb830
0a5e4bb830
0a6e4bb830
0a7e4bb830
0a8e4bb830
0a9e4bb830
0aae4bb830
0abe4bb830
0ace4bb830
0ade4bb830
0aee4bb830
0afe4bb830
0ae04bb830
0ae14bb830
0ae24bb830
0ae34bb830
0ae44bb830
0ae54bb830
0ae64bb830
0ae74bb830
0ae84bb830
0ae94bb830
0aea4bb830
0aeb4bb830
0aec4bb830
0aed4bb830
0aee4bb830
0aef4bb830
0ae40bb830
0ae41bb830
0ae42bb830
0ae43bb830
0ae44bb830
0ae45bb830
0ae46bb830
0ae47bb830
0ae48bb830
0ae49bb830
0ae4abb830
0ae4bbb830
0ae4cbb830
0ae4dbb830
0ae4ebb830
0ae4fbb830
0ae4b0b830
0ae4b1b830
0ae4b2b830
0ae4b3b830
0ae4b4b830
0ae4b5b830
0ae4b6b830
0ae4b7b830
0ae4b8b830
0ae4b9b830
0ae4bab830
0ae4bbb830
0ae4bcb830
0ae4bdb830
0ae4beb830
0ae4bfb830
0ae4bb0830
0ae4bb1830
0ae4bb2830
0ae4bb3830
0ae4bb4830
0ae4bb5830
0ae4bb6830
0ae4bb7830
0ae4bb8830
0ae4bb9830
0ae4bba830
0ae4bbb830
0ae4bbc830
0ae4bbd830
0ae4bbe830
0ae4bbf830
0ae4bb8030
0ae4bb8130
0ae4bb8230
0ae4bb8330
0ae4bb8430
0ae4bb8530
0ae4bb8630
0ae4bb8730
0ae4bb8830
0ae4bb8930
0ae4bb8a30
0ae4bb8b30
0ae4bb8c30
0ae4bb8d30
0ae4bb8e30
0ae4bb8f30
0ae4bb8300
0ae4bb8310
0ae4bb8320
0ae4bb8330
0ae4bb8340
0ae4bb8350
0ae4bb8360
0ae4bb8370
0ae4bb8380
0ae4bb8390
0ae4bb83a0
0ae4bb83b0
0ae4bb83c0
0ae4bb83d0
0ae4bb83e0
0ae4bb83f0
0ae4bb8300
0ae4bb8301
0ae4bb8302
0ae4bb8303
0ae4bb8304
0ae4bb8305
0ae4bb8306
0ae4bb8307
0ae4bb8308
0ae4bb8309
0ae4bb830a
0ae4bb830b
0ae4bb830c
0ae4bb830d
0ae4bb830e
0ae4bb830f