• ベストアンサー
  • 暇なときにでも

組み合わせのパターンを作成する関数

組み合わせのパターンを作成する関数を作成したいと思っています。 仕様は以下のような感じです。 引数 ・list:材料となる文字の配列 ・len:作成する文字列の数(2以上) 戻り値 ・組合わせた文字列の配列 例 (["a", "b", "c"], 2)→["aa", "ab", "ac", "ba", "bb", "bc", "ca", "cb", "cc"] (["a", "b"], 3)→["aaa", "aab", "aba", "abb", "baa", "bab", "bba", "bbb"] 私はとりあえず作成する総パターン数(Math.pow(list.length, len))回ループでまわし、indexをtoStrungでn進数にし(ゼロパディングし)、最後に数字と対応する文字を置換するという方法で実装しました。とりあえず動いています。 しかし他にもいろいろなアルゴリズムが考えられそうなので、他の実装・よりよい方法を知りたいと思いまして質問させていただくことにしました。 できれば具体的なコードを教えていただきたいです。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数13
  • 閲覧数650
  • ありがとう数16

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.3

ひょうじゅんとは? var result = []; var x = ['a', 'b', 'c']; var len = x.length; for (var i = 0, I = len; i < I; i++)  for (var j = 0, J = len; j < J; j++)   result.push (x[i] + x[j]); alert (result.join ('\n')); -- var result = []; var x = ['a', 'b']; var len = x.length; for (var i = 0, I = len; i < I; i++)  for (var j = 0, J = len; j < J; j++)   for (var k = 0, K = len; k < K; k++)    result.push (x[i] + x[j] + x[k]); alert (result.join ('\n')); -- if(!Array.prototype.reduce)Array.prototype.reduce=function(d){var c=this.length;if(typeof d!="function")throw new TypeError;if(c==0&&arguments.length==1)throw new TypeError;var a=0;if(arguments.length>=2)var b=arguments[1];else{do{if(a in this){b=this[a++];break}if(++a>=c)throw new TypeError;}while(1)}for(;a<c;a++)a in this&&(b=d.call(null,b,this[a],a,this));return b}; var rcombination =  function (memo, count) {   return function (r, m, _, a) {    return (count > 1)     ? a.reduce (rcombination (memo.concat (m), count - 1), r)     : r.concat ([ memo.concat (m) ]);   }; }; alert (['a', 'b', 'c'].reduce (rcombination ([ ], 2), [ ]).join("\n")); alert (['a', 'b'].reduce (rcombination ([ ], 3), [ ]).join("\n"));

共感・感謝の気持ちを伝えよう!

質問者からのお礼

saisyonofutatsuwa hikisuugahenkasurutabini kodowokakikaenakerebanaranai nodesuyone? tatoeba kumiawasenomojiga juudattararupumojuuni hyakudattarahyakunorupuwo kakunodesuyone. moushiwakearimasenga watashinokonomidewaarimasen. ...koremo... wakarinikukattadesu. shikashi sankouninarimashita. arigatougozaimashita.

関連するQ&A

  • トリペプチドの構造

    A,Bというアミノ酸を使ってトリペプチドをつくる場合、考えられる構造は何種類になるのでしょうか? 基礎的なところですが、納得のいく回答がなかなか得られなかったので、詳しい方はご回答ください。 私の考えでは、AAB,ABB,ABA,BBA,BAA,BABの6種類だと考えてます。 この際、AAB,BAAは構造異性体で別のものと考えても問題ないでしょうか? 宜しくお願いします。

  • パターンマッチで・・・

    正規表現で、例えば以下の文字列とパターンがあった場合 <top>book<bottom><top>radio<bottom><top>table<bottom> (…以下同じようなパターンが続く) パターン→<top>文字列<bottom> この文字列中のパターン数が未定という条件でマッチした文字列を順に配列に格納するにはどのようなコードにしたらよいのでしょうか? お手数ですがご教授お願いします。

    • ベストアンサー
    • PHP
  • 配列について

    こんにちは。 int p[1000]という整数型の配列を作成しました。 例えば、 p[0] = 1; p[1] = 2; p[2] = 3; ・ ・ ・ p[99] = 100; を格納し、配列の長さ?を調べる際、 unsigned int len = 0; while(p[len]!='\0') len++; とすることで調べることが可能でしょうか?p[100]番以降に0が格納されている場合それがナル文字となるのでしょうか? また、char c[1000]と文字列型の配列を作成し、文字列の数値を格納していく場合、一桁であれば要素1個(1Byte?)で格納できますが、二桁以上であれば要素2個以上(2Byte以上←あっていますでしょうか)必要です。 c[0]='1' c[1]='2' c[2]='3' c[3]='4' ・ ・ ・ c[9]='1' c[10]='0' c[11]='1' c[12]='1' ・ ・ ・ ここで問題なのですが、文字列10と文字列11の判別はできないのでしょうか? 110111が連続している場合も値110と値111と判別できないのでしょうか? 値を格納する場合は、整数型のint c[1000]を用意するという事でしょうか? よろしくお願いします。

