1

抱歉,如果这看起来像另一个问题 - 有很多解决方案,但我没有找到我想要的东西,但我很可能错过了它。如果标题不是最好的描述,也很抱歉 - 不知道如何措辞。

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

$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

我不知道它是否有所作为,但在我计划使用的代码中&&and !$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

4 回答 4

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";
}
于 2012-10-10T15:13:42.853 回答
3

看看Algorithm::Permute

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

perlfaq 中也对此进行了描述:如何置换列表的 N 个元素?

于 2012-10-10T15:14:34.613 回答
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);
}

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

于 2012-10-11T02:00:11.390 回答
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";
      }
  }
于 2012-10-10T15:15:20.710 回答