Пошук свого партнера


20

Виклик

Враховуючи довільний перелік 2-кортежів і єдиний елемент в одному з цих кортежів, виведіть свого "партнера", тобто дайте aта [(i,j),...,(a,b),...,(l,m)], виведіть b. Ви можете припустити, що всі кортежі унікальні, і що всі елементи в кортежах - це рядки. Далі припустимо, що у вас немає обох (x,y)і (y,x).

Тестові кейси

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"

Виграє найменше байтів!


Також, що робити, якщо введення відображається кілька разів або не з’являється
— Луїс Мендо

Я не думаю, що ми можемо сприймати інформацію як плоский список, правда? Наприклад, [a, b, c, d]замість [(a, b), (c, d)]. Це могло б поголити тонну байтів з моєї відповіді. : P
— повністюлюдський

Я відредагував, щоб, сподіваюсь, очистити деякі речі та додав тестові приклади. Не соромтесь відкочуватися, якщо щось не так.
— повністюлюдський

@totallyhuman я спеціально запитав про це,(a,a) і мені сказали, що цього не станеться . Потім Нейт навіть редагував питання, щоб уточнити цей факт. Однак ви додали тестовий випадок із таким записом, а також відредагували специфікацію, що скасовує це рішення - чому? Це зламано купу відповідей.
— Джонатан Аллан

1
@totallyhuman Я вважав, що це означає "повернути що завгодно, аварії, будь-що", тим більше, що посаду потім переглянули, щоб сказати, що все буде унікальним.
— Джонатан Аллан

Відповіді:


8

Japt, 6 байт

Працює з рядками або цілими числами.

æøV kV

Перевірте це


Пояснення

Неявне введення масиву Uта рядка / цілого числа V.

æ

Отримайте перший елемент (subarray) у Uцьому ...

øV

Містить V.

kV

Видаліть Vта неявно поверніть отриманий одноелементний масив.


Ось ... Я буквально спробував той точний сценарій, той самий вклад і все. Я, мабуть, щось пропустив ... EDIT: О так, я використовував fзамість æтого часу. Duh: P
— ETHproductions

@ETHproductions: Приємні зміни - зазвичай я той, хто забуває æі намагається заплутатися f! : D
— Shaggy

8

Haskell , 33 байти

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

Спробуйте в Інтернеті!

Визначає двійковий оператор !, який приймає за лівий аргумент значення xтипу τ, а його правою аргументом - список кортежів (τ, τ). Шаблон визначення відповідає голові (a,b)та хвосту cданого списку; якщо x==aтодіb повертається; якщо x==bпотім aповертається, і в іншому випадку ми продовжуємо шукати решту списку повторно.

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

(Якщо в списку немає «партнера», це вийде з ладу, оскільки ми не визначилися, що x![]має бути.)


5

JavaScript (ES6), 39 байт

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

Вважає запис та масив масивів як виправлені аргументи. Найкраща нерекурсивна версія, яку я міг зробити, - це 44 байти:

e=>a=>a.find(a=>a.includes(e)).find(b=>b!=e)

Ось 41-байтне нерекурсивне рішення:a=>b=>a.map(e=>b=e[1-e.indexOf(b)]||b)&&b
— Рік Хічкок

Ви ... Ви нарешті поступилися кар'єру ?! : o
— Shaggy

@Shaggy Зазвичай я не турбуюсь про тип (a,b)=>=> a=>b=>currying, але нерекурсивна версія починалася з рекурсивної версії, яка була викривлена, оскільки мені вдалося зберегти 2 байти на рекурсивному виклику (сам currying фактично коштує байт).
— Ніл

5

MATL , 4 14 5 6 байт

yY=P)u

Спробуйте в Інтернеті!

Вхід - це масив як [{a;b},{c;d}]. Рахунок сильно коливається, в той час як ОР визначає, що насправді дозволено.

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.

Я почав з 4-байтової версії, яка могла обробляти лише односимвольні рядки, що було єдиним тестовим контрольним рядком в оригінальному виклику. Коли це виявилося недійсним, я зробив дуже довгу 14-байтову версію, яка була приємною і хитрою (перевірте історію редагування!), Змусила мене виявити помилку, а потім виявилася абсолютно непотрібною, як Y=з відповідним входом , працював так само добре, як і мій оригінальний 4-байт y=P).


4

Python 2 , 37 байт

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

Спробуйте в Інтернеті!

Протон , 31 байт

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

Спробуйте в Інтернеті!

(Ці дві відповіді настільки схожі, що я публікую їх разом, щоб уникнути повторного фармування)


Перейменувати , reversedщоб reverseпротягом Proton -1 байт. \ s: P Більш серйозно, reverseце набагато краще ім'я, ні? : P
— повністюлюдський

@totallyafloppydisk можливо / знизаю плечима, але я не перейменував більшість вбудованих Python, які переносяться на Протон
— HyperNeutrino


Вибачте моє погано, ігноруйте цей коментар.
— Санчіз


