Znalezienie partnera

20

Wyzwanie

Biorąc pod uwagę dowolną listę 2-krotek i jednego elementu w jednym z tych krotek, wypisz „partnera”, tzn. Dane ai [(i,j),...,(a,b),...,(l,m)], wyjście b. Możesz założyć, że wszystkie krotki są unikalne i że wszystkie elementy w krotkach są łańcuchami. Dalej zakładamy, że nie masz obu (x,y)i (y,x).

Przypadki testowe

Input                                                           Output

[("(", ")"), ("{", "}"), ("[", "]")], "}"                       "{"
[("I'm", "So"), ("Meta", "Even"), ("This", "Acronym")], "Even"  "Meta"
[("I", "S"), ("M", "E"), ("T", "A")], "A"                       "T"
[("test", "cases"), ("are", "fun")], "test"                     "cases"
[("sad", "beep"), ("boop", "boop")], "boop"                     "boop"

Wygrywa najmniej bajtów!

Nate Stemen
źródło
Co również zrobić, jeśli dane wejściowe pojawią się kilka razy lub nie pojawią się
Luis Mendo
Nie sądzę, że możemy brać wkład jako płaską listę, prawda? Na przykład [a, b, c, d]zamiast [(a, b), (c, d)]. Ogoliłoby to tonę bajtów mojej odpowiedzi. : P
totalnie ludzki,
Zredagowałem, aby, mam nadzieję, wyczyścić niektóre rzeczy i dodałem przypadki testowe. Jeśli coś jest nie tak, możesz wycofać się.
całkowicie ludzki,
@ totalniehuman specjalnie zapytałem(a,a) i powiedziano mi, że to się nie stanie . Nate następnie nawet zredagował pytanie, aby sprecyzować ten fakt. Dodałeś jednak przypadek testowy z takim wpisem i zredagowałeś specyfikację odwracając tę ​​decyzję - dlaczego? Złamał wiele odpowiedzi.
Jonathan Allan
1
@ totalniehuman Uznałem, że oznacza to „zwróć wszystko, rozbij się, cokolwiek”, zwłaszcza, że ​​post został następnie zrewidowany, aby powiedzieć, że wszystko będzie wyjątkowe.
Jonathan Allan

Odpowiedzi:

8

Japt, 6 bajtów

Działa z ciągami lub liczbami całkowitymi.

æøV kV

Sprawdź to


Wyjaśnienie

Domniemane wprowadzanie tablicy Ui łańcucha / liczby całkowitej V.

æ

Pobierz pierwszy element (podtablicę) z Utego ...

øV

Zawiera V.

kV

Usuń Vi niejawnie zwróć wynikową tablicę jednoelementową.

Kudłaty
źródło
To ... dosłownie wypróbowałem ten dokładny scenariusz, ten sam wkład i wszystko. Musiałem coś przeoczyć ... EDYCJA: No tak, używałem fzamiast æw tym czasie. Duh: P
ETHproductions
@ETHproductions: Dokonuje miłej zmiany - zwykle to ja zapominam æi próbuję się z tym pogodzić f! : D
Shaggy
8

Haskell , 33 bajty

x!((a,b):c)|x==a=b|x==b=a|1<2=x!c

Wypróbuj online!

Definiuje operator binarny !, który jako lewy argument przyjmuje wartość xtypu τ, a jako prawy argument listę krotek (τ, τ). Wzór definicji pasuje do nagłówka (a,b)i ogona cpodanej listy; jeśli x==ato bzostanie zwrócone; jeśli x==bnastępnie azostanie zwrócone, a w przeciwnym razie będziemy przeglądać resztę listy przez rekurencję.

  'f' ! [('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', 'h')]
 'f' ! [('c', 'd'), ('e', 'f'), ('g', 'h')]
 'f' ! [('e', 'f'), ('g', 'h')]
 'e'

(Jeśli na liście nie ma „partnera”, nastąpi awaria, ponieważ nie zdefiniowaliśmy, co x![]powinno być.)

Lynn
źródło
5

JavaScript (ES6), 39 bajtów

e=>g=([[b,c],...a])=>e==b?c:e==c?b:g(a)

