Tutte le coppie non ordinate tra gli elementi di un array


11

Compito:

Restituisce un array con tutte le possibili coppie tra gli elementi di un array.

Esempio

Dal a=["a", "b", "c", "d"];ritorno b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]].

Le coppie possono essere in qualsiasi ordine, purché siano incluse tutte le combinazioni possibili ed ["b","d"]è ovviamente la stessa ["d","b"].

Ingresso

Matrice di elementi stringa unici composti da caratteri della classe [a-z].

Produzione

2d array contenente tutte le possibili coppie di elementi dell'array di input.

Casi test

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

Nota: non sono riuscito a trovare un duplicato di questa sfida. Se ce n'è uno, avvisami con un commento per eliminare la domanda.


2
Non sono chiaro cosa succede quando i valori di input si ripetono o non sono in ordine. Alcuni casi di test più generali potrebbero essere utili.
xnor

@ Adám Non un duplicato, che implica avere 2 elenchi.
Mr. Xcoder,

Questo problema esclude l'associazione di un elemento con se stesso, quindi ancora più non duplicata.
Calcolatrice

@xnor havent ha pensato di ripetere i valori perché il mio problema originale sul lavoro riguardava un insieme unico di individui. Immagino che dovrei aggiungere l'unicità come condizione?
alexandros84,

@ alexandros84 L'unicità andrebbe bene. Cosa dovrebbe ["c","b","a"]tornare?
xnor

Risposte:



8

Haskell , 29 byte

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

Provalo online! Esempio di utilizzo: f ["a","b","c"]rese [("a","b"),("a","c"),("b","c")].


Con il flag -XTupleSectionsquesto può essere ridotto a 27 byte, tuttavia il flag dovrebbe essere contato:

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

Provalo online!


Penso che puoi salvare un byte modificando il caso be in f l=l.
Kritzefitz,

@Kritzefitz Temo che non funzionerà perché le due liste vuote hanno un tipo diverso, quindi il controllo del tipo di Haskell si lamenterà.
Laikoni,

Buon punto. Non ci ho pensato.
Kritzefitz,


6

Haskell, 25 byte

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

Provalo online!

Outer ( x) e inner ( y) passano attraverso l'elenco di input e mantengono la coppia (x,y)solo se x < y.


5

05AB1E , 3 byte

Codice:

æ2ù

Utilizza la codifica 05AB1E . Provalo online!

Spiegazione:

æ      # Powerset of the input
 2ù    # Keep the items of length two

5

vim, 50 48

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

Accetta input nel modulo

abcd

e produce come

ad
ac
ab
bd
bc
cd

Spiegazione

Innanzitutto, AX<esc>accoda un Xinput al fine di gestire un input di 2 lunghezze, che è necessario per ragioni che diventeranno chiare a breve.

Poi arriva la prima macro ricorsiva, del modulo qq...@qq@q. (Registra macro q, esegui nuovamente se stesso alla fine, termina la registrazione, quindi esegui una sola volta.) Nel corpo della macro, Ypduplica la riga corrente, linterrompe la macro se la riga è ora lunga un carattere ed Xelimina il primo personaggio della linea. Questo ha il risultato finale della produzione

abcdX
abcX
abX
aX
X
X

Ignorando la Xs per ora, tutto ciò che dobbiamo fare è trasformarci abcdX, per esempio, in ab / ac / ad / aX. Questo risultato è ottenuto con la seconda macro ricorsiva, qr...@rq.

In questa macro, dupliciamo prima la riga ( Yp), quindi eliminiamo tutto tranne i primi due caratteri spostando a destra due ( ll) ed eliminando alla fine della riga ( D). Poiché il cursore si trova ora sul secondo carattere della riga, kxeliminerà il secondo carattere dalla riga precedente, che risulta essere quello appena associato al primo carattere della riga. Questo processo viene quindi ripetuto ricominciando dall'inizio della riga ( h) tutte le volte necessarie a causa della natura ricorsiva della macro.