2

Python 2 , 59 45 42 байт

-14 байт завдяки Еміньї. -3 байти завдяки Мальтісену.

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

Спробуйте в Інтернеті!

Ще хочу використовувати каррі. ; -;



Ага, знав, що існує коротший спосіб y+[1,-1][y%2]. Просто не думав, що це побито ... Спасибі!
— повністюлюдський

2

C ++, 179 байт

#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 / карта, 162 байти

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

З MSVC код компілюється, навіть якщо останнє returnтвердження ( return"";) пропущено. Це робить код 9 байтів легшим, АЛЕ вихід з кінця функції (тобто не вихід з returnоператором у циклі) без операторів повернення не спричинить невизначене поведінку , і не працюватиме, якщо масив кортежу не містить елемента "ключ"


2

PowerShell, 36 байт

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

знаходить елемент, що містить вхід, а потім отримує "інший" елемент, виключаючи вхід з нього, PowerShell не має найдивовижнішого управління масивом, але може бути вбудований для цього я не знаю.

.\Partner.ps1 (("I'm","So"),("Meta","Even"),("This","Acronym")) "Even"
Meta

Цей підхід не працює для ("boop", "boop")тестового випадку.
— AdmBorkBork

2

Рода , 30 байт

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

Спробуйте в Інтернеті!

Пояснення:

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

2

Mathematica 27 24 байт

Casesвибирає елементи списку, які відповідають шаблону. При використанні зі стрілкою елементи, що відповідають шаблонам, можуть бути перетворені.

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

Використання:

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

Пояснення: У цьому прикладі, після зустрічі з першим аргументом, 3 стає функцією, Cases[{3,x_}|{x_,3}:>x]яка є операторною формою, Casesяка потім застосовується до 2-го аргументу,{{1, 2}, {3, 4}} вибираючи таким чином супутник 3, чи він знаходиться в абсцисі чи ординатній позиції. Зокрема, ця функція перелічить усіх супутників, якщо насправді 1-й аргумент з’являється не раз у межах 2-го аргументу, іншими словами, це трохи перевищує припущення заявленого питання.

Огортаючі гліфи повинні бути чітко підтягнуті. Збережено 3 байти з пропозицією "Currying" від @Notatree


1
Якщо у вас є версія 10, і ви берете вкладення за допомогою кришталю , ви можете зберегти 3 байти:, Cases[{#,x_}|{x_,#}:>x]&використовується на зразок%[3][{{1,2},{3,4}}]
— Не дерево

Чи можете ви пояснити це трохи?
— Нейт Стімен


2

Желе , 6 байт

ċÞṪ⁻ÞṪ

Діадичне посилання, що приймає списку партнерів зліва та програв-партнер праворуч та повертає партнера.

Спробуйте в Інтернеті!

Як?

ċÞṪ⁻ÞṪ - 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)

Це недійсно з моменту додавання нових тестів.
— Санчіз

1
Дякуємо, що вказали на це - я прокоментував це питання в редакторі (я спеціально попросив ОП про це, (a,a)і мені сказали, що нам не потрібно це робити). Я впевнений, що міг би це виправити, але не впевнений, що специфікація буде такою, якою вона була призначена зараз.
— Джонатан Аллан

Хм, хоча, дивлячись на історію редагування, здається, нам потрібно підтримувати рядки не просто символи, так що це все одно не буде працювати ...
— Джонатан Аллан

Працює з новою специфікацією зараз.
— Джонатан Аллан

Це було і моє тлумачення коментаря "добре", але очевидно, це було не так.
— Санчіз


1

Haskell , 65 62 байт

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

Спробуйте в Інтернеті!

Пояснення

Для цього використовується проміжок, щоб знайти перший екземпляр, де xміститься кортеж. Потім він захоплює перший елемент кортежу, якщо його немає, а другий інакше.

Haskell Lambdabot, 59 56 байт

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

Спробуйте в Інтернеті!

Пояснення

Ця функція використовує Data.Lists firstдля скорочення байтів, якими користується (!!0).snd.span, однак тому, що firstповертає Maybeнам потрібно додати Justдо нашого збігу шаблонів у #.


2
Не передумуйте ... x!((a,b):c)|x==a=b|x==b=a|1<2=x!cце 33 байти.
— Лінн

1
@Lynn Вперед та опублікуй його. Мені здається трохи дурним не думати про це, але це справді твоя відповідь.
— Пшеничний майстер

Ярмарок, розміщений ^^
— Лінн

1

05AB1E , 7 байт

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

Спробуйте в Інтернеті!

Альтернативно 7-байтний розчин

˜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

Спробуйте в Інтернеті!


˜D²k>èдля 6, якщо немає конкретної причини для XOR'ing з 1?
— Чарівний восьминога Урна

@MagicOctopusUrn: Причина полягає в тому, що навіть індекси повинні зменшуватися, а непарні показники збільшуватися.
— Емінья

За винятком реверсу того, що я там написав ...
— Emigna


1

Java 8, 78 байт

Лямбда (з викривленням) від Stream<List<String>>лямбда від Stringдо String(хоча трапляється неявна введення, яка дозволяє це працювати для довільних списків). У мові немає виділених кортежних класів, і я не знаю жодного в стандартній бібліотеці, тому пари введення представлені у вигляді списків. Можна призначити 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()

Спробуйте в Інтернеті

Я зарахую заощадження останніх 6 байт тому, хто може переконати мене в тому, що повертається Optional є дійсним. Я не зміг переконати себе.

Однією з цікавих частин цього рішення для мене було визначення найдешевшого способу отримання виходу з потоку. Я вважав reduce, findFirstта min/ max, але жоден не був коротшим, ніж інтуїтивний findAny.



1

JavaScript (ES6), 45 байт

Придумав цю минулу ніч, тоді помітив, що Ніл побив мене до кращого рішення JS; подумав, що я можу також розмістити це все одно.

Працює з рядками та цілими числами.

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


1

C # (.NET Core) , 101 100 + 18 байт

дякую Гжегожу Пулавському, який допомагає скоротити пару байтів.

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

Спробуйте в Інтернеті!

C # (.NET Core), 122 121 120 байт

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

Спробуйте в Інтернеті!


x=>y=>коротше (x,y)=>( Func<a, b, c>стає Func<a, Func<b, c>>і функція f(a, b)стає викликом f(a)(b)) - чудова відповідь btw!
— Grzegorz Puławski

Також для першої відповіді сама функція не використовує нічого, крім System.Linq, тож ви можете додати лише 18 байт для відповіді ( using System.Linq;проти namespace System.Linq{})
— Grzegorz Puławski

@ GrzegorzPuławski дякую за допомогу та комплімент, сподіваюся, я зафіксував відповіді до нюхання
— Dennis.Verweij

1

Лушпиння , 10 байт

→ḟo=⁰←S+m↔

Спробуйте в Інтернеті!

Безголів / пояснення

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

Примітка . Наведений вище приклад працює на цілі числа лише для читабельності, сам тип не має значення (доки ви можете порівнювати його).


1

Швидкий 4 , 43 байти

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

Вихід - це масив, який або порожній (партнера не знайдено), або має один елемент (партнер).

Тестові приклади:

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!")
}

