Alle nicht geordneten Paare zwischen den Elementen eines Arrays

11

Aufgabe:

Gibt ein Array mit allen möglichen Paaren zwischen den Elementen eines Arrays zurück.

Beispiel

Von der a=["a", "b", "c", "d"];Rückkehr b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]].

Paare können in beliebiger Reihenfolge sein, solange alle möglichen Kombinationen enthalten sind und natürlich ["b","d"]gleich sind ["d","b"].

Eingang

Array eindeutiger Zeichenfolgenelemente, die aus Zeichen der Klasse bestehen [a-z].

Ausgabe

2d-Array, das alle möglichen Paare von Elementen des Eingabearrays enthält.

Testfälle

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"]]

Hinweis: Ich konnte kein Duplikat für diese Herausforderung finden. Wenn es einen gibt, benachrichtige mich mit einem Kommentar, um die Frage fallen zu lassen.

alexandros84
quelle
2
Mir ist nicht klar, was passiert, wenn sich Eingabewerte wiederholen oder nicht in sortierter Reihenfolge sind. Einige allgemeinere Testfälle würden dort helfen.
xnor
@ Adám Kein Betrüger, das beinhaltet 2 Listen.
Herr Xcoder
Dieses Problem schließt das Koppeln eines Elements mit sich selbst aus, auch wenn es nicht doppelt vorhanden ist.
CalculatorFeline
@xnor hat nicht daran gedacht, Werte zu wiederholen, da mein ursprüngliches Problem bei der Arbeit mit einer einzigartigen Gruppe von Personen zu tun hatte. Ich denke, ich sollte Einzigartigkeit als Bedingung hinzufügen?
Alexandros84
@ alexandros84 Eindeutigkeit wäre in Ordnung. Was soll ["c","b","a"]zurückkehren?
xnor

Antworten:

5

Gelee , 2 Bytes

Œc

Probieren Sie es online aus!

HyperNeutrino
quelle
Du hast mich ninja'd - drucke die Ausgabe hübsch mit etwas wie ÇK€Yin der Fußzeile.
Jonathan Allan
@ JonathanAllan Oh, danke!
HyperNeutrino
8

Haskell , 29 Bytes

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

Probieren Sie es online aus! Anwendungsbeispiel: f ["a","b","c"]Ausbeuten [("a","b"),("a","c"),("b","c")].


Mit dem Flag -XTupleSectionskann dies auf 27 Bytes verkürzt werden, das Flag müsste jedoch gezählt werden:

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

Probieren Sie es online aus!

Laikoni
quelle
Ich denke, Sie können ein Byte speichern, indem Sie den be-Fall ändern f l=l.
Kritzefitz
@Kritzefitz Ich fürchte, das wird nicht funktionieren, da die beiden leeren Listen einen anderen Typ haben, also wird sich Haskells Typprüfer beschweren.
Laikoni
Guter Punkt. Daran habe ich nicht gedacht.
Kritzefitz
6

Mathematica, 14 Bytes

#~Subsets~{2}&

Eingang

[{"a", "b", "c"}]