Ora è solo una questione di eseguire la macro su ogni riga, che può essere raggiunta con :g/./norm@r(non sono sicuro del perché questo si comporti in modo diverso rispetto a :%norm@r, ma basti dire che quest'ultimo non funziona come previsto.) Le righe con Xvengono eliminate con :g/X/d, e le righe vuote all'estremità sinistra a seguito della costruzione della rmacro vengono ripulite dG.


Bella risposta. Ci vorrà del tempo per farlo.
alexandros84,



4

Brachylog , 5 byte

{⊇Ċ}ᶠ

Provalo online!

Come funziona

{⊇Ċ}ᶠ
    ᶠ   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


3

Python, 53 byte

2 byte salvati grazie a @CalculatorFeline

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

Provalo online!


1
a[i+1:]può esserea[:i]
CalculatorFeline

Avere un nome utente lungo semplifica i brevi commenti semplicemente citando l'utente di cui sopra.
Calcolatrice

3

Ottava , 49 48 byte

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

Funzione anonima che evita il built-in ( nchoosek).

Provalo online!

Spiegazione

x+j*x'usa la trasmissione per costruire una matrice di numeri complessi in cui le parti reali e immaginarie sono tutte coppie di punti di codice dall'input x.

y=triu(...,1)mantiene la parte triangolare superiore escludendo la diagonale, rendendo zero il resto degli elementi. Il risultato è assegnato alla variabile y.

y=(...)(~~y)mantiene gli elementi diversi da zero sotto forma di un vettore di colonna, che è assegnato alla variabile y.

imag(...)ed real(...)estrarre le parti reali e immaginarie.

[... ... ''] converte nuovamente in char per creare l'output.


Bello! L'intera sfida è davvero interessante. Mi ci è voluto circa un'ora e mezza per trovare il mio codice es5 (descritto di seguito). Sono felice che abbia generato così tante risposte interessanti ..
alexandros84



2

Perl 6 , 17 byte

*.combinations(2)

Accidenti, questo è un lungo nome di metodo.





1

JavaScript ES6, 52 byte

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

Se ce ne fosse uno flatMapche risparmierebbe molti byte.


Ehi bella risposta! controlla la mia risposta es5 mentre studio la tua se vuoi. qualsiasi feedback sarà apprezzato (positivo / costruttivo haha)
alexandros84

1
La comprensione dell'array di Firefox 30 può simulare una mappa piatta, ad es a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
Neil,

@Neil, qualche sintassi davvero avanzata lì ... Dovrei cercare su Google almeno tre cose per iniziare a capire la tua espressione. Vale a dire l'operatore di diffusione, cos'è la comprensione di array e qual è la [x, y] alla fine (non ha ancora trovato risposta a ciò).
alexandros84,

1
@ alexandros84 Alla [x,y]fine è un po 'semplice, è solo un array letterale.
Neil,

1
Inoltre l'operatore spread è lì solo per copiare l'array, poiché lo sto mutando all'interno del loop.
Neil,

1

Python , 55 byte

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

Provalo online!

Più a lungo delle altre risposte di Python, ma utilizza una tecnica diversa, quindi penso che valga la pena pubblicare.


Non ho tempo di controllare, spero che sia una tecnica molto diversa perché ho votato.
alexandros84,

Penso che questo sia un approccio molto simile alla risposta di Python 3 di @ ovs.
Neil,


1

Python, 64 byte

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


1

Clojure, 42 byte

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

Restituisce un set di set :)


1

Python, 74 byte

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

1
Benvenuti in PPCG! Puoi giocare a golf: 1) sostituisci i nomi delle variabili a 2 caratteri con 1 carattere 2) rimuovi gli spazi bianchi non necessari 3) questo è uno snippet, devi trasformarlo in una lambda, funzione o programma completo
Erik the Outgolfer

Giocare a golf con 10 byte: 64 byte
Mr. Xcoder il

1

Javascript (ES 5), da 108 a 78 byte

Pubblica la mia risposta oggi, ma ovviamente prometto di non accettare la mia risposta:

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
Benvenuti in PPCG; ci aspettiamo che gli invii vengano golfati, inclusa la rimozione di spazi bianchi non necessari
HyperNeutrino,

Ty. Mi chiedevo anche questo: avrei dovuto includere l'input x =; a = []; nella mia risposta o no? Modificherò domani.
alexandros84,

Puoi semplicemente inviare una funzione o fare un programma completo. Dato che lo usi a, devi definirlo, ma puoi farne una funzione x.
HyperNeutrino,

molto meglio ora @HyperNeutrino.
alexandros84,

1
Penso che puoi escludere alcuni punti e virgola e la riga vuota per risparmiare spazio. Penso anche che puoi passare for(i=n+1;i<(x.length);i++)a for(i=n;++i<x.length;). Allo stesso modo, puoi cambiare n<(x.length-1);n++inn++<x.length-1
musicman523

0

J , 17 byte

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

Provalo online!

Spiegazione

({~$#: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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.