2012-10-10 51 views
1

如果這看起來像是另一個問題 - 有很多解決方案,我沒找到我要找的東西,但我可能錯過了它。也道歉,如果標題不是最好的描述 - 不知道該怎麼說。實用的Perl解決方案,通過列表進行獨特組合排列

我有五個 '功能' 爲字符串,如:

$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個特徵時,我很好的做了這件事,但是它太過分了! 我認爲把變量放在哈希中可能會是一個很好的起點,但對於實際的算法......任何幫助表示讚賞!

編輯:剛剛意識到這可能不是很清楚,但我希望能夠「查詢」,因爲他們將在每個組合如果/ ELSIF語句,所以if (h && w && !d ...)

+2

這是幹什麼用的?它聞起來像可能有更好的方法來解決你試圖解決這個問題。 – Schwern

+0

有可能......這是一個我正在研究的項目,所有組合都與一組特定的sql語句相關,其中一些用戶具有他們選擇的任何功能,以影響結果。我現在必須找出最好的方法來做那些haha – dgBP

+0

爲什麼你需要預先計算每個可能的排列? – Schwern

回答

6

編碼配置爲5位整數並且從0開始迭代到2 -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

我正準備寫那個。當你做到的時候,你會發布好的! :) – ikegami

+0

'$ i&[num]'部分是做什麼的? – dgBP

+0

@bladepanthera http://perldoc.perl.org/perlop.html#Bitwise-And – TLP

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?

+0

+1有趣的答案,目前我無法安裝新模塊,所以我無法測試這個,但謝謝。 – dgBP

+0

這實際上是一個perlfaq:http://search.cpan.org/~flora/perl-5.14.2/pod/perlfaq4.pod#How_do_I_permute_N_elements_of_a_list? – TLP

+0

[但是我不能使用CPAN](http://shadow.cat/blog/matt-s-trout/but-i-cant-use-cpan/)... [是的,即使你可以使用CPAN] (http://www.perlmonks.org/?node_id=693828) –

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"; 
     } 
    } 
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); 
} 

你必須自己處理退化情況(沒有高度,沒有寬度,沒有深度,沒有長度,沒有顏色)。

相關問題