Edit Comment on
2005-08-20
n[0] = "
K保
"; m[0] = "R だとすごく簡単です.
library(gtools)
combinations(5, 3) # 5 個の中から 3 個とる組み合わせすべて
以上"; d[0] = "2005-08-20 12:21:41"; n[1] = "
K保
"; m[1] = "Perl で組み合わせ列挙やるのはこんなかんぢでしょうか
use Math::Combinatorics;
print join("\n", map { join(" ", @$_) } combine(3, (1 .. 5)));"; d[1] = "2005-08-20 12:31:16"; n[2] = "橘"; m[2] = "なるほど、Math::Combinatoricsなんてモジュールがあるんですね。Rだとgtoolsパッケージですか。
でもMath::Combinatoricsって標準添付モジュールではないですよね。RはともかくPerlでは徹底して非標準モジュールは使わないことにしている(Rを呼び出すのはもってのほか)ので困りましたねぇ。モジュールの中身でも読んでみますかね。"; d[2] = "2005-08-20 18:54:01"; n[3] = "
K保
"; m[3] = "Perl だとこういう関数で OK だと思います.
use strict;
sub combo
{
my ($k, $array_orig) = @_;
my @array = @$array_orig; # copy
my @set;
if ($k == 1) {
@set = map { [$_] } @array;
}
else {
for (0 .. (scalar(@array) - $k)) {
my $head = shift @array;
my @copy = @array;
for my $s (@{&combo($k - 1, \@copy)}) {;
push @set, [$head, @$s];
}
}
}
return \@set;
}
実行例は
print join("\n", map { join(", ", @$_) } @{&combo(3, [1 .. 5])}), "\n";
とか
for my $s (@{&combo(4, [1 .. 8])}) {
print join(", ", @$s), "\n";
}
考えかたは &combo(3, [1 .. 4]) の場合
1-2-3
-4
3-4
2-3-4
という「木」を生成する,というものです.
"; d[3] = "2005-08-20 22:06:22"; n[4] = "
K保
"; m[4] = "いんでんとが全部なくなってしまった……
みぐるしくてすみません.嗚呼"; d[4] = "2005-08-20 22:07:44"; n[5] = "
K保
"; m[5] = "見やすいコード
http://hosho.ees.hokudai.ac.jp/~kubo/log/2005/img08/combo.pl.txt
におきました.たびたびおさわがせしてすみません."; d[5] = "2005-08-20 22:40:30"; n[6] = "橘"; m[6] = "おおーう、わざわざすみません。感謝感激雨霰でございますよ。"; d[6] = "2005-08-20 23:10:59";
(password)