全ての組み合わせ
Posted feedbacks - PHP
リストを配列と読替えて、文字列も配列へ変換してます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <?php
function CrossProduct() {
$n = func_num_args();
foreach ( func_get_args() as $arg ) {
if ( !is_array($arg) ) {
$splt = array();
for ( $i = 0; $i < strlen($arg); $i++ ) {
$splt[] = substr($arg,$i,1);
}
$arg = $splt;
}
$args[] = $arg;
}
$max = count($args[0]);
if ( $n > 1 ) {
for ( $i = 1; $i < $n; $i++ ) {
$max *= count($args[$i]);
}
}
$pmax = $max;
for ( $i = 0; $i < $n; $i++ ) {
$pmax = $pmax / count($args[$i]);
$cnt = 0;
$line = 0;
$k = 0;
do {
$cnt++;
if ( $cnt > $pmax ) {
$cnt = 1;
$k++;
if ( $k >= count($args[$i]) ) {
$k = 0;
}
}
$rtn[$line][] = $args[$i][$k];
$line++;
} while ( $line < $max );
}
return $rtn;
}
$a = array(0,1);
$b = "ab";
$c = array("Foo","Bar");
$d = "XYZ";
print_r(CrossProduct($a,$b,$c,$d));
?>
|


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