Wszystkie nieuporządkowane pary między elementami tablicy

11

Zadanie:

Zwraca tablicę ze wszystkimi możliwymi parami między elementami tablicy.

Przykład

Od a=["a", "b", "c", "d"];powrotu b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]].

Pary mogą być w dowolnej kolejności, o ile wszystkie możliwe kombinacje są uwzględnione i oczywiście ["b","d"]są takie same ["d","b"].

Wejście

Tablica unikatowych elementów łańcuchowych złożonych z znaków z klasy [a-z].

Wynik

Tablica 2d zawierająca wszystkie możliwe pary elementów tablicy wejściowej.

Przypadki testowe

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

Uwaga: nie mogłem znaleźć duplikatu tego wyzwania. Jeśli istnieje, powiadom mnie komentarzem, aby zostawić pytanie.

alexandros84
źródło
2
Nie jestem pewien, co się dzieje, gdy wartości wejściowe powtarzają się lub nie są posortowane. Pomogłyby w tym bardziej ogólne przypadki testowe.
xnor
@ Adám Nie dupe, który wymaga posiadania 2 list.
Pan Xcoder,
Ten problem wyklucza parowanie elementu z samym sobą, nawet bardziej nieduplikowanym.
CalculatorFeline,
@xnor nie myślałem o powtarzaniu wartości, ponieważ mój pierwotny problem w pracy dotyczył unikalnego zestawu osób. Chyba powinienem dodać wyjątkowość jako warunek?
alexandros84
@ alexandros84 Wyjątkowość byłaby w porządku. Co powinieneś ["c","b","a"]zwrócić?
xnor

Odpowiedzi:

5

Galaretka , 2 bajty

Œc

Wypróbuj online!

HyperNeutrino
źródło
Ty ninja'd mnie - ładny wydruk wyjściowy za pomocą czegoś takiego jak ÇK€Yw stopce.
Jonathan Allan
@JonathanAllan Och, dzięki!
HyperNeutrino
8

Haskell , 29 bajtów

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

Wypróbuj online! Przykładowe użycie: f ["a","b","c"]daje [("a","b"),("a","c"),("b","c")].


Za pomocą flagi -XTupleSectionsmożna to skrócić do 27 bajtów, jednak flaga musi zostać policzona:

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

Wypróbuj online!

Laikoni
źródło
Myślę, że możesz zaoszczędzić jeden bajt, zmieniając opcję be na f l=l.
Kritzefitz,
@ Kritzefitz Obawiam się, że to nie zadziała, ponieważ dwie puste listy mają inny typ, więc moduł sprawdzania typów Haskella będzie narzekał.
Laikoni
Słuszna uwaga. Nie myślałem o tym.
Kritzefitz,
6

Mathematica, 14 bajtów

#~Subsets~{2}&

Wejście

[{„a”, „b”, „c”}]

