配列の要素間のすべての非順序ペア


11

仕事:

配列の要素間で可能なすべてのペアを含む配列を返します。

a=["a", "b", "c", "d"];帰りからb=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]]

可能な組み合わせがすべて含まれていて、明らか["b","d"]に同じである限り、ペアは任意の順序にできます["d","b"]

入力

クラスの文字で構成される一意の文字列要素の配列[a-z]

出力

入力配列の要素の可能なすべてのペアを含む2D配列。

テストケース

input=["a","b","c"];
//output=[["a","b"],["a","c"],["b","c"]]

input=["a","b","c","d","e"];
//output=[["a","b"],["a","c"],["a","d"],["a","e"],["b","c"],["b","d"],["b","e"],["c","d"],["c","e"],["d","e"]]

注:このチャレンジの重複は見つかりませんでした。ある場合は、質問をドロップするためのコメントで通知してください。


2
入力値が繰り返されたり、ソートされた順序になっていない場合に何が起こるかについては明確ではありません。いくつかのより一般的なテストケースが役立つでしょう。
-xnor

@Adám2つのリストを含む、だまされない。
ミスターXcoder

この問題は、要素とそれ自体のペアリングを除外し、さらに重複しないようにします。
電卓

@xnor haventは、値を繰り返すことを考えていませんでした。なぜなら、職場での私の最初の問題は、個人の固有のセットに関係していたからです。一意性を条件として追加する必要があると思いますか?
alexandros84

@ alexandros84一意性は問題ありません。何を["c","b","a"]返す必要がありますか?
xnor

回答:



8

Haskell、29バイト

f(a:b)=map((,)a)b++f b
f _=[]

オンラインでお試しください!使用例:f ["a","b","c"]yields [("a","b"),("a","c"),("b","c")]


フラグを使用すると、-XTupleSectionsこれは27バイトに短縮できますが、フラグをカウントする必要があります。

f(a:b)=map(a,)b++f b
f _=[]

オンラインでお試しください!


beケースをに変更することで1バイトを節約できると思いますf l=l
クリツェフィッツ

@Kritzefitz 2つの空のリストの型が異なるため、これが機能しないのではないかと心配しています。したがって、Haskellの型チェッカーは文句を言います。
ライコニ

いい視点ね。私はそれを考えていませんでした。
クリッツフィッツ




5

vim、50 48

AX<esc>qqYplX@qq@qqrYpllDkxh@rq:g/./norm@r<cr>:g/X/d<cr>dG

フォームに入力を取ります

abcd

そして出力

ad
ac
ab
bd
bc
cd

説明

最初に、2つの長さの入力を処理するために入力にAX<esc>an Xを追加します。これは、すぐに明らかになる理由のために必要です。

次に、形式の最初の再帰マクロがありqq...@qq@qます。(マクロを記録qし、最後に再度実行し、記録を終了してから、1回実行します。)マクロの本文でYp、現在の行を複製しl、行が1文字になった場合にマクロを中断しX、行の最初の文字。これは、生産の最終結果を持っています

abcdX
abcX
abX
aX
X
X

Xsを今のところ無視して、私たちがしなければならないのはabcdX、例えばに変えるだけab / ac / ad / aXです。これは、2番目の再帰マクロで実現されqr...@rqます。

このマクロでは、最初に行(Yp)を複製し、次に右の2つ(ll)に移動して行末まで削除することにより()、最初の2文字を除くすべてを削除しDます。カーソルは行kxの2番目の文字にあるため、前の行の2番目の文字が削除されます。これは、行の最初の文字とペアになった文字です。このプロセスはh、マクロの再帰的な性質により、行の先頭()から必要な回数だけ繰り返されます。

それは今で達成することができるすべての行、上のマクロを実行するだけです:g/./norm@r(この振る舞いは異なるよりは確かなぜ私はありません:%norm@rが、十分では言うことを意図したように、後者は動作しません。)で行Xを削除され:g/X/drマクロの構築の結果として左端の空白行はでクリーンアップされdGます。


素晴らしい答え。私はそれを通過するのに時間がかかります。
alexandros84






3

オクターブ49 48バイト