1

QBIC , 30 байт

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

QBIC не сильний у списках та кортежах. Вищевказаний код приймає aяк параметр командного рядка, після чого запитує користувацьке введення парами для кортежів. Коли дається порожній елемент, він виводить b.

Вибірка зразка

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

Meta

Пояснення

{           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

Альтернативна версія, 22 байти

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

Це в основному робить те саме, що і довша версія, але одразу ж закривається, коли знаходить відповідність. Я перерахував це як альтернативу, тому що ви не можете вводити всі кортежі в цю програму, враховуючи, що вона закривається рано.


0

Математика, 50 байт

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

Спробуйте в Інтернеті!


Це не працює для {'boop','boop'}тесту.
— Санчіз

@Sanchises "boop" не було, коли я відповів, і питання було не про [a, a] tuples. Я вважаю, що відповіді перед boop-редагуванням є дійсними
— J42161217

Я не знаю політики щодо роз'яснень ОП, що визнають недійсними відповіді; це була лише помилка щодо редагування.
— Санчіз

0

Складено , 21 байт

[:$revmap,KeyArray\#]

Спробуйте в Інтернеті! Це бере вхід зі стека і залишає вихід на стеку. Розширено, це виглядає так:

[ : $rev map , KeyArray \ # ]

Пояснення

Візьмемо (('sad' 'beep') ('boop' 'boop'))і 'boop'як вхід. Тоді такий масив будується за допомогою :$revmap,:

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

Тобто копія масиву є картою, кожен член реверсується, а два об'єднуються разом. KeyArrayу свою чергу робить хеш із заданих значень, як-от так:

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

Потім \виводить рядок пошуку у верхню частину стека та отримує ключ із KeyArray, який відповідає #. Це повертає лише одне значення, тому дублюючий ключ у KeyArray не потрібно турбуватися.

Інші підходи

32 байти: (вхід із стека, вихід у STDOUT) [@x:$revmap,uniq[...x=$out*]map]

36 байт: {%x[y index#+]YES 0# :y neq keep 0#}

38 байт: [@x:$revmap#,[KeyArray x#]map:keep 0#]

46 байт: [@x:KeyArray\$revmap KeyArray,[x#]map:keep 0#]


0

Excel, 18 байт

Формула анонімної робочої книги Excel, яка приймає введення як <Lookup Value>з діапазону A1, <Key Array>діапазону, так B:Bі <Def Array>з діапазону C:C, а також виводить значення визначення, пов'язане зі значенням пошуку, у викликову клітинку

=VLOOKUP(A1,B:C,2)

Зразок вводу / виводу включається, коли це можливо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.