Menemukan pasangan Anda

20

Tantangan

Diberikan daftar 2-tupel yang sewenang-wenang, dan satu elemen di salah satu tupel itu, mengeluarkan "mitranya", yaitu diberi adan [(i,j),...,(a,b),...,(l,m)], keluaran b. Anda dapat menganggap semua tupel adalah unik, dan bahwa semua elemen dalam tupel adalah string. Lebih jauh anggap Anda tidak memiliki keduanya (x,y)dan (y,x).

Uji kasus

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"

Bytes paling sedikit menang!

Nate Stemen
sumber
Juga, apa yang harus dilakukan jika input muncul beberapa kali, atau tidak muncul
Luis Mendo
Saya kira kita tidak bisa mengambil input sebagai daftar datar, kan? Misalnya, [a, b, c, d]bukannya [(a, b), (c, d)]. Itu akan mencukur satu ton byte dari jawaban saya. : P
totallyhuman
Saya telah mengedit agar mudah-mudahan menghapus beberapa dan menambahkan kasus uji. Jangan ragu untuk mundur jika ada yang salah.
totallyhuman
@ sebenarnya manusia saya secara khusus bertanya tentang(a,a) dan diberitahu itu tidak akan terjadi . Nate bahkan mengedit pertanyaan untuk menentukan fakta ini. Namun Anda telah menambahkan test case dengan entri seperti itu dan juga mengedit spesifikasi yang membalikkan keputusan ini - mengapa? Rusak banyak jawaban.
Jonathan Allan
1
@totallyhuman saya menganggapnya berarti "mengembalikan apa pun, crash, apa pun" terutama karena pos itu kemudian direvisi untuk mengatakan semuanya akan menjadi unik.
Jonathan Allan

Jawaban:

8

Japt, 6 byte

Bekerja dengan string atau integer.

æøV kV

Menguji


Penjelasan

Input implisit dari array Udan string / integer V.

æ

Dapatkan elemen pertama (subarray) di U...

øV

Berisi V.

kV

Hapus Vdan secara implisit mengembalikan array elemen tunggal yang dihasilkan.

Shaggy
sumber
Itu ... Saya benar-benar mencoba skenario yang tepat, input yang sama dan semuanya. Saya pasti melewatkan sesuatu ... EDIT: Oh benar, saya menggunakan fbukan æpada saat itu. Duh: P
ETHproduksi
@ ETHproductions: Membuat perubahan yang menyenangkan - biasanya saya orang yang lupa tentang ædan mencoba untuk menyelesaikan dengan f! : D
Shaggy
8

Haskell , 33 byte

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

Cobalah online!

Mendefinisikan operator biner !, yang mengambil sebagai argumen kirinya nilai xtipe τ dan sebagai argumen kanannya daftar tupel (τ, τ). Pola definisi cocok di kepala (a,b)dan ekor cdaftar yang diberikan; jika x==akemudian bdikembalikan; jika x==bkemudian adikembalikan, dan jika tidak kita terus mencari di sisa daftar dengan berulang.

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

(Jika tidak ada "mitra" dalam daftar, ini akan macet, karena kami tidak menentukan apa yang x![]seharusnya.)

Lynn
sumber
5

JavaScript (ES6), 39 byte

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

Mengambil entri dan larik array sebagai argumen yang disematkan. Versi non-rekursif terbaik yang bisa saya lakukan adalah 44 byte:

e=>a=>a.find(a=>a.includes(e)).find(b=>b!=e)
Neil
sumber
Berikut ini adalah solusi non-rekursif 41-byte:a=>b=>a.map(e=>b=e[1-e.indexOf(b)]||b)&&b
Rick Hitchcock
Kamu ... Kamu akhirnya menyerah untuk menjilat ?! : o
Shaggy
@Shaggy Biasanya saya tidak repot-repot untuk tipe currying (a,b)=>=> a=>b=>, tetapi versi non-rekursif dimulai dari versi rekursif, yang digosok karena saya bisa menyimpan 2 byte pada panggilan rekursif (currying itu sebenarnya biaya satu byte).
Neil
5

MATL , 4 14 5 6 byte

yY=P)u

Cobalah online!

Input adalah array sebagai [{a;b},{c;d}]. Bytecount sangat berfluktuasi sementara OP menemukan apa yang sebenarnya diizinkan.

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.

