实用的Perl解决方案,通过列表排列独特的组合

时间:2012-10-10 15:06:53

标签: perl permutation combinations

道歉,如果这看起来像另一个问题 - 有很多解决方案,我没有找到我正在寻找的东西,但我可能错过了它。如果标题不是最佳描述,也要道歉 - 不确定如何说出来。

我有五个'特征'作为字符串,例如:

$height $width $depth $length $colour

我希望获得所有不同的 唯一 组合,从5开始,一直到1,例如:

5: $height $width $depth $length $colour
4: $height $width $depth $length 
4: $height $width $depth $colour
4: $height $width $length $colour
4: $height $depth $length $colour
4: $width $depth $length $colour
...
and so on 
...
1: $height 
1: $width 
1: $depth 
1: $length 
1: $colour

我不知道它是否有所作为,但在代码中我打算使用&&!$string,例如:

4: $height && $width && $depth && $length && !$colour 
4: $height && $width && $depth && !$length && $colour
4: $height && $width && !$depth && $length && $colour
4: $height && !$width && $depth && $length && $colour
4: !$height && $width && $depth && $length && $colour
and so on.

当我有4个功能时,手工完成这个很好,但是5个太多了! 我认为将变量放在哈希中可能是一个很好的起点,但对于实际的算法......任何帮助都有所帮助!

编辑:刚刚意识到它可能不太清楚,但我希望能够“查询”每个组合,因为它们将出现在if / elsif语句中,所以if (h && w && !d ...)

4 个答案:

答案 0 :(得分:6)

将配置编码为5位整数,并从0到2 5 -1进行迭代。

for ($i = 0; $i < 1<<5; $i++) {

    my @output;
    push @output,  $i & 1  ? '$height' : '!$height';
    push @output,  $i & 2  ? '$width' : '!$width';
    push @output,  $i & 4  ? '$depth' : '!$depth';
    push @output,  $i & 8  ? '$length' : '!$length';
    push @output,  $i & 16 ? '$colour' : '!$colour';

    print join(' && ', @output), "\n";
}

答案 1 :(得分:3)

查看Algorithm::Permute

use Algorithm::Permute; 
my @array = ($height, $width, $depth, $length, $colour); 
Algorithm::Permute::permute { print "@array" } @array;

perlfaq:How do I permute N elements of a list?

中也对此进行了描述

答案 2 :(得分:1)

您想要独特的组合吗?试试Math::Combinatorics

use strict;
use warnings;
use feature qw(say);
use Math::Combinatorics qw(combine);

our @primary_qualities = qw(height width depth length colour);

for my $n (1 .. @primary_qualities) {
  say "@$_" for combine($n, @primary_qualities);
}

你必须自己处理堕落的情况(没有高度,没有宽度,没有深度,没有长度,没有颜色)。

答案 3 :(得分:0)

尝试使用Algorithm::Permute

use Algorithm::Permute;

  my $props = [$height, $width, $depth, $length, $colour];



  foreach my $n ( 1.. scalar( @$props) ){
      my $p = new Algorithm::Permute($props, $n);
     #you can create r of n objects permutation generator, where r <= n
      while (@res = $p->next) {
        print join(", ", @res), "\n";
      }
  }