J42161217
źródło
Zamierzałem to zrobić :(
CalculatorFeline
6

Haskell, 25 bajtów

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

Wypróbuj online!

Pętla zewnętrzna ( x) i wewnętrzna ( y) przechodzą przez listę wejść i zachowują parę (x,y)tylko wtedy, gdy x < y.

nimi
źródło
5

05AB1E , 3 bajty

Kod:

æ2ù

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie:

æ      # Powerset of the input
 2ù    # Keep the items of length two
Adnan
źródło
5

vim, 50 48

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

Pobiera dane wejściowe w formularzu

abcd

i wyniki jako

ad
ac
ab
bd
bc
cd

Wyjaśnienie

Najpierw AX<esc>dołącza Xdo danych wejściowych, aby obsłużyć dane wejściowe o 2 długościach, co jest konieczne z powodów, które wkrótce staną się jasne.

Potem pojawia się pierwsze makro rekurencyjne formy qq...@qq@q. (Nagraj makro q, uruchom ponownie na końcu, zakończ nagrywanie, a następnie uruchom się raz.) W treści makra Ypduplikuje bieżącą linię, lwyłamuje się z makra, jeśli linia ma teraz jeden znak, i Xusuwa pierwszy znak w linii. To ma końcowy wynik produkcji

abcdX
abcX
abX
aX
X
X

Ignorując na razie Xs, wszystko, co musimy zrobić, to zmienić abcdXna przykład w ab / ac / ad / aX. Osiąga się to dzięki drugiemu makro rekurencyjnemu,qr...@rq .

W tym makrze najpierw kopiujemy wiersz ( Yp), a następnie usuwamy wszystko oprócz pierwszych dwóch znaków, przesuwając w prawo dwa ( ll) i usuwając do końca wiersza ( D). Ponieważ kursor znajduje się teraz na kxdrugim znaku linii, usunie drugi znak z poprzedniej linii, który jest akurat tym, który został właśnie sparowany z pierwszym znakiem w linii. Proces ten jest następnie powtarzany, zaczynając od początku wiersza ( h) tyle razy, ile jest to konieczne ze względu na rekurencyjny charakter makra.

Teraz wystarczy uruchomić makro w każdej linii, co można osiągnąć za pomocą :g/./norm@r(nie jestem pewien, dlaczego zachowuje się inaczej niż :%norm@r, ale wystarczy powiedzieć, że ten ostatni nie działa zgodnie z przeznaczeniem). Linie za pomocą Xsą usuwane za pomocą :g/X/d, a puste linie na końcu po lewej w wyniku budowy rmakra są czyszczone za pomocą dG.

Klamka
źródło
Świetna odpowiedź. Zajmie mi to trochę czasu.
alexandros84
4

Python 3 , 44 bajty

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

Wypróbuj online!

Pobiera dane wejściowe jako indywidualne parametry funkcji.

ovs
źródło
4

Brachylog , 5 bajtów

{⊇Ċ}ᶠ

Wypróbuj online!

Jak to działa

{⊇Ċ}ᶠ
    ᶠ   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
Leaky Nun
źródło
3

R , 18 bajtów

combn(scan(,''),2)

czyta listę ze standardowego wejścia, zwraca macierz, w której kolumny są parami.

Wypróbuj online!

Giuseppe
źródło
3

Python, 53 bajty

2 bajty zapisane dzięki @CalculatorFeline

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

Wypróbuj online!

Uriel
źródło
1
a[i+1:]może byća[:i]
CalculatorFeline
Posiadanie długiej nazwy użytkownika ułatwia krótkie komentarze, po prostu wspominając o wyżej wspomnianym użytkowniku.
CalculatorFeline,
3

Oktawa , 49 48 bajtów

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

Anonimowa funkcja pozwalająca uniknąć wbudowanej funkcji ( nchoosek).

Wypróbuj online!

Wyjaśnienie

x+j*x' wykorzystuje rozgłaszanie do zbudowania macierzy liczb zespolonych, w których rzeczywiste i urojone części są parami punktów kodowych z danych wejściowych x .

y=triu(...,1)utrzymuje górną trójkątną część z wyłączeniem przekątnej, dzięki czemu pozostałe elementy są zerowe. Wynik jest przypisany do zmiennej y.

y=(...)(~~y)zachowuje niezerowe elementy w postaci wektora kolumny, który jest przypisany do zmiennej y.

imag(...)i real(...)wydobyć prawdziwe i urojone części.

[... ... ''] konwertuje z powrotem na char, aby zbudować wynik.

Luis Mendo
źródło
Ładny! Całe wyzwanie jest naprawdę interesujące. Zajęło mi około półtorej godziny wymyślenie mojego kodu es5 (opisanego poniżej). Cieszę się, że wygenerowało tak wiele interesujących odpowiedzi ..
alexandros84
2

Python ≥ 2,7, 55 bajtów

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

repl.it!

Pan Xcoder
źródło
2

Perl 6 , 17 bajtów

*.combinations(2)

Uff, to długa nazwa metody.

Sean
źródło
2

Scala, 17 bajtów

_.combinations(2)
musicman523
źródło
2

Pyth , 7 4 bajty

-3 bajty dzięki Dziurawej Zakonnicy !

.cQ2

Wypróbuj online!

notjagan
źródło
1
.cQ2?
Leaky Nun
@LeakyNun Mógłbym przysiąc, że istniała funkcja, która dokładnie spełniała wymagania tego wyzwania, ale widziałam tylko .Cprzeglądając listę. Dobry chwyt!
notjagan
2

Rubin , 38 34 24 bajtów

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

Dzięki Wygląda na pomysł, który oszczędził 10 bajtów.

Wypróbuj online!

GB
źródło
1
->x{x.combination(2).to_a}zapisuje niektóre bajty :)
Seims
1