その他の回答 (12)

  • 回答No.13

ついき2! もうひとつみっけ! list.length が10をこえると、おきかえがへんになる Nshinnsuu にへんかんしないと

共感・感謝の気持ちを伝えよう!

質問者からのお礼

naruhodo. korehaookinamondaidesune... sankouninarimashita. goshiteki arigatougozaimashita.

  • 回答No.12

ついき 0でうめるときに tmp にくわえるのは、list[0] でそくどあっぷ。 ひごろ、ひりきなましんでうごかす「身」としては、きになる。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

arigatougozaimashita.

  • 回答No.11

#Array.push を、つかっているじてんで、そくどのことをとやかくいえるものでもないのですが、るーぷのなかにせいきひょうげんでおきかえですか? list のなかにすうじがあったらそれがおきかえされてしまいませんか?(ためしていませんが)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

watashino tousyonosouteideha mondainakattanodesuga hannyouseiwo kouryosurutodamedesune. arigatougozaimashita.

  • 回答No.10

しつもんしゃのあるごりずむをさんこうにしてかいてみる。こんなかんじ? function RepeatedCombination (ary, n) {  var len = ary.length;  var max = Math.pow (len, n);  var index = 0;  var i;  var j, J;  var result = [];  var zero = Array (n).join ('0');  var hash = {};  var str;  var chs;    if (36 < len)   throw new Error;    for (i = 0; i < len; i++)   hash[i.toString (len)] = ary[i];    for (i = 0; i < max; i++) {   chs = (zero + i.toString (len)).slice (-n).split ('');   for (j = 0, str = []; J = chs[j++]; )    str.push (hash[J]);   result.push (str.join (''));  }    return result; } var result = RepeatedCombination (['a', 'b', 'c'], 2); alert (result.join ('\n')); var result = RepeatedCombination (['a', 'b'], 3); alert (result.join ('\n'));

共感・感謝の気持ちを伝えよう!

質問者からのお礼

# var zero = Array (n).join ('0'); kore, omoshiroidesune. sankouninarimashita. arigatougozaimashita.

質問者からの補足

watashigakakuto, konnnakanjidesu. function createCcombinations(list, len) { var max = Math.pow(list.length, len); var results = []; for (var i = 0; max > i; i++) { for (var tmp = i.toString(list.length); tmp.length < len; tmp = "0" + tmp); for (var j = 0; list.length > j; j++) tmp = tmp.replace(new RegExp(j, "g"), list[j]); results[i] = tmp; } return results; } alert (createCcombinations(['a', 'b'], 3)); alert (createCcombinations(['a', 'b', 'c'], 2));

  • 回答No.9

ていせいです。もうしわけない。 function RepeatedCombination (ary, n) {  var len = ary.length;  var count = 0;  var max = Math.pow (len, n);  var i, o, r;    for (; count < max; count += 1) {   r = [];   o = count;   for (i = 0; i < n; i++) {    r.push (ary[o % len]);    o = Math.floor (o / len);   }   yield r.reverse ().join ('');  } }

共感・感謝の気持ちを伝えよう!

