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

20

Вызов

Если дан произвольный список из двух кортежей и одного элемента в одном из этих кортежей, выведите его «партнера», то есть, заданный 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"

Побеждает несколько байтов!

Нейт Стемен
источник
Кроме того, что делать, если вход появляется несколько раз или не появляется
Luis Mendo
Я не думаю, что мы можем принять ввод как плоский список, верно? Например, [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и неявно вернуть полученный массив из одного элемента.

мохнатый
источник
Это ... Я буквально попробовал этот точный сценарий, тот же вклад и все. Должно быть, я что-то пропустил ... РЕДАКТИРОВАТЬ: Да правильно, я использовал fвместо того, чтобы æв то время. Дух: P
ETHпродукция
@ETHproductions: Вносит приятные изменения - обычно я тот, кто забывает об этом æи пытается разобраться с этим f! : D
Лохматый
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 Обычно я не беспокоюсь о типе (a,b)=>=> a=>b=>каррирования, но нерекурсивная версия начиналась с рекурсивной версии, которая была каррирована, потому что мне удалось сэкономить 2 байта на рекурсивном вызове (само каррирование на самом деле стоит байт).
Нил
5

MATL , 4 14 5 6 байт

yY=P)u

Попробуйте онлайн!

Ввод представляет собой массив как [{a;b},{c;d}]. Bytecount сильно колеблется, в то время как OP выясняет, что на самом деле разрешено.

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

Sanchises
источник
4

Python 2 , 37 байт

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

Попробуйте онлайн!

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

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

Попробуйте онлайн!

(Эти два ответа настолько похожи, что я публикую их вместе, чтобы избежать перефразинга)

HyperNeutrino
источник
Переименовать , reversedчтобы reverseв течение Proton -1 байт. \ s: P А если серьезно, reverseто намного лучше, не так ли? : P
полностью человек
@totallyafloppydisk возможно / пожимает плечами, но я не переименовал большинство встроенных функций Python, которые переносятся на Proton
HyperNeutrino
@ Санчизы я не вижу, что случилось?
HyperNeutrino
Извините, мой плохой, не обращайте внимания на этот комментарий.
Санчиз
2

Python 2 , 59 45 42 байта

-14 байтов благодаря Emigna. -3 байта благодаря Maltysen.

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

Попробуйте онлайн!

Все еще хочу использовать карри, хотя. ; -;

totallyhuman
источник
1
45 байт
Emigna
Ага, знал, что есть более короткий способ сделать 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 ++ с типом данных карты, 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оператора в цикле) без операторов возврата приведет к неопределенному поведению и не будет работать, если массив кортежей не содержит элемент «ключ»

HatsuPointerKun
источник
2

PowerShell, 36 байт

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

находит элемент, содержащий intput, затем получает элемент 'other', исключая входные данные из него, PowerShell не обладает самым удивительным управлением массивами, но для этого может быть встроенный модуль, о котором я не знаю.

.\Partner.ps1 (("I'm","So"),("Meta","Even"),("This","Acronym")) "Even"
Meta
colsw
источник
Этот подход не работает для ("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  */
fergusq
источник
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 байта с предложением "Curry" от @Notatree

Келли Лоудер
источник
1
Если у вас есть версия 10, и вы берете ввод с помощью карри , вы можете сохранить 3 байта:, Cases[{#,x_}|{x_,#}:>x]&используется как%[3][{{1,2},{3,4}}]
не дерево
Можете ли вы объяснить это немного?
Нейт Стемен
2

R , 47 42 байта

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

Попробуйте онлайн!

Работает на матрице или прямом векторе. v = значение поиска, а = массив кортежей.

MickyT
источник
@Sanchises Спасибо, все исправлено.
MickyT
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)

Попробуйте онлайн!

объяснение

Это использует span, чтобы найти первый экземпляр, где 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возвращает a, который Maybeмы должны добавить Justк нашему сопоставлению с образцом #.

Мастер пшеницы
источник
2
Не думайте, что x!((a,b):c)|x==a=b|x==b=a|1<2=x!cэто 33 байта.
Линн
1
@ Линн Вперед и опубликуйте это. Я чувствую себя немного глупо, если не думаю об этом, но это действительно твой ответ.
Пшеничный волшебник
Ярмарка, опубликовано ^^
Линн
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

Попробуйте онлайн!

Emigna
источник
˜D²k>èдля 6, если нет особой причины для XOR'ing с 1?
Волшебная Урна Осьминога
@MagicOctopusUrn: причина в том, что четные индексы должны уменьшаться, а нечетные индексы увеличиваться.
Emigna
За исключением обратной части того, что я там написал ...
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.

Jakob
источник
1

Рубин, 31 байт

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

Возвращает одноэлементный массив.

м-chrzan
источник
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"";}

Попробуйте онлайн!

Dennis.Verweij
источник
x=>y=>короче (x,y)=>( Func<a, b, c>становится Func<a, Func<b, c>>и вызов функции f(a, b)становится f(a)(b)) - отличный ответ кстати!
Гжегож Пулавский
Также для первого ответа, сама функция не использует ничего, кроме System.Linq, так что вы можете добавить только 18 байтов для ответа ( using System.Linq;против namespace System.Linq{})
Grzegorz
@ GrzegorzPuławski спасибо за помощь и комплимент, надеюсь, я исправил ответы до нюхательного табака
Dennis.Verweij
1

Шелуха , 10 байт

→ḟo=⁰←S+m↔

Попробуйте онлайн!

Ungolfed / Пояснение

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

Swift 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

Это в основном делает то же самое, что и более длинная версия, но немедленно завершает работу, когда находит совпадение. Я перечислил это как альтернативу, потому что вы не можете ввести все кортежи в эту программу, учитывая, что она закрывается рано.

steenbergh
источник
0

Mathematica, 50 байтов

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

Попробуйте онлайн!

J42161217
источник
Это не работает для {'boop','boop'}теста.
Sanchises
@Sanchises "буп" не было там, когда я ответил, и вопрос был не о [a, a] кортежах. Я считаю, что ответы до буп-редактирования действительны
J42161217
Я не знаю политики по разъяснениям ФП, аннулирующих существующие ответы; это было просто хедз-ап о редактировании.
Санчиз
0

Stacked , 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)

Образец ввода / вывода должен быть включен, когда это возможно

Тейлор Скотт
источник