道歉,如果这看起来像另一个问题 - 有很多解决方案,我没有找到我正在寻找的东西,但我可能错过了它。如果标题不是最佳描述,也要道歉 - 不确定如何说出来。
我有五个'特征'作为字符串,例如:
$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 ...)
答案 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)
use Algorithm::Permute;
my @array = ($height, $width, $depth, $length, $colour);
Algorithm::Permute::permute { print "@array" } @array;
中也对此进行了描述
答案 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)
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";
}
}