combination 2

15日 の続きメモるの忘れてた。
忘れるし。

結局、combination(["A","B","C"]); で [ [ [0,"A"],[1,"B"] ], [ [0,"A"],[2,"C"] ], [ [1,"B"],[2,"C"] ] ] を得るように。別の sub で [ [0,1],[0,2],[1,2] ] 作って、zip 使った方がよかったな。



# 配列から全てのコンビネーションを得る
sub combination {
my $ary = shift;
my $con = shift || [];
my $first_index = shift || 0;

my $first = shift @$ary;
my $i = $first_index + 1;
foreach my $e (@$ary) {
push(@$con, [[$first_index, $first], [$i, $e]]);
$i++;
}
combination($ary, $con, $first_index + 1) if (scalar(@$ary));
return $con;
}

下のように使ってる。


# 重複チェック
sub check_duplicate {
my $ary = shift;

my $size = scalar(@$ary);
my $con = combination($ary);
foreach my $a (@$con) {
my ($li, $lv) = @{$a->[0]};
my ($ri, $rv) = @{$a->[1]};
if ($lv eq $rv) {
my $ln = $li + 1;
my $rn = $ri + 1;
die qq|$ln と $rn で、同じものが選択されています。| .
qq|li=$li, lv="$lv", ri=$ri, rv="$rv"|;
}
}
}

こっちも、1 == 2 == 3 だった時、grep かなんか使って丸ごと出した方がいいよなぁ。


追記:
サイドバーが下に行ってしまうので、コード幅の調整。RSS reader で読んでいる人ごめんなさい。