J42161217
quelle
Ich wollte das tun :(
CalculatorFeline
6

Haskell, 25 Bytes

f l=[(x,y)|x<-l,y<-l,x<y]

Probieren Sie es online aus!

Outer ( x) und Inner ( y) durchlaufen die Eingabeliste und behalten das Paar (x,y)nur bei x < y.

Nimi
quelle
5

vim, 50 48

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

Nimmt Eingaben in das Formular vor

abcd

und Ausgänge als

ad
ac
ab
bd
bc
cd

Erläuterung

Erstens AX<esc>hängt eine Xmit dem Eingang , um 2längig Eingang zu handhaben , die aus Gründen notwendig ist , die klar in Kürze werden werden.

Dann kommt das erste rekursive Makro der Form qq...@qq@q. (Makro qaufzeichnen, am Ende erneut ausführen, die Aufzeichnung beenden und dann einmal selbst ausführen.) YpDupliziert im Hauptteil des Makros die aktuelle Zeile, lbricht aus dem Makro aus, wenn die Zeile jetzt ein Zeichen lang ist, und Xlöscht die erstes Zeichen in der Zeile. Dies hat das Endergebnis der Produktion

abcdX
abcX
abX
aX
X
X

Wenn Xwir das s vorerst ignorieren , müssen wir uns zum abcdXBeispiel nur in verwandeln ab / ac / ad / aX. Dies wird mit dem zweiten rekursiven Makro erreicht qr...@rq.

In diesem Makro duplizieren wir zuerst die Zeile ( Yp) und löschen dann alles außer den ersten beiden Zeichen, indem wir zwei ( ll) nach rechts bewegen und bis zum Ende der Zeile ( D) löschen . Da sich der Cursor jetzt auf dem zweiten Zeichen der Zeile befindet, kxwird das zweite Zeichen aus der vorherigen Zeile gelöscht, das zufällig mit dem ersten Zeichen in der Zeile gepaart wurde. Dieser Vorgang wird dann haufgrund der rekursiven Natur des Makros so oft wie nötig ab dem Anfang der Zeile ( ) wiederholt .

Es geht jetzt nur noch darum, das Makro in jeder Zeile auszuführen, was mit erreicht werden kann :g/./norm@r(Ich bin nicht sicher, warum sich dies anders verhält als :%norm@r, aber es reicht zu sagen, dass letzteres nicht wie beabsichtigt funktioniert.) Zeilen mit Xwerden gelöscht mit :g/X/d, und die Leerzeilen am Ende links als Ergebnis der Konstruktion des rMakros werden mit bereinigt dG.

Türknauf
quelle
Gute Antwort. Ich brauche Zeit, um es durchzugehen.
Alexandros84
4

Python 3 , 44 Bytes

f=lambda k,*s:[*s]and[[k,x]for x in s]+f(*s)

Probieren Sie es online aus!

Nimmt die Eingabe als einzelne Funktionsparameter auf.

ovs
quelle
4

Brachylog , 5 Bytes

{⊇Ċ}ᶠ

Probieren Sie es online aus!

Wie es funktioniert

{⊇Ċ}ᶠ
    ᶠ   find all the possible outputs of the following predicate
 ⊇          the output is an ordered subset of the input
  Ċ         the output is a list with two elements
Undichte Nonne
quelle
3

R , 18 Bytes

combn(scan(,''),2)

liest die Liste von stdin und gibt eine Matrix zurück, in der die Spalten Paare sind.

Probieren Sie es online aus!

Giuseppe
quelle
3

Python, 53 Bytes

2 Bytes dank @CalculatorFeline gespeichert

lambda a:[(x,y)for i,x in enumerate(a)for y in a[:i]]

Probieren Sie es online aus!

Uriel
quelle
1
a[i+1:]kann seina[:i]
CalculatorFeline
Ein langer Benutzername erleichtert kurze Kommentare, indem einfach der oben genannte Benutzer erwähnt wird.
CalculatorFeline
3

Oktave , 49 48 Bytes

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

Anonyme Funktion, die das eingebaute ( nchoosek) vermeidet .

Probieren Sie es online aus!

Erläuterung

x+j*x'verwendet Broadcasting, um eine Matrix komplexer Zahlen zu erstellen, bei der der Real- und der Imaginärteil alle Paare von Codepunkten aus der Eingabe sind x.

y=triu(...,1)Hält den oberen dreieckigen Teil ohne die Diagonale, sodass der Rest der Elemente Null ist. Das Ergebnis wird der Variablen zugeordnet y.

y=(...)(~~y)behält die Nicht-Null-Elemente in Form eines Spaltenvektors bei, der der Variablen zugewiesen ist y.

imag(...)und real(...)extrahieren Sie die Real- und Imaginärteile.

[... ... ''] konvertiert zurück in char, um die Ausgabe zu erstellen.

Luis Mendo
quelle
Nett! Die ganze Herausforderung ist wirklich interessant. Ich habe ungefähr anderthalb Stunden gebraucht, um meinen es5-Code zu finden (siehe unten). Ich bin froh, dass es so viele interessante Antworten generiert hat ..
alexandros84
2

Python ≥ 2,7, 55 Bytes

lambda l:list(combinations(l,2))
from itertools import*

repl.it!

Mr. Xcoder
quelle
2

Perl 6 , 17 Bytes

*.combinations(2)

Puh, das ist ein langer Methodenname.

Sean
quelle
2

Scala, 17 Bytes

_.combinations(2)
musicman523
quelle
2

Pyth , 7 4 Bytes

-3 Bytes dank Leaky Nun !

.cQ2

Probieren Sie es online aus!

notjagan
quelle
1
.cQ2?
Undichte Nonne
@LeakyNun Ich hätte schwören können, dass es eine Funktion gibt, die genau das tut, was diese Herausforderung benötigt, aber ich habe sie nur .Cbeim Durchsehen der Liste gesehen. Schöner Fang!
Notjagan
2

Ruby , 38 34 24 Bytes

->x{[*x.combination(2)]}

Danke Seims für die Idee, die 10 Bytes gespart hat.

Probieren Sie es online aus!

GB
quelle
1
->x{x.combination(2).to_a}spart einige Bytes :)
Seims
1

