全ての組み合わせ
Posted feedbacks - Perl
以外と難易度は低い。spliceの使い方に注目。 Dan the Perl Monger
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/usr/local/bin/perl
use strict;
use warnings;
sub crossprod{
my ($a1, $a2) = splice @_, 0, 2;
my @result;
for my $e1 (@$a1){
for my $e2 (@$a2){
push @result, [(ref $e1 ? @$e1 : $e1), $e2];
}
}
@_ ? crossprod([@result], @_) : [ @result ];
}
use Data::Dumper;
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Indent = 0;
$\="\n";
print Dumper crossprod([qw/1 2 3/],[qw/a b c/],[qw/x y z/]);
|


zigorou #3400() Rating0/0=0.00
Pythonで表現すると下のようになります。
順番はこの通りでなくても構いません。返すものはリストと書きましたが、 なんらかの「一度に全部をメモリ上に作成しないリスト状のモノ」がある言語ではそちらを使う方がおすすめです。 数値や文字列を一つのリストに混在させるのがやっかいな言語では整数のリストに限定しても構いません。このお題はZIGOROuさんとのやりとりにヒントを得て作りました。 (しまった、先にブログで公開されてしまった→Yet Another Hackadelic - 直積の導出と考えうる全ての値を網羅したハッシュの生成)
追記:サンプル出力が間違っていたのでoceanさんの解答を使って出力し直しました。
[ reply ]