Traktuje wpis i tablicę tablic jako argumenty curry. Najlepsza nierekurencyjna wersja, jaką mogłem zrobić, to 44 bajty:

e=>a=>a.find(a=>a.includes(e)).find(b=>b!=e)
Neil
źródło
Oto 41-bajtowe nierekurencyjne rozwiązanie:a=>b=>a.map(e=>b=e[1-e.indexOf(b)]||b)&&b
Rick Hitchcock
Ty ... W końcu poddałeś się curry ?! : o
Shaggy
@Shaggy Zwykle nie przejmuję się typem curry (a,b)=>=> a=>b=>, ale wersja nierekurencyjna rozpoczęła się od wersji rekurencyjnej, która była curry, ponieważ mogłem zaoszczędzić 2 bajty na rekurencyjnym wywołaniu (samo curry faktycznie kosztuje bajt).
Neil
5

MATL , 4 14 5 6 bajtów

yY=P)u

Wypróbuj online!

Dane wejściowe to tablica jak [{a;b},{c;d}]. Liczba bajtów zmienia się silnie, podczas gdy OP zastanawia się, co jest faktycznie dozwolone.

y     % Implicitly input tuples T and 'lonely element' E, duplicate from below to get [T E T] on the stack
 Y=   % String comparison, element wise, between T and E. Yields a boolean array with a 1 at the correct location.
   P  % Flip this array vertically, to put the 1 at the 'partner' of E.
    ) % Select this partner from the bottom T.

Zacząłem od 4-bajtowej wersji, która mogła obsługiwać tylko ciągi jednoznakowe, co było jedynym testem w oryginalnym wyzwaniu. Kiedy okazało się to nieważne, stworzyłem bardzo długą 14-bajtową wersję, która była ładna i zhackowana (sprawdź historię wersji!), Kazała mi odkryć błąd, a następnie okazała się całkowicie niepotrzebna, ponieważ Y=z odpowiednim wejściem , działał tak samo dobrze, jak mój oryginalny 4-bajtowy y=P).

Sanchises
źródło
4

Python 2 , 37 bajtów

lambda x,y:dict(x+map(reversed,x))[y]

Wypróbuj online!

Proton , 31 bajtów

a,b=>dict(a+map(reversed,a))[b]

Wypróbuj online!

(Te dwie odpowiedzi są tak podobne, że zamieszczam je razem, aby uniknąć ponownej instalacji)

HyperNeutrino
źródło
Zmień nazwę reversedna reversew Proton na -1 bajt. \ s: P Mówiąc poważniej, czy reversejest o wiele lepsze imię, nie? : P
totalnie ludzki,
@totallyafloppydisk może / wzruszenie ramionami, ale nie zmieniłem nazwy większości wbudowanych Python, które zostały przeniesione do Proton
HyperNeutrino
@ Kanały Nie widzę, co jest nie tak?
HyperNeutrino
Przepraszam mój zły, zignoruj ​​ten komentarz.
Sanchises
2

Python 2 , 59 45 42 bajtów

-14 bajtów dzięki Emignie. -3 bajty dzięki Maltysen.

lambda l,v:sum(l,())[sum(l,()).index(v)^1]

Wypróbuj online!

Nadal chcę jednak używać curry. ; -;

całkowicie ludzki
źródło
1
45 bajtów
Emigna,
Aha, wiedziałem, że jest krótszy sposób y+[1,-1][y%2]. Po prostu nie sądziłem, że to trochę bitowe ... Dzięki!
całkowicie ludzki,
2

C ++, 179 bajtów

#include<vector>
#include<string>
#define S std::string
S f(std::vector<std::pair<S,S>>s,S t){for(auto&a:s){if(a.first==t)return a.second;if(a.second==t)return a.first;}return"";}

C ++ z typem mapy, 162 bajty

#include<map>
#include<string>
#define S std::string
S f(std::map<S,S>s,S t){for(auto&a:s){if(a.first==t)return a.second;if(a.second==t)return a.first;}return"";}

