파트너 찾기


20

도전

임의의 2 개의 튜플 목록과 해당 튜플 중 하나의 단일 요소가 주어지면 "파트너"(예 : given 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) 하고 는 일어나지 않을 것입니다 들었다 . 그런 다음 Nate는이 사실을 지정하기 위해 질문을 편집했습니다. 그러나 이러한 항목으로 테스트 사례를 추가 하고이 결정을 취소하는 사양을 편집했습니다. 왜 그렇습니까? 많은 답변이 깨졌습니다.
Jonathan Allan

1
@totallyhuman 나는 게시물이 모든 것이 독창적 이라고 말한 후에 개정 된 이후로 "무언가를 반환, 충돌, 무엇이든"을 의미하기 위해 가져 왔습니다 .
Jonathan Allan

답변:


8

apt, 6 바이트

문자열 또는 정수와 함께 작동합니다.

æøV kV

그것을 테스트


설명

어레이의 묵시적 입력 U문자열 / 정수 V.

æ

그 첫 번째 요소 (subarray)를 얻으십시오 U...

øV

포함 V합니다.

kV

V결과 단일 요소 배열을 제거 하고 암시 적으로 반환합니다.


그건 ... 문자 그대로 정확한 시나리오, 동일한 입력 및 모두를 시도했습니다. 뭔가를 놓쳤을 것입니다 ... 편집 : 아 맞다, 당시에 f대신 사용 æ하고있었습니다. Duh : P
ETHproductions

@ETHproductions : 좋은 변화를 만듭니다-보통 나는 잊고 æ지나 가려고하는 사람입니다 f! : D
얽히고 설킨

8

하스켈 , 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

자바 스크립트 (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 바이트를 절약 할 수 있었기 때문에 카레가 발생했습니다 (카레 링 자체는 실제로 비용이 듭니다) 바이트).
Neil

5

MATL , 4 14 5 6 바이트

yY=P)u

온라인으로 사용해보십시오!

입력은의 배열 [{a;b},{c;d}]입니다. 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).


4

파이썬 2 , 37 바이트

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

온라인으로 사용해보십시오!

양성자 , 31 바이트

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

온라인으로 사용해보십시오!

(이 두 답변은 너무 유사하여 파업을 피하기 위해 함께 게시하고 있습니다)


-1 바이트의 경우 Proton으로 이름 reversed을 바꿉니다 reverse. \ s : P 더 진지하게, reverse더 좋은 이름입니까? : P
완전히 인간적인

@totallyafloppydisk 어쩌면 / 어깨를 으쓱하지만 양자 이월 얻을 파이썬 내장 매크로 대부분의 이름을 변경하지 않았다
HyperNeutrino


죄송합니다, 그 의견을 무시하십시오.
Sanchises



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 / map 데이터 유형, 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 라이터 바이트,하게 하지만 (a로 나오지 않는 즉, 함수 말까지 종료 return하게됩니다 돌아올 수없는 문으로 루프 문) 정의되지 않은 동작 튜플 배열이 "키"요소를 포함하지 않는 경우, 그리고 일을


2

PowerShell, 36 바이트

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

입력을 포함하는 요소를 찾은 다음 입력을 제외하여 'other'요소를 가져옵니다. 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두 번째 인수에 적용되어 {{1, 2}, {3, 4}}가로 좌표 또는 세로 위치에 상관없이 3의 동반자를 선택합니다. 특히이 함수는 실제로 첫 번째 인수가 두 번째 인수 내에 두 번 이상 나타나는 경우 모든 컴패니언을 나열합니다. 즉, 이는 언급 된 질문의 가정을 약간 넘어 섭니다.

둘러싸는 글리프는 구불 구불 한 괄호 여야합니다. @Notatree의 "Currying"제안으로 3 바이트를 저장했습니다.