Saya mulai dengan versi 4-byte yang hanya bisa menangani string karakter tunggal, yang merupakan satu-satunya testcase dalam tantangan aslinya. Ketika ini ternyata tidak valid, saya membuat versi 14-byte yang sangat panjang, yang bagus dan hacky (periksa riwayat revisi!), Membuat saya menemukan bug, dan kemudian ternyata sama sekali tidak perlu Y=, dengan input yang sesuai , bekerja sama baiknya dengan 4-byte asli saya y=P).

Sanchises
sumber
4

Python 2 , 37 byte

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

Cobalah online!

Proton , 31 byte

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

Cobalah online!

(Kedua jawaban ini sangat mirip sehingga saya mempostingnya bersama-sama untuk menghindari pengerjaan ulang)

HyperNeutrino
sumber
Ganti nama reversedmenjadi reversedi Proton untuk -1 byte. \ s: P Lebih serius, reverseapakah nama yang jauh lebih baik, bukan? : P
totallyhuman
@totallyafloppydisk mungkin / mengangkat bahu tapi saya tidak mengganti nama sebagian besar builtin Python yang terbawa ke Proton
HyperNeutrino
@ Berasal Saya tidak melihat apa yang salah?
HyperNeutrino
Maaf saya buruk, abaikan komentar itu.
Sanchises
2

Perl 5 , 30 + 1 (-p) = 31 byte

$_={@f=eval$_,reverse@f}->{<>}

Cobalah online!

Xcali
sumber
2

Python 2 , 59 45 42 byte

-14 byte, terima kasih kepada Emigna. -3 byte terima kasih kepada Maltysen.

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

Cobalah online!

Masih ingin menggunakan kari. ; -;

benar-benar manusiawi
sumber
1
45 byte
Emigna
Aha, tahu ada cara yang lebih pendek untuk dilakukan y+[1,-1][y%2]. Hanya tidak berpikir itu bitwise ... Terima kasih!
totallyhuman
2

C ++, 179 byte

#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 ++ w / tipe data peta, 162 byte

#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"";}

Dengan MSVC, kode mengkompilasi bahkan jika returnpernyataan terakhir ( return"";) dihilangkan. Itu membuat kode 9 byte lebih ringan, TETAPI keluar pada akhir fungsi (yaitu tidak keluar oleh returnpernyataan dalam loop) tanpa pernyataan pengembalian akan menyebabkan perilaku yang tidak ditentukan , dan tidak berfungsi jika array tuple tidak mengandung elemen "kunci"

HatsuPointerKun
sumber
2

PowerShell, 36 Bytes

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

menemukan elemen yang mengandung intput, kemudian mendapatkan elemen 'lain' dengan mengecualikan input dari itu, PowerShell tidak memiliki manajemen array yang paling menakjubkan tetapi mungkin ada built-in untuk ini saya tidak tahu.

.\Partner.ps1 (("I'm","So"),("Meta","Even"),("This","Acronym")) "Even"
Meta
colsw
sumber
Pendekatan ini tidak berfungsi untuk ("boop", "boop")test case.
AdmBorkBork
2

Rosda , 30 byte

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

Cobalah online!

Penjelasan:

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
sumber
2

Mathematica 27 24 Bytes

Casesmemilih elemen daftar yang cocok dengan suatu pola. Saat digunakan dengan panah, elemen yang cocok dapat diubah.

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

Pemakaian:

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

Penjelasan: Dalam contoh ini, setelah menemukan argumen pertama, 3, fungsi menjadi Cases[{3,x_}|{x_,3}:>x]yang merupakan bentuk operator Casesyang kemudian diterapkan pada argumen 2 {{1, 2}, {3, 4}}, sehingga memilih pasangan 3, apakah itu dalam posisi absis atau ordinat. Khususnya, fungsi ini akan mencantumkan semua teman jika sebenarnya argumen 1 muncul lebih dari satu kali dalam argumen 2, dengan kata lain, ini sedikit melampaui asumsi pertanyaan yang dinyatakan.

Mesin terbang yang tertutup harus kawat gigi berlekuk-lekuk. Disimpan 3 byte dengan saran "Currying" dari @Notatree