W MSVC kod kompiluje się, nawet jeśli ostatnia returninstrukcja ( return"";) zostanie pominięta. Sprawia, że ​​kod 9 bajtów jest lżejszy, ALE wychodzenie z końca funkcji (tj. Nie wychodzenie przez returninstrukcję w pętli) bez instrukcji return spowoduje niezdefiniowane zachowanie i nie będzie działać, jeśli tablica krotek nie zawiera elementu „klucz”

HatsuPointerKun
źródło
2

PowerShell, 36 bajtów

param($a,$c)$a|?{$c-in$_}|%{$_-ne$c}

znajduje element zawierający intput, a następnie pobiera element „inny”, wykluczając z niego dane wejściowe, PowerShell nie ma najbardziej niesamowitego zarządzania tablicą, ale może istnieć wbudowana funkcja, której nie jestem świadomy.

.\Partner.ps1 (("I'm","So"),("Meta","Even"),("This","Acronym")) "Even"
Meta
colsw
źródło
To podejście nie działa w ("boop", "boop")przypadku testowym.
AdmBorkBork
2

Röda , 30 bajtów

f a{[(_+"")[1-indexOf(a,_1)]]}

Wypróbuj online!

Wyjaśnienie:

f a{[(_+"")[1-indexOf(a,_1)]]}
f a{                         } /* Function f(a)                         */
                               /* For each pair _1 in the stream:       */
              indexOf(a,_1)    /*   Index of a in _1 or -1 if not found */
            1-                 /*   Subtract from 1 to get the index of
                                     the other value in the pair or 2 if
                                     a is not in the pair               */
     (_+"")                    /*   Append "" to _1                     */
           [               ]   /*   Get element the other element or "" */
    [                       ]  /*   Push it to the straem               */
                               /* All values in the stream are printed  */
fergusq
źródło
2

Mathematica 27 24 bajtów

Caseswybiera elementy listy pasujące do wzorca. W połączeniu ze strzałką elementy pasujące do wzorów można przekształcić.

