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.


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:



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!


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

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.



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.


Świetna odpowiedź. Zajmie mi to trochę czasu.
alexandros84



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


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!


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.


Ł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

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!


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.


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ć.


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

Clojure, 42 bajty

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

Zwraca zestaw zestawów :)


1

Python, 74 bajty

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.