1
버전 10이 있고 currying으로 입력을 받으면 다음과 Cases[{#,x_}|{x_,#}:>x]&같이 사용하여 3 바이트를 절약 할 수 있습니다.%[3][{{1,2},{3,4}}]
나무가 아닙니다.

이것을 조금 설명해 주시겠습니까?
Nate Stemen


2

젤리 , 6 바이트

ċÞṪ⁻ÞṪ

왼쪽의 목록 파트너와 오른쪽의 잃어버린 파트너를 가져와 파트너를 반환하는 2가 연결.

온라인으로 사용해보십시오!

방법?

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

새로운 테스트 케이스가 추가되었으므로 유효하지 않습니다.
Sanchises

1
지적 해 주셔서 감사합니다-편집자에게 질문에 대해 언급했습니다 (OP에 대해 구체적으로 요청했으며 (a,a)처리 할 필요가 없다고 들었습니다). 나는 그것을 고칠 수 있다고 확신하지만 사양이 지금 의도 된 것인지 확실하지 않습니다.
Jonathan Allan

흠, 개정 이력을 볼 때 문자가 아닌 문자열을 지원해야하므로이 방법은 효과가 없습니다 ...
Jonathan Allan

새로운 사양과 함께 작동합니다.
Jonathan Allan

그것은 "오 잘"의견에 대한 나의 해석이기도하지만, 이것은 사실이 아닙니다.
Sanchises


1

하스켈 , 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반환 하기 때문에 패턴 일치에 Maybe추가해야합니다 .Just#


2
그것을 다시 생각하지 마십시오 ... x!((a,b):c)|x==a=b|x==b=a|1<2=x!c33 바이트입니다.
Lynn

1
@Lynn 계속해서 게시하십시오. 나는 그것을 생각하지 않고 약간 어리석은 느낌이지만 실제로는 당신의 대답입니다.
밀 마법사

박람회, ^^ 게시
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>èXOR이 1로 지정된 특별한 이유가 없다면 6에 대해?
매직 문어 Urn

@MagicOctopusUrn : 그 이유는 인덱스조차도 감소하고 홀수 인덱스가 증가해야하기 때문입니다.
Emigna

내가 쓴 내용의 반대를 제외하고 ...
Emigna


1

자바 8, 78 바이트

발 람다 (카레) Stream<List<String>>로부터 람다 StringString(비록 암시 입력 임의리스트 작동이 허용하는 일). 이 언어에는 전용 튜플 클래스가 없으며 표준 라이브러리에 대해 전혀 모르므로 입력 쌍이 목록으로 표시됩니다. 에 할당 할 수 있습니다 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()

온라인으로 사용해보십시오

나는 반환하는 Optional것이 유효 하다는 것을 확신 할 수있는 사람에게 마지막 6 바이트를 절약 한 것으로 생각합니다. 나는 내 자신을 설득 할 수 없었다.

이 솔루션의 흥미로운 부분 중 하나는 스트림에서 출력을 얻는 가장 저렴한 방법을 결정하는 것이 었습니다. 나는 고려 reduce, findFirstmin/ max하지만 아무도 직관적보다 짧은 없었다 findAny.


1

루비, 31 바이트

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

싱글 톤 배열을 반환합니다.


1

자바 스크립트 (ES6), 45 바이트

지난 밤에이 일이 생겨서 Neil이 더 나은 JS 솔루션으로 나를 이겼다는 것을 알았습니다. 어쨌든 게시 할 수 있다고 생각했습니다.

문자열 및 정수와 함께 작동합니다.

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


1

C # (. NET 코어) , 101100 + 18 바이트

몇 바이트를 줄이는 데 도움을주는 Grzegorz Puławski에게 감사합니다.

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

온라인으로 사용해보십시오!

C # (.NET 코어), 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;vs namespace System.Linq{})
Grzegorz Puławski

@ GrzegorzPuławski는 도움과 칭찬에 감사드립니다. 희망적으로 나는 snuff까지 답변을
고쳤

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

@Sanchises는 "붑"나는 거기에 대답하지 않은 때 문제는 좋은가보다 편집이 유효하기 전에 [A가 A] tuples.I이 답변을 믿는에 대해 아니었다
J42161217

기존 답변을 무효화하는 OP의 설명에 대한 정책을 모르겠습니다. 그것은 단지 편집에 대한 헤즈 업이었습니다.
Sanchises

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

엑셀, 18 바이트

로 입력을 받아 익명 Excel 통합 수식 <Lookup Value>범위에서 A1, <Key Array>범위 B:B<Def Array>범위로부터 C:C발신 셀 조회 값과 관련된 정의의 값을 출력한다

=VLOOKUP(A1,B:C,2)

가능하면 샘플 I / O가 포함되어야한다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.