質問者からのお礼

arigatougozaimashita.

  • 回答No.8

れんとうでもうしわけないね。 しょしん(No1)にかえって、ふぁいあーふぉっくすならば、yield がつかえるので、いちいち return もふようで、るーぷがすっきりになりました! <!DOCTYPE html> <title></title> <body> <script type="application/javascript; version=1.8"> function RepeatedCombination (ary, n) {  var len = ary.length;  var count = 0;  var max = Math.pow (len, n);  var m, o, r;    for (var count = 0; count < max; count += 1) {   r = [];   o = count;   m = o % len;   for (var i = 0; i < n; i++) {    m = o % len;    r.push (ary[m]);    o = Math.floor (o / len);   }   yield r.reverse ().join ('');  } } var result = []; var next = RepeatedCombination (['a', 'b', 'c'], 2); for (var i in next)  result.push (i); alert (result.join ('\n')); // 1ぎょうなら! alert ([i for (i in RepeatedCombination (['a', 'b'], 3))].join ('\n')); </script>

共感・感謝の気持ちを伝えよう!

質問者からのお礼

arigatougozaimashita.

  • 回答No.7

あっ!いわゆるくろーじゃーにすれば、かんそにかけますね function RepeatedCombination (ary, n) {  var len = ary.length;  var count = 0;  var max = Math.pow (len, n);    return function () {   var m;   var o = count;   var r = [];      for (var i = 0; i < n; i++) {    m = o % len;    r.push (ary[m]);    o = Math.floor (o / len);   }   count += 1;   return (max < count) ? null: r.reverse ().join ('');  }; } var next = RepeatedCombination (['a', 'b', 'c'], 2); for (var result = [], tmp; tmp = next (); result.push (tmp)); alert (result.join ('\n')); var next = RepeatedCombination (['a', 'b'], 3); for (var result = [], tmp; tmp = next (); result.push (tmp)); alert (result.join ('\n'));

共感・感謝の気持ちを伝えよう!

質問者からのお礼

sukoshikireini narimashitane. arigatougozaimashita.

  • 回答No.6

さらにやっぱりおきにめさなかったのか・・・ざんねん。 たしかにこれまでのこーどは、はいれつがおおきくて、れつすうがおおいと、すくりぷとがとちゅうでとめられてしまうときがありますね。 こんどは、そこをくふうしました。 くみあわせは、なんとおりかをけいさんでもとめることができます。 そのはんいでばんごうをしていすれば、ならびをけいさんできました! function RepeatedCombination (ary, n) {  var len = ary.length;  return function (count) {   var m;   var r = [];      for (var i = 0; i < n; i++) {    m = count % len;    r.push (ary[m]);    count = Math.floor (count / len);   }   return r.reverse ().join ('');  }; } var x = 2; var ary = ['a', 'b', 'c']; var len = ary.length; var max = Math.pow (len, x); var result = []; var getter = RepeatedCombination (ary, x); for (var i = 0; i < max; i++)  result.push (getter (i)); alert (result.join ('\n')); //-- var x = 3; var ary = ['a', 'b']; var len = ary.length; var max = Math.pow (len, x); var result = []; var getter = RepeatedCombination (ary, x); for (var i = 0; i < max; i++)  result.push (getter (i)); alert (result.join ('\n'));

共感・感謝の気持ちを伝えよう!

質問者からのお礼

Nshinsuuto toraerukangaekatadesune. watashiga shitsumonnno boutounikaita kangaekatato houkouseiga onajidesune. arigatougozaimashita.

  • 回答No.5

おきにめさなかったのか・・・ざんねん。 ほんのごくいちぶには、うける? <!DOCTYPE html> <title></title> <body> <script> function rcombination (ary, n) {  var s1 = [    'var r = []',    'var len = ary.length',   ];  var s2 = [];  var code;  var i, I;    while (n--) {   i = 'i' + n;   I = 'I' + n;   s1.push ('for (var ' + i + ' = 0, I'+ n + ' = len; ' + i + ' < ' + I + '; ' + i + '++)');   s2.push ('ary[' + i + ']');  }  code = '{' + s1.join ('\n') + ' r.push (' + s2.join ('+') + ');' + 'return r;}';  return (new Function ('ary', 'n', code))(ary, n); } alert(rcombination(['a', 'b'], 3).join("\n")); alert(rcombination(['a', 'b', 'c'], 2).join("\n")); </script>

