質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.38%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

467閲覧

順列と組合せを配列にして返す関数を短くしたい

babu_babu_baboo

総合スコア616

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2022/01/14 18:26

順列と組合せの関数を書いてみました。
1.さらに短くなるのかご指導願います。
2.組み合わせの関数で、combinatorics ([1,2,3,4,5,6],1) の時に、[1,2,3,4,5,6]の戻り値を返す方法が思いつきません。
何かよい方法はないでしょうか?

js

1//順列を配列にして返す 2const permutations=((f=(A,B=A.length,C=[])=>--B?A.reduce((a,b,c,[...d],_=d.splice(c,1))=>[...a,...f(d,B,[...C,b])],[]):A.map(a=>[...C,a]))=>f)(); 3 4/* 5function combinatorics (a, n = a.length, rst = []) { 6 return 1 === n 7 ? a 8 : a.reduce ((r,b,i)=> 9 r.concat(combinatorics (a.slice (i+1), n-1).map (c=> [b].concat(c))) 10 , rst); 11} 12*/ 13//組み合わせを配列にして返す 14const combinatorics=((f=(a,n=2,r=[])=>--n?a.reduce((r,b,i)=>r.concat(f(a.slice(i+1),n).map(c=>[b].concat(c))),r):a)=>f)(); 15 16console.log (combinatorics ([1,2,3,4,5,6], 2)); 17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2022/01/15 07:28

ユニークな数値の入った配列からn個の数値の組み合わせを順列で取り出すのでしょうか? [1,2,2]のようなものはNG、[2,1]のような取り出しはNG > combinatorics ([1,2,3,4,5,6],1) の時に、[1,2,3,4,5,6] 組み合わせなのですから戻り値は[[1],[2],[3],[4],[5],[6]]が正しいのでは?
babu_babu_baboo

2022/01/15 08:04

[1,2,2]はNGです。 [[1],[2],[3],[4],[5],[6]] たしかにこれが正しいですね。 ゆっくりと考えます。
guest

回答1

0

自己解決

自己解決にしました。

組合せを配列で返す関数

js

1function combinatorics (ary, depth = 1, rst = []) { 2 if (depth) { 3 for (let i = 0, I = ary.length; i < I; i++) { 4 let 5 a = ary[i], 6 c = combinatorics (ary.slice (i + 1), depth - 1); 7 if (c) { 8 for (j of c) { 9 rst.push ([a].concat(j)); 10 } 11 } else { 12 rst = rst.concat ([[a]]); 13 } 14 } 15 } 16 else { 17 rst = null; 18 } 19 return rst; 20} 21

短く

js

1const combinatorics =((f=(a,c=1,r=[])=>c?a.reduce((r,d,e,_,g=f(a.slice(e+1),c-1))=>r.concat(g?g.map(z=>[d].concat(z)):[[d]]),r):0)=>f)(); 2 3console.log (combinatorics ([1,2,3,4,5,6], 1)); 4console.log (combinatorics ([1,2,3,4,5,6], 2)); 5console.log (combinatorics ([1,2,3,4,5,6], 3)); 6

投稿2022/01/17 09:51

babu_babu_baboo

総合スコア616

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.38%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問