Cases[{#,x_}|{x_,#}:>x]&

Stosowanie:

%[3][{{1, 2}, {3, 4}}]

Objaśnienie: W tym przykładzie po napotkaniu pierwszego argumentu 3, funkcja, Cases[{3,x_}|{x_,3}:>x]która jest formą operatora Cases, jest następnie stosowana do drugiego argumentu, {{1, 2}, {3, 4}}wybierając w ten sposób towarzysza 3, niezależnie od tego, czy znajduje się on w pozycji odciętej, czy rzędnej. W szczególności funkcja ta wyświetli listę wszystkich towarzyszy, jeśli w rzeczywistości pierwszy argument pojawia się więcej niż raz w drugim argumencie, innymi słowy, wykracza to nieco poza założenia zadanego pytania.

Glify otaczające muszą być nawiasami klamrowymi. Zapisano 3 bajty z sugestią „Currying” z @Notatree

Kelly Lowder
źródło
1
Jeśli masz wersję 10 i pobierasz dane przez curry , możesz zapisać 3 bajty:, Cases[{#,x_}|{x_,#}:>x]&używane jak%[3][{{1,2},{3,4}}]
Bez drzewa
Czy możesz to trochę wyjaśnić?
Nate Stemen,
2

R , 47 42 bajtów

function(v,a)a[(i=min(which(v==a)))+(i%%2*2-1)]

Wypróbuj online!

Działa na macierzy lub na prostym wektorze. v = wartość wyszukiwania, a = tablica krotek.

MickyT
źródło
@ Sanchises Dzięki, wszystko już naprawione.
MickyT,
2

Galaretka , 6 bajtów

ċÞṪ⁻ÞṪ

Dyadyczny link prowadzący do listy partnerów po lewej i utraconego partnera po prawej i zwracający partnera.

Wypróbuj online!

W jaki sposób?

ċÞṪ⁻ÞṪ - Link: list, partners; item, lost-partner
 Þ     - sort (the tuples) by:
ċ      -   count occurrence of lost-partner
  Ṫ    - tail (gets the tuple containing the lost-partner)
    Þ  - sort (that tuple's items) by:
   ⁻   -   not equals (non-vectorising version)
     Ṫ - tail (get the other one, or the rightmost one if they were equla)
Jonathan Allan
źródło
Jest to nieprawidłowe, ponieważ dodano nowe przypadki testowe.
Sanchises
1
Dziękuję za zwrócenie na to uwagi - skomentowałem to pytanie redaktorowi (specjalnie zapytałem o to OP (a,a)i powiedziano mi, że nie musimy sobie z tym poradzić). Jestem pewien, że mógłbym to naprawić, ale nie jestem pewien, czy specyfikacja jest zgodna z zamierzeniem.
Jonathan Allan
Hmm, chociaż patrząc na historię zmian wydaje się, że musimy wspierać ciągi znaków nie tylko postaci, więc i tak to nie zadziała ...
Jonathan Allan
Działa teraz z nową specyfikacją.
Jonathan Allan
Taka była też moja interpretacja komentarza „no cóż”, ale najwyraźniej tak nie było.
Sanchises,
1

Haskell , 65 62 bajtów

c#(a,b)|a==c=b|1>0=a
x%l=x#(snd(span(\(a,b)->a/=x&&b/=x)l)!!0)

Wypróbuj online!

Wyjaśnienie

Używa span, aby znaleźć pierwszą instancję, w której xznajduje się krotka. Następnie chwyta pierwszy element krotki, jeśli nie jest równy, a drugi w przeciwnym razie.

Haskell Lambdabot, 59 56 bajtów

c#Just(a,b)|a==c=b|1>0=a
x%l=x#find(\(a,b)->a==x||b==x)l

Wypróbuj online!

Wyjaśnienie

Korzysta z funkcji Data.Lists, firstaby zmniejszyć liczbę używanych bajtów (!!0).snd.span, ponieważ firstzwraca wartość, Maybektórą musimy dodać Justdo dopasowania wzorca w #.

Kreator pszenicy
źródło
2
Nie przemyśl tego ... x!((a,b):c)|x==a=b|x==b=a|1<2=x!cma 33 bajty.
Lynn,
1
@ Lynn Śmiało i opublikuj to. Czuję się trochę głupio, że o tym nie myślę, ale to naprawdę Twoja odpowiedź.
Wheat Wizard
Do przyjęcia, opublikowano ^^
Lynn,
1

05AB1E , 7 bajtów

.åÏ`¹K`
  Ï      # keep only pairs that contain the first input
   `     # flatten
    ¹K   # remove the first input
      `  # flatten

Wypróbuj online!

Alternatywne rozwiązanie 7-bajtowe

˜DIkX~è
˜        # deep flatten
 D       # duplicate
  Ik     # get the index of the second input in this list
    X^   # XOR with 1
      è  # get the element at this index

Wypróbuj online!

Emigna
źródło
˜D²k>èdla 6, chyba że istnieje konkretny powód XOR'ingu z 1?
Magic Octopus Urn
@MagicOctopusUrn: Powodem jest to, że parzyste indeksy powinny się zmniejszać, a nieparzyste - zwiększać.
Emigna
Z wyjątkiem odwrotności tego, co tam napisałem ...
Emigna
1

Common Lisp, 74 bajty

(lambda(a x)(or(cdr(assoc x a :test'equal))(car(rassoc x a :test'equal))))

Wypróbuj online!

Renzo
źródło
1

Java 8, 78 bajtów

Lambda (curry) od Stream<List<String>>do lambda od Stringdo String(chociaż zdarza się, że niejawne pisanie pozwala na to, aby działało to na dowolnych listach). W języku nie ma dedykowanych klas krotek i nie znam ich w standardowej bibliotece, więc pary wejściowe są reprezentowane jako listy. Można przypisać do Function<Stream<List<String>>, Function<String, String>>.

l->s->l.filter(p->p.contains(s)).map(p->p.get(1-p.indexOf(s))).findAny().get()

Wypróbuj online

Poświęcę oszczędność ostatnich 6 bajtów każdemu, kto może mnie przekonać, że zwrócenie an Optionaljest ważne. Nie byłem w stanie się przekonać.

Jedną z interesujących części tego rozwiązania było dla mnie określenie najtańszego sposobu uzyskania wyjścia ze strumienia. Rozważyłem reduce, findFirsti min/ max, ale żaden nie był krótszy niż intuicyjny findAny.

Jakob
źródło
1

Ruby, 31 bajtów

->a,e{e=*e;a.find{|p|p!=p-e}-e}

Zwraca tablicę singletonów.

m-chrzan
źródło
1

JavaScript (ES6), 45 bajtów

Przyszedł do mnie wczoraj, a potem zauważył, że Neil pobił mnie do lepszego rozwiązania JS; pomyślałem, że i tak mogę to opublikować.

Działa z ciągami i liczbami całkowitymi.

a=>n=>a.reduce((x,y)=>y[1-y.indexOf(n)]||x,0)
Kudłaty
źródło
1

C # (.NET Core) , 101 100 + 18 bajtów

dziękuję Grzegorzowi Puławskiemu za zmniejszenie kilku bajtów.

x=>y=>x.Where(z=>z.Item1==y).FirstOrDefault()?.Item2??x.Where(z=>z.Item2==y).FirstOrDefault()?.Item1

Wypróbuj online!

C # (.NET Core), 122 121 120 bajtów

x=>y=>{for(int i=0;i<x.Length;i++){if(x[i].Item1==y){return x[i].Item2;}if(x[i].Item2==y){return x[i].Item1;}}return"";}

Wypróbuj online!

Dennis.Verweij
źródło
x=>y=>jest krótszy niż (x,y)=>( Func<a, b, c>staje się Func<a, Func<b, c>>i f(a, b)staje się wywołanie funkcji f(a)(b)) - Świetna odpowiedź btw!
Grzegorz Puławski
Również dla pierwszej odpowiedzi sama funkcja nie używa niczego oprócz System.Linq, więc możesz dodać tylko 18 bajtów do odpowiedzi (w using System.Linq;porównaniu namespace System.Linq{})
Grzegorz Puławski
@ GrzegorzPuławski dziękuję za pomoc i komplement, mam nadzieję, że
poprawiłem
1

Łuska , 10 bajtów

→ḟo=⁰←S+m↔

Wypróbuj online!

Niegolfowane / Wyjaśnienie

            -- example input:                         4 [(1,2),(3,4)]
      S+    -- concatenate list with                -
        m↔  --   itself but all pairs flipped       -   [(1,2),(3,4),(2,1),(4,3)]
 ḟo         -- find first occurence where           -
   =⁰←      --   the left element is equal to input -   (4,3)
→           -- get the right element                -   3

Uwaga : powyższy przykład działa na liczbach całkowitych tylko ze względu na czytelność, sam typ nie ma znaczenia (o ile można go porównać).

ბიმო
źródło
1

Swift 4 , 43 bajty

{a,m in a.flatMap{$0==m ?$1:$1==m ?$0:nil}}

Dane wyjściowe to tablica, która jest albo pusta (nie znaleziono partnera), albo ma pojedynczy element (partner).

Przypadki testowe:

let testcases: [(pairs: [(String, String)], match: String, expected: String)] = [
    (
        pairs: [("(", ")"), ("{", "}"), ("[", "]")],
        match: "}", expected: "{"
    ),
    (
        pairs: [("I'm", "So"), ("Meta", "Even"), ("This", "Acronym")],
        match: "Even", expected: "Meta"
    ),
    (
        pairs: [("I", "S"), ("M", "E"), ("T", "A")],
        match: "A", expected: "T"
    ),
    (
        pairs: [("test", "cases"), ("are", "fun")],
        match: "test", expected: "cases"
    ),
    (
        pairs: [("sad", "beep"), ("boop", "boop")],
        match: "boop", expected: "boop"
    ),
]

for (caseNumber, testcase) in testcases.enumerated() {
    let actual = f(testcase.pairs, testcase.match).first

    assert(actual == testcase.expected,
        "Testcase #\(caseNumber) \((testcase.pairs, testcase.match)) failed. Got \(String(reflecting: actual)), but expected \(testcase.expected)!")
    print("Testcase #\(caseNumber) passed!")
}
Alexander - Przywróć Monikę
źródło
1

QBIC , 30 bajtów

{_?~A=G|_X]_?~A=;|Z=B]~B=C|Z=A

QBIC nie jest silny na listach i krotkach. Powyższy kod przyjmuje ajako parametr wiersza poleceń, a następnie pyta o dane wejściowe użytkownika parami dla krotek. Gdy podany jest pusty element, jest on generowany b.

Przykładowy przebieg

Command line: Even
I'm
So
Meta
Even
This
Acronym

Meta

Wyjaśnienie

{           DO infinitely
_?          Ask for part 1 of tuple, A$
~A=G|  ]    IF A$ is empty (equal to G$, which is undefined and therefore "") THEN
     _X         Quit
_?          Ask for part 2 of tuple, B$
~A=;|       IF part 1 of the tuple equals teh cmd line param (loaded in as C$) THEN
    Z=B]        set Z$ to part 2 of the tuple (Z$ gets printed when QBIC quits)
~B=C|Z=A    IF part 2 of the tuple matches input, set Z$ to part 1
            The final IF and the DO loop are closed implicitly

Alternatywna wersja, 22 bajty

{_?_?~A=;|_XB]~B=C|_XA

Zasadniczo działa to tak samo jak dłuższa wersja, ale natychmiast kończy pracę, gdy znajdzie dopasowanie. Wymieniłem to jako alternatywę, ponieważ nie możesz wprowadzić wszystkich krotek do tego programu, biorąc pod uwagę, że kończy się wcześnie.

Steenbergh
źródło
0

Mathematica, 50 bajtów

(t={#2};Select[Complement[#,t]&/@#,Length@#==1&])&

Wypróbuj online!

J42161217
źródło
To nie działa dla przypadku {'boop','boop'}testowego.
Sanchises,
@Sanchises „Boop” nie było tam, kiedy odpowiedziałem, a pytanie nie dotyczyło krotek [a, a]. Uważam, że odpowiedzi przed edycją boop są prawidłowe
J42161217,
Nie znam polityki dotyczącej wyjaśnień PO unieważniającej istniejące odpowiedzi; to była tylko informacja o edycji.
Sanchises
0

Skumulowane , 21 bajtów

[:$revmap,KeyArray\#]

Wypróbuj online! To pobiera dane wejściowe ze stosu i pozostawia dane wyjściowe na stosie. Po rozwinięciu wygląda to następująco:

[ : $rev map , KeyArray \ # ]

Wyjaśnienie

Weźmy (('sad' 'beep') ('boop' 'boop'))i 'boop'jako dane wejściowe. Następnie taka tablica jest konstruowana przez :$revmap,:

(( 'sad' 'beep')
 ('boop' 'boop')
 ('beep'  'sad')
 ('boop' 'boop'))

Oznacza to, że kopia tablicy jest odwzorowana, każdy element jest odwrócony, a oba są łączone razem. KeyArrayz kolei tworzy hasz z podanych wartości, takich jak:

KeyArray [ sad => beep, boop => boop, beep => sad, boop => boop ]

Następnie \umieszcza szukany ciąg na górze stosu i uzyskuje klucz z tablicy KeyArray, która pasuje do #. Zwraca tylko jedną wartość, więc nie trzeba się martwić o zduplikowany klucz w tablicy kluczy.

Inne podejścia

32 bajty: (wejście ze stosu, wyjście do STDOUT) [@x:$revmap,uniq[...x=$out*]map]

36 bajtów: {%x[y index#+]YES 0# :y neq keep 0#}

38 bajtów: [@x:$revmap#,[KeyArray x#]map:keep 0#]

46 bajtów: [@x:KeyArray\$revmap KeyArray,[x#]map:keep 0#]

Conor O'Brien
źródło
0

Excel, 18 bajtów

Anonimowa formuła skoroszytu programu Excel, która przyjmuje dane wejściowe jako <Lookup Value> z zakresu A1, <Key Array>z zakresu B:Bi <Def Array>z zakresu C:Ci przekazuje wartość definicji powiązanej z wartością wyszukiwania do komórki wywołującej

=VLOOKUP(A1,B:C,2)

Próbki we / wy powinny być uwzględnione, jeśli to możliwe

Taylor Scott
źródło