@(x)[imag(y=(y=triu(x+j*x',1))(~~y)) real(y) '']

組み込み(nchoosek)を回避する匿名関数。

オンラインでお試しください!

説明

x+j*x'ブロードキャストを使用して、実数部と虚数部がすべて入力からのコードポイントのペアである複素数の行列を作成しますx

y=triu(...,1)対角線を除く上三角部分を保持し、残りの要素をゼロにします。結果はvariableに割り当てられますy

y=(...)(~~y)variableに割り当てられる列ベクトルの形式で非ゼロ要素を保持しますy

imag(...)real(...)実部と虚部を抽出します。

[... ... ''] charに変換して出力を作成します。


いいね!チャレンジ全体が本当に興味深いです。私のes5コード(以下に掲載)を思いつくのに約1時間半かかりました。私はそれが非常に多くの興味深い答えを生成したことを嬉しく思います
。– alexandros84







1

JavaScript ES6、52バイト

a=>a.map((x,i)=>a.slice(0,i).map(y=>[x,y])).slice(1)

のようなものがあればflatMap、多くのバイトを節約できます。


ちょっといい答え!あなたが望むなら、あなたの研究中に私のes5の答えをチェックしてください。フィードバックをいただければ幸いです(ポジティブ/建設的な笑)
alexandros84

1
Firefox 30の配列内包表記は、フラットマップをシミュレートできa=>[for(x of[...a])for(y of(a.shift(),a))[x,y]]ます。
ニール

@Neil、そこには本当に高度な構文がいくつかあります...私はあなたの表現を理解し始めるために、少なくとも3つのことをグーグルする必要があります。つまり、スプレッド演算子、配列内包表記とは何か、そして最終的には[x、y]とは何ですか(それに対する答えはまだ見つかっていません)。
alexandros84

1
@ alexandros84 [x,y]最後は簡単なビットで、単なる配列リテラルです。
ニール

1
また、スプレッド演算子は配列をコピーするためだけにあります。ループ内で配列を変更しているからです。
ニール

1

Python、55バイト

f=lambda s:[(s[0],j)for j in s[1:]]+f(s[1:])if s else[]

オンラインでお試しください!

他のPythonの回答よりも長いですが、異なる手法を使用しているため、投稿する価値があると思います。


チェックする時間がないので、私は私が支持した本当に異なるテクニックの原因であることを願っています。
alexandros84

これは@ovsのPython 3の答えと非常によく似たアプローチだと思います。
ニール




1

Clojure、42バイト

#(set(for[i % j(remove #{i}%)](set[i j])))

セットのセットを返します:)


1

Python、74バイト

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]

1
PPCGへようこそ!これをゴルフすることができます:1)2-char変数名を1-charに置き換えます2)不要な空白を削除します3)これはスニペットです。ラムダ、関数、または完全なプログラムにする必要があります
Erik the Outgolfer

:10のバイトオフゴルフ64バイト
氏Xcoder

1

Javascript(ES 5)、108〜78バイト

今日は答えを投稿しますが、明らかに自分の答えを受け入れないことを約束します。

x=input;
a=[];

for(n=0;n<(x.length-1);n++){for(i=n+1;i<(x.length);i++){a.push([x[n],x[i]]);}}

1
PPCGへようこそ。不要な空白の削除を含む、提出物のゴルフが予定されています
HyperNeutrino

タイ 私はこれも疑問に思っていました:x = inputを含めるべきでした。a = []; 私の答えかどうか?明日編集します。
alexandros84

関数を送信するか、完全なプログラムを実行できます。を使用しているためa、定義する必要がありますが、の関数を作成できますx
ハイパーニュートリノ

@HyperNeutrinoの方がずっと良いです。
alexandros84

1
スペースを節約するために、セミコロンと空の行を除外できると思います。私はまた、あなたが変更することができると思うfor(i=n+1;i<(x.length);i++)for(i=n;++i<x.length;)。同様に、変更n<(x.length-1);n++することができますn++<x.length-1
musicman523

0

J、17バイト

({~$#:I.@,)#\</#\

オンラインでお試しください!

説明

({~$#:I.@,)#\</#\  Input: string S
               #\  Get the length of each prefix of S
           #\      Get the length of each prefix of S again
             </    Test using greater than (<) between each
         ,         Flatten
      I.@          Find the indices where the value is 1
   $               Shape of that table
    #:             Convert the indices to the base represented by the shape
 {~                Index into S at those values
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.