使用Perl获取所有可能的字符串组合

Lih*_*hos 4 perl

给定一个字符串例如'rogerdavis'它应该将它转换为'rogerd @ vis'或'rogerdav!s'或'rogerdavi $'或'rogerd @ v!$'以及所有可能的组合并将其附加到文件中.所以基本上必须将'a'转换为'@',将's'转换为'$',将'i'转换为'!' 并使用所有可能的组合.这是在Perl中完成的.

伪代码

  • 创建一个新文件
  • 计算a,A,s,S,i,I的出现次数(或者我们只接受小型或大写的关键字以简化开关情况)
  • 计算的,我们可以通过使用组合对于我们执行关于更换字符的手头的工作的可能性总数的公式有可能性总数a ->@,s->$, i-> I
  • 为文件添加唯一条目

这是我最初想到的.请帮助我,因为我知道必须有一个简单而简单的方法来做这件事:

  1. 接受数组中的关键字 keyword[ ]
  2. 计算数组的长度 length_of_keyword
  3. 扫描阵列keyword[ ]从左到右计数= 0; for(i = 0; i}
  4. 使用count来计算可能性的总数

    total_poss =0;
    r= 1;
    new_count = count
    for (i = count; i > 0; i--)
    {
        // fact( ) will calculate factorial
        total_poss += fact(new_count)/(fact(r)*fact(new_count - r))  
        r++;
     }
    
    for (k=0; k<total_poss; total_poss++)
       copy array keyword[ ] in temporary array temp[ ];
       for (i=0; i< new_count; i++)
       {
    
           for (j = 0; j< lenght_of_keyword; j++)
           {
               if (temp[i] is equal to 'a' || 'A' || 's' || 'S' || 'i' || 'I' )
               {
                   switch (temp[j])
    
                       case i: tempt[i] = ! ;
                                  if ( modified array is equal to an entry in file)
                                      continue;
                                  else save in file; break;
                       case I: (same as above or we can have function for above code)
                     .
                     .// similarly for all cases
                     .
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

Zai*_*aid 6

我想要List::Gen旋转一下.这个问题提供了完美的借口!


use strict;
use warnings;
use List::Gen;

my %symbol = ( a => '@', A => '@',
               i => '!', I => '!',
               s => '$', S => '$', );  # Symbol table

my $string = 'rogerdavis';
my @chunks = split /(?<=[ais])|(?=[ais])/i, $string;

# Turn into arrayrefs for cartesian function

@chunks = map { $_ =~ /^[ais]$/i ? [ $_, $symbol{$_} ] : [ $_ ] } @chunks;

my $cartesian = cartesian { join '', @_ } @chunks;  # returns a generator

say for @$cartesian;  # or 'say while < $cartesian >'
Run Code Online (Sandbox Code Playgroud)

产量

rogerdavis
rogerdavi$
rogerdav!s
rogerdav!$
rogerd@vis
rogerd@vi$
rogerd@v!s
rogerd@v!$
Run Code Online (Sandbox Code Playgroud)

  • [`List :: Gen :: Cookbook`](http://search.cpan.org/perldoc?List::Gen::Cookbook)可能会展示更多方法来做到这一点 (3认同)
  • +1用于查找执行任务的CPAN模块. (2认同)

MkV*_*MkV 5

使用glob(3)的多模式支持({}),将{a,@},s替换为{s,$},将i替换为{i,!},如下所示:

my $str = 'rogerdavis';
my $glob = $str;
# set up replacement character map
my %replacements = (a => '@', s => '$', i => '!');
# add uppercase mappings
$replacements{uc $_} = $replacements{$_} for keys %replacements;
# replace 'character' with '{character,replacement}'
$glob =~ s/([asi])/{$1,$replacements{$1}}/ig;
my @list = glob($glob);
print join "\n", @list;
print "\n";
my $count = scalar(@list); 
Run Code Online (Sandbox Code Playgroud)

如果替换字符是glob(7)元字符,那么它应该被转义(3 => '\}', e => '\['例如).

更新:您可以将[asi]替换为运行Data :: Munge的list2re,fe这样的结果:

my $re = Data::Munge::list2re(keys %replacements);
$glob =~ s/($re)/{$1,$replacements{$1}}/ig;
Run Code Online (Sandbox Code Playgroud)