1

これが別の問題のように見える場合は、お詫び申し上げます。かなり多くの解決策があり、探しているものが見つかりませんでしたが、見落としていた可能性があります。また、タイトルが最適な説明ではない場合はお詫び申し上げます - 他にどのように表現すればよいかわかりません。

文字列として 5 つの「機能」があります。

$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: How do I permute N elements of a list?でも説明されています。

于 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 に答える