JavaScript ES6, 52 bajty

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

Gdyby tak było flatMap, zaoszczędziłoby to wiele bajtów.

Downgoat
źródło
Hej, miła odpowiedź! sprawdź moją odpowiedź es5 podczas gdy ja studiuję twoją, jeśli chcesz. wszelkie opinie będą mile widziane (pozytywne / konstruktywne haha)
alexandros84
1
Pojęcia tablicowe przeglądarki Firefox 30 mogą symulować płaską mapę, np a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
Neil,
@ Neil, tam naprawdę zaawansowana składnia ... Muszę znaleźć w Google co najmniej trzy rzeczy, żeby zacząć rozumieć twoje wyrażenie. Mianowicie operator rozprzestrzeniania, czym są wyrażenia tablicowe i czym jest [x, y] na końcu (wciąż nie znalazłem odpowiedzi na to pytanie).
alexandros84
1
@ alexandros84 Na [x,y]końcu jest łatwy kawałek, to po prostu literał tablicowy.
Neil
1
Również operator rozkładania służy tylko do kopiowania tablicy, ponieważ mutuję ją w pętli.
Neil
1

Python , 55 bajtów

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

Wypróbuj online!

Dłuższy niż inne odpowiedzi w Pythonie, ale używa innej techniki, więc myślę, że warto opublikować.

musicman523
źródło
Nie mam czasu na sprawdzenie, mam nadzieję, że jest to naprawdę inna technika, ponieważ jestem pozytywnie oceniany.
alexandros84
Myślę, że jest to bardzo podobne podejście do odpowiedzi @ ovs na Python 3.
Neil,
1

Python, 64 bajty

f=lambda a:sum((list(zip(a, a[i:]))for i in range(1,len(a))),[])
Joel Cornett
źródło
1

Oktawa, 38 bajtów

@(s)s([[x y]=find(s|s'),y](y<x,[2 1]))

Kolejna odpowiedź, aby uniknąć nchoosekwbudowanego.

Wypróbuj online!

rahnema1
źródło
1

Clojure, 42 bajty

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

Zwraca zestaw zestawów :)

NikoNyrh
źródło
1

Python, 74 bajty

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]
Oren
źródło
1
Witamy w PPCG! Możesz zagrać w golfa w ten sposób: 1) zamień nazwy zmiennych 2-znakowych na 1-char 2) usuń niepotrzebne białe znaki 3) to jest fragment kodu, musisz przekształcić go w lambda, funkcję lub pełny program
Erik the Outgolfer
Gra w golfa poza 10 bajtami: 64 bajty
Mr. Xcoder
1

JavaScript (ES 5), od 108 do 78 bajtów

Dzisiaj zamieszczam swoją odpowiedź, ale oczywiście obiecuję, że nie zaakceptuję własnej odpowiedzi:

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
źródło
1
Witamy w PPCG; spodziewamy się, że zgłoszenia zostaną zagrane w golfa, w tym usunięcie niepotrzebnych białych znaków
HyperNeutrino,
Ty. Zastanawiałem się także nad tym: czy powinienem był dołączyć x = wejście; a = []; w mojej odpowiedzi czy nie? Będę edytować jutro.
alexandros84
Możesz po prostu przesłać funkcję lub wykonać pełny program. Ponieważ używasz a, musisz to zdefiniować, ale możesz wykonać funkcję x.
HyperNeutrino,
o wiele lepiej teraz @HyperNeutrino.
alexandros84
1
Myślę, że możesz wykluczyć niektóre średniki i pustą linię, aby zaoszczędzić trochę miejsca. Myślę też można zmienić for(i=n+1;i<(x.length);i++)na for(i=n;++i<x.length;). Podobnie możesz zmienić n<(x.length-1);n++nan++<x.length-1
musicman523
0

J , 17 bajtów

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

Wypróbuj online!

Wyjaśnienie

({~$#: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
mile
źródło