共感・感謝の気持ちを伝えよう!

質問者からのお礼

rupuwofuyashiteiku rojikkuno hattenbandesukane. kangaekataga omoshiroidesune. arigatougozaimashita.

  • 回答No.4

なんとなく、おもいだしてきた。 <!DOCTYPE html> <title></title> <body> <script> function rcombination (a, n, m) {  var r = [];  var l = a.length;  var i;    if (1 < n)   for (i = 0; i < l; i++)    r = r.concat (rcombination (a, n -1, m.concat (a[i])));  else   for (i = 0; i < l; i++)    r.push (m.concat (a[i]));    return r; } alert(rcombination(['a', 'b', 'c'], 2, []).join("\n")); alert(rcombination(['a', 'b'], 3, []).join("\n")); //-- // もし、#Array.map がつかえないのなら if(!Array.prototype.map)Array.prototype.map=function(b,e){var c=this.length;if(typeof b!="function")throw new TypeError;for(var d=Array(c),a=0;a<c;a++)a in this&&(d[a]=b.call(e,this[a],a,this));return d}; alert(rcombination(['a', 'b', 'c'], 2, []).map (function (a) { return a.join(''); }).join("\n")); alert(rcombination(['a', 'b'], 3, []).map (function (a) { return a.join(''); }).join("\n")); </script>

共感・感謝の気持ちを伝えよう!

質問者からのお礼

iroirogoteijishite itadakimasitaga, koregaichiban wakariyasukattadesu. toiuka #3wo kaisekishinagara watashigakaitakodoga koretohoboonajininarimashita. (saikinanode else noatonorupuha iranaitoomoimasuga...) arigatougozaimashita.