Kelly Lowder
sumber
1
Jika Anda memiliki versi 10 dan Anda mengambil input dengan kari , Anda dapat menyimpan 3 byte:, Cases[{#,x_}|{x_,#}:>x]&digunakan seperti%[3][{{1,2},{3,4}}]
Bukan pohon
Bisakah Anda jelaskan yang ini sedikit?
Nate Stemen
2

R , 47 42 byte

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

Cobalah online!

Bekerja pada matriks atau vektor lurus. v = nilai pencarian, a = tuple array.

MickyT
sumber
@Sanchises Terima kasih, semua sudah diperbaiki sekarang.
MickyT
2

Jelly , 6 byte

ċÞṪ⁻ÞṪ

Tautan diad mengambil daftar mitra di sebelah kiri dan mitra yang hilang di sebelah kanan dan mengembalikan mitra.

Cobalah online!

Bagaimana?

ċÞṪ⁻ÞṪ - 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
sumber
Ini tidak valid karena testcases baru telah ditambahkan.
Sanchises
1
Terima kasih telah menunjukkan itu - Saya telah berkomentar di bawah pertanyaan kepada editor (saya telah secara khusus bertanya kepada OP tentang (a,a)dan diberitahu bahwa kami tidak perlu menanganinya). Saya yakin saya bisa memperbaikinya, tetapi tidak yakin apakah spesifikasinya seperti yang dimaksudkan sekarang.
Jonathan Allan
Hmm, walaupun melihat sejarah revisi sepertinya kita perlu mendukung string bukan hanya karakter jadi ini tidak akan berhasil ...
Jonathan Allan
Bekerja dengan spek baru sekarang.
Jonathan Allan
Itu juga interpretasi saya terhadap komentar "oh well", tetapi ternyata ini bukan masalahnya.
Sanchises
1

Haskell , 65 62 byte

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

Cobalah online!

Penjelasan

Ini menggunakan rentang untuk menemukan contoh pertama di mana xterkandung oleh tuple. Itu kemudian mengambil elemen pertama dari tuple jika tidak sama dan yang kedua sebaliknya.

Haskell Lambdabot, 59 56 byte

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

Cobalah online!

Penjelasan

Ini menggunakan fungsi Data.Lists firstuntuk mengurangi byte yang digunakan oleh (!!0).snd.span, namun karena firstmengembalikan a Maybekita perlu menambahkan Justkecocokan pola kita #.

Wisaya Gandum
sumber
2
Jangan terlalu memikirkannya ... x!((a,b):c)|x==a=b|x==b=a|1<2=x!cadalah 33 byte.
Lynn
1
@Lynn Silakan dan kirim. Saya merasa agak bodoh karena tidak memikirkan hal itu, tetapi itu benar-benar jawaban Anda.
Wheat Wizard
Adil, diposting ^^
Lynn
1

05AB1E , 7 byte

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

Cobalah online!

Alternatif solusi 7 byte

˜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

Cobalah online!

Emigna
sumber
˜D²k>èuntuk 6, kecuali ada alasan khusus untuk XOR'ing dengan 1?
Magic Gurita Guci
@MagicOctopusUrn: Alasannya adalah bahwa bahkan indeks harus menurun dan kenaikan indeks ganjil.
Emigna
Kecuali kebalikan dari apa yang saya tulis di sana ...
Emigna
1

Gangguan Umum, 74 byte

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

Cobalah online!

Renzo
sumber
1

Java 8, 78 byte

Lambda (kari) dari Stream<List<String>>ke lambda dari Stringke String(meskipun pengetikan implisit terjadi untuk memungkinkan ini bekerja untuk daftar sewenang-wenang). Bahasa ini tidak memiliki kelas tuple khusus, dan saya tidak mengetahui ada di perpustakaan standar, sehingga pasangan input direpresentasikan sebagai daftar. Dapat ditugaskan untuk 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()

Cobalah secara Online

Saya akan menghargai penghematan 6 byte terakhir untuk siapa saja yang dapat meyakinkan saya bahwa mengembalikan sebuah Optional valid. Saya belum bisa meyakinkan diri sendiri.

Salah satu bagian yang menarik dari solusi ini bagi saya adalah menentukan cara termurah untuk mendapatkan output dari stream. Saya mempertimbangkan reduce,, findFirstdan min/ max, tetapi tidak ada yang lebih pendek dari intuisi findAny.

Jakob
sumber
1

Ruby, 31 byte

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

Mengembalikan array tunggal.

m-chrzan
sumber
1

JavaScript (ES6), 45 byte

Datang dengan ini semalam lalu memperhatikan Neil telah mengalahkan saya untuk solusi JS yang lebih baik; pikir saya mungkin juga mempostingnya.

Bekerja dengan string dan integer.

a=>n=>a.reduce((x,y)=>y[1-y.indexOf(n)]||x,0)
Shaggy
sumber
1

C # (.NET Core) , 101 100 + 18 byte

terima kasih kepada Grzegorz Puławski membantu mengurangi beberapa byte.

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

Cobalah online!

C # (.NET Core), 122 121 120 byte

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"";}

Cobalah online!

Dennis. Verweij
sumber
x=>y=>lebih pendek dari (x,y)=>( Func<a, b, c>menjadi Func<a, Func<b, c>>dan fungsi panggil f(a, b)menjadi f(a)(b)) - Jawaban hebat btw!
Grzegorz Puławski
Juga untuk jawaban pertama, fungsi itu sendiri tidak menggunakan apa pun selain System.Linq, jadi Anda dapat menambahkan hanya 18 byte untuk menjawab ( using System.Linq;versus namespace System.Linq{})
Grzegorz Puławski
@ GrzegorzPuławski terima kasih atas bantuan dan pujiannya, semoga saya memperbaiki jawabannya sampai
mati
1

Sekam , 10 byte

→ḟo=⁰←S+m↔

Cobalah online!

Tidak Terikat / Penjelasan

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

Catatan : Contoh di atas berfungsi pada bilangan bulat hanya demi keterbacaan, tipe itu sendiri tidak masalah (selama Anda dapat membandingkannya).

ბიმო
sumber
1

Cepat 4 , 43 byte

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

Outputnya adalah array, yang kosong (tidak ada mitra yang ditemukan), atau memiliki elemen tunggal (mitra).

Kasus uji:

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 - Pasang kembali Monica
sumber
1

QBIC , 30 byte

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

QBIC tidak kuat dalam daftar dan tupel. Kode di atas diambil asebagai parameter baris perintah, lalu meminta input pengguna berpasangan untuk tupel. Ketika elemen kosong diberikan, itu menghasilkan b.

Contoh dijalankan

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

Meta

Penjelasan

{           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

Versi alternatif, 22 byte

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

Ini pada dasarnya melakukan hal yang sama dengan versi yang lebih panjang, tetapi segera berhenti ketika menemukan kecocokan. Saya telah mencantumkan ini sebagai alternatif, karena Anda tidak dapat memasukkan semua tuple ke dalam program ini karena ia berhenti lebih awal.

steenbergh
sumber
0

Mathematica, 50 byte

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

Cobalah online!

J42161217
sumber
Ini tidak berfungsi untuk {'boop','boop'}testcase.
Sanchises
@Sanchises "boop" tidak ada di sana ketika saya menjawab dan pertanyaannya bukan tentang [a, a] tuple. Saya yakin jawaban sebelum boop-edit valid
J42161217
Saya tidak tahu kebijakan klarifikasi OP yang membatalkan jawaban yang ada; itu hanya kepala-up tentang hasil edit.
Sanchises
0

Ditumpuk , 21 byte

[:$revmap,KeyArray\#]

Cobalah online! Ini mengambil input dari stack dan meninggalkan output pada stack. Diperluas, ini terlihat seperti:

[ : $rev map , KeyArray \ # ]

Penjelasan

Mari kita ambil (('sad' 'beep') ('boop' 'boop'))dan 'boop'sebagai input. Kemudian, array seperti itu dibangun oleh :$revmap,:

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

Yaitu, salinan larik adalah peta, masing-masing anggota dibalik, dan keduanya disatukan. KeyArraypada gilirannya menghasilkan hash dari nilai-nilai yang diberikan, seperti:

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

Kemudian, \bawa string pencarian ke atas tumpukan, dan dapatkan kunci dari KeyArray yang cocok dengannya# . Ini hanya mengembalikan satu nilai, jadi kunci duplikat di KeyArray tidak perlu dikhawatirkan.

Pendekatan lain

32 byte: (input dari stack, output ke STDOUT) [@x:$revmap,uniq[...x=$out*]map]

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

38 byte: [@x:$revmap#,[KeyArray x#]map:keep 0#]

46 byte: [@x:KeyArray\$revmap KeyArray,[x#]map:keep 0#]

Conor O'Brien
sumber
0

Excel, 18 Bytes

Rumus Buku Kerja Excel Anonim yang mengambil input <Lookup Value>dari rentang A1, <Key Array>dari rentang B:Bdan <Def Array>dari rentang C:C, dan menampilkan nilai definisi yang terkait dengan nilai pencarian ke sel panggilan

=VLOOKUP(A1,B:C,2)

Sampel I / O akan dimasukkan bila memungkinkan

Taylor Scott
sumber