JavaScript ES6, 52 Bytes

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

Wenn es so etwas flatMapgäbe, würde das viele Bytes sparen.

Downgoat
quelle
Hey schöne Antwort! Schau dir meine es5-Antwort an, während ich deine studiere, wenn du willst. Jede Rückmeldung wird geschätzt (positiv / konstruktiv haha)
alexandros84
1
Das Array-Verständnis von Firefox 30 kann eine flache Karte simulieren, z a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
Neil
@Neil, einige wirklich fortgeschrittene Syntax dort ... Ich müsste mindestens drei Dinge googeln, um Ihren Ausdruck zu verstehen. Nämlich der Spread-Operator, was ist Array-Verständnis und was ist das [x, y] am Ende (noch keine Antwort darauf gefunden).
Alexandros84
1
@ alexandros84 Das [x,y]am Ende ist das einfache Bit, es ist nur ein Array-Literal.
Neil
1
Außerdem ist der Spread-Operator nur zum Kopieren des Arrays da, da ich es innerhalb der Schleife mutiere.
Neil
1

Python , 55 Bytes

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

Probieren Sie es online aus!

Länger als andere Python-Antworten, aber es verwendet eine andere Technik, daher denke ich, dass es sich lohnt, etwas zu posten.

musicman523
quelle
Ich habe keine Zeit zu überprüfen, ich hoffe, es ist wirklich eine andere Technik, weil ich positiv bewertet habe.
Alexandros84
Ich denke, dies ist ein sehr ähnlicher Ansatz wie die Python 3-Antwort von @ ovs.
Neil
1

Python, 64 Bytes

f=lambda a:sum((list(zip(a, a[i:]))for i in range(1,len(a))),[])
Joel Cornett
quelle
1

Clojure, 42 Bytes

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

Gibt eine Reihe von Mengen zurück :)

NikoNyrh
quelle
1

Python, 74 Bytes

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]
Oren
quelle
1
Willkommen bei PPCG! Sie können dies spielen: 1) Ersetzen Sie 2-Zeichen-Variablennamen durch 1-Zeichen 2) Entfernen Sie unnötige Leerzeichen 3) Dies ist ein Ausschnitt, Sie müssen es in ein Lambda, eine Funktion oder ein vollständiges Programm
verwandeln
Golfen aus 10 Bytes: 64 Bytes
Mr. Xcoder
1

Javascript (ES 5), von 108 bis 78 Bytes

Ich poste meine Antwort heute, aber ich verspreche offensichtlich, meine eigene Antwort nicht zu akzeptieren:

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]]);}}
alexandros84
quelle
1
Willkommen bei PPCG; Wir erwarten, dass Einsendungen gespielt werden, einschließlich des Entfernens unnötiger Leerzeichen
HyperNeutrino
Ty. Ich habe mich auch gefragt: hätte ich die Eingabe x = einfügen sollen; a = []; in meiner Antwort oder nicht? Ich werde morgen bearbeiten.
Alexandros84
Sie können entweder einfach eine Funktion einreichen oder ein vollständiges Programm ausführen. Da Sie verwenden a, müssen Sie es definieren, aber Sie können eine Funktion von machen x.
HyperNeutrino
viel besser jetzt @HyperNeutrino.
Alexandros84
1
Ich denke, Sie können einige Semikolons und die leere Zeile ausschließen, um Platz zu sparen. Ich denke auch , können Sie ändern , for(i=n+1;i<(x.length);i++)zu for(i=n;++i<x.length;). Ebenso können Sie n<(x.length-1);n++zun++<x.length-1
musicman523
0

J , 17 Bytes

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

Probieren Sie es online aus!

Erläuterung

({~$#: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
Meilen
quelle