関連するQ&A

  • index関数で複数個抜き出す

    $str="りんご・みかん・もも・りんご"; $len=index($str,"りんご"); こんな記述があったとして、 「$len」に「0」だけを返すのではなく文字列に含まれる全ての「りんご」の場所を配列に代入したいのですが、どうすればいいのでしょうか。 こんな感じです。 @len=(0,22); よろしくお願いします。

    • ベストアンサー
    • Perl
  • アルファベットn文字の組み合わせ一覧を生成するサブルーチン

    「アルファベットを格納した配列」と「文字列長」を引数として与えると、全ての組み合せの文字列を返してくれるサブルーチンを定義するにはどうすればよろしいでしょうか? 「文字列長」が2や3の場合には以下のようにforeach文を入れ子にしていますが、「文字列長」の変化に対応できるようなサブルーチンを定義したいと考えます。 @cc = qw(a b c d); # アルファベットを格納した配列 「文字列長」が2の場合、 foreach my $c1 (@cc){ foreach my $c2 (@cc){ push(@str, $c1.$c2); } } aa ab ac ad ba bb bc bd ca cb cc cd da db dc dd 「文字列長」が3の場合、 foreach my $c1 (@cc){ foreach my $c2 (@cc){ foreach my $c3 (@cc){ push(@str, $c1.$c2.$c3); } } } aaa aab aac aad aba abb abc abd aca acb acc acd ada adb adc add baa bab bac bad bba bbb bbc bbd bca bcb bcc bcd bda bdb bdc bdd caa cab cac cad cba cbb cbc cbd cca ccb ccc ccd cda cdb cdc cdd daa dab dac dad dba dbb dbc dbd dca dcb dcc dcd dda ddb ddc ddd アドバイスをよろしくお願いします。

    • ベストアンサー
    • Perl
  • 0,1の組み合わせを表示するプログラム

    Javaで以下のようなプログラムを作成したいです(できれば配列を使わずに)。 どうかご教授願いますm(_ _)m 何かしらの文字列を入力(Exit以外なら何でもいい) ↓ 0 1 と表示 ↓ 何かしらの文字列を入力 ↓ 00 01 10 11 と表示 ↓ 何かしらの文字列を入力 ↓ 000 001 010 011 100 101 110 111 と表示 ↓ (以下、Exitが入力されるまでループ・・・)

    • ベストアンサー
    • Java
  • 「○○通りのパターンがある」の計算のしかた

    よくこの組み合わせは全部で1万通りのパターンが存在するというようなことを聞きますが、 あれの方程式などはあるのでしょうか。 以下の例で説明をお願いします。 1. [a,b,c]の3つだけの文字列を作った時のパターン数 2. 英数字のみのパスワード4桁のパターン数 3. [a,b,c,d,e,f,g]の中から4文字をつかった文字列のパターン数。

  • この関数の意味?

    =MAX(INDEX(LEN($A1:$A10),)) これで、A1:A10内の各セルの最大文字列数がわかるようです。 MAX、INDEX、LENの各関数の意味は分かりますが、なぜこれで範囲内の最大文字列数がわかるのか不思議です。 どなたか、お馬鹿なわたくしめにもわかるようにご教示いただけませんでしょうか?

  • 文字列の組合わせについて

    仕事でこまっています。できるだけ早めに教えていただけると幸いです。 ABCDEFという文字列があるとします。この文字列の組合わせのパターン とそのパターンがいくつあるかしらべたいと思っています。 パターン化する際の条件としては ■重複する文字列のパターンは除く AABCDFとかABBDFDなどは除いてください ■文字数は1文字から6文字までです。 A、Bという組み合わせからABCDEFまでの中からの組合わせになります。 ■順番については、違っていても同一のものとする。 ABCでもBCAでも同じ組合わせということになります。 またこういう作業をする際にどうやって算出するのかも併せて教えて いただけると助かります。 以上よろしくお願いいたします。

  • 実行時エラー93 パターン文字列が不正です

    ifステートメントでlike演算子を使っていると、 ある文字列で「パターン文字列が不正です」というエラーになります。 意味が分からないのですが、like演算子で使えない文字列があるのでしょうか?

  • 条件付でのパターン抽出がわかりません

    以下のような条件でのパターンで作成される文字列を抽出したいと思い、 処理を考えるのですがわかりません。 ヒントでも結構ですので、ご教授願います。 条件1  ○={a,b,c,d}  △={e,f,g}  □={h,i} 条件2  ○2つ、△2つ、□1つを選択。   ex.)○○△□△, ○△□○△, ○△△□○, ... 条件3  ○から重複しない2文字、△から重複しない2文字、□からは重複しない1文字を選択。   ex.)○={a,b}△={e,g}□={h}... 上記条件により作成される5文字の全てのパターンを抽出したい場合、 どのように考えればよいでしょうか? (条件2の全パターン)*(条件3の全パターン)で抽出可能?? よろしくお願いします。

  • 関数での配列の扱いかたについて教えてください

    http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H17a2/pm10.html この問題の10行目の void make_fare_table(int num, double *dist_list, COSTUNIT *cost_list, int **fare_table ) { の * dist_list ところなんですが、関数で配列を受け取るとき 文字列の場合は *dist_list ですが、 この問題の場合 dist_listは距離の配列、つまり数値の配列だから、dist_list[]で受け取るのだと思うのですが *dist_listとなっているのは、なぜでしょうか?

  • EXCEL 関数で複数の文字列を昇順に並び替える

    教えてください 複数のセルに入った文字列を 関数のみで並べ替えさせることは 可能でしょうか? 例えば aaa ygt baa gft bbe ↓ aaa baa bbe gft ygt と、なる感じです。 SMALLやラージ構文は 工夫なしでは並べ替えてくれないように思います 文字列を1文字毎に区切って 文字コード化した上で SMALL構文にかけてみたりもしましたが 文字順が崩れて駄目駄目でした VBAでもオリジナル機能でも どちらでも並べ替えれるのですが 今回は関数でする必要があり 困ってます 無理でしょうか? ご教示お待ちしています。