全ての組み合わせ
Posted feedbacks - xtal
fiber でジェネレータにしました。 「(...)」 というのは可変長引数をあらわすオブジェクトです。でも、コレ使うのなんかクラッシュする。。。 あと、配列の分配がきれいにかけないです。
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 | CrossProduct: class {
- _list: [];
initialize: method(...) {
(...).each_ordered_arg {
// ここのコメントを削除するとなぜかクラッシュする^^
if (it is String) {
_list.push_back(it.split("").to_a);
} else {
_list.push_back(it);
}
}
}
all: method fiber {
(fun (acc, rest) {
if (rest.empty()) {
yield acc;
} else {
x, xs: rest[0], rest.slice(1, rest.length);
x {
callee(acc ~ [it], xs);
}
}
})([], _list);
}
}
c: CrossProduct([0, 1], "ab", ["Foo", "Bar"]);
c.all {
it.p;
}
|



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