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.


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:



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!


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




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.


Gute Antwort. Ich brauche Zeit, um es durchzugehen.
Alexandros84






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.


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

Perl 6 , 17 Bytes

*.combinations(2)

Puh, das ist ein langer Methodenname.





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.


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.


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))),[])


1

Clojure, 42 Bytes

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

Gibt eine Reihe von Mengen zurück :)


1

Python, 74 Bytes

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

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]]);}}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.