パートナーを見つける


20

チャレンジ

2タプルの任意のリストと、それらのタプルの1つにある単一の要素が与えられた場合、その「パートナー」、つまりgiven aおよび[(i,j),...,(a,b),...,(l,m)]outputを出力します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とstring / integerの暗黙的な入力V

æ

その中の最初の要素(サブ配列)を取得Uします...

øV

が含まれていますV

kV

V結果の単一要素配列を削除して暗黙的に返します。


それは...文字通り、正確なシナリオ、同じ入力、すべてを試しました。私は何かを見逃していたに違いありません...編集:ああそう、私は当時ではfなく使用æしていた。Duh:P
ETHproductions

@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==athen 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=>タイプのカリーを気にしませんが、非再帰バージョンは再帰バージョンから始まりました。バイト)。
ニール

5

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

最初のチャレンジで唯一のテストケースであった、1文字の文字列のみを処理できる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]

オンラインでお試しください!

(これらの2つの答えは非常に似ているので、補充を避けるために一緒に投稿しています)


-1バイトのProtonに名前reversedを変更reverseします。\ s:Pもっと真剣に、もっとreverseいい名前ですか?:P-
完全に人間

@totallyafloppydisk多分/ shrugですが、Protonに引き継がれるPythonビルトインのほとんどは名前を変更しませんでした
-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 ++、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が軽くバイト、作るBUT(で出ていないつまり、関数年末までに終了するreturn原因になりますノーリターン文でループ内のステートメント)未定義の動作タプル配列は、「キー」の要素が含まれていない場合、およびない仕事を


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

このアプローチは("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が検出された後、関数は2番目の引数に適用されるCases[{3,x_}|{x_,3}:>x]演算子形式の関数になり、横座標か縦座標位置かにかかわらず、3のコンパニオンを選択します。特に、実際に1番目の引数が2番目の引数内に複数回現れる場合、言い換えると、これは述べられた質問の仮定をわずかに超える場合、この関数はすべての仲間をリストします。Cases{{1, 2}, {3, 4}}

囲むグリフは波線で囲む必要があります。@Notatreeからの「Currying」の提案で3バイトを保存しました


1
あなたがバージョン10を持っているとあなたがして、入力を取る場合はカリー化、あなたは3つのバイトを保存することができますCases[{#,x_}|{x_,#}:>x]&、のように使用%[3][{{1,2},{3,4}}]
未木

これについて少し説明してもらえますか?
ネイトステメン


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)それを処理する必要がないと言われました)。私はそれを修正できると確信していますが、仕様が現在意図されているとおりかどうかはわかりません。
ジョナサンアラン

うーん、...我々はとにかく、この文句を言わない仕事ので、文字列だけではなく文字をサポートする必要があると思われるリビジョン履歴を見ていたが
ジョナサン・アラン

現在、新しい仕様で動作します。
ジョナサンアラン

それは「まあ」コメントの私の解釈でもありましたが、明らかにそうではありませんでした。
Sanchises


1

Haskell65 62バイト

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

オンラインでお試しください!

説明

これはx、タプルに含まれる最初のインスタンスを見つけるためにspanを使用します。次に、タプルの最初の要素が等しくない場合はそれを取得し、等しくない場合は2番目の要素を取得します。

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ます。MaybeJust#


2
考えすぎないでください… x!((a,b):c)|x==a=b|x==b=a|1<2=x!c33バイトです。
リン

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の場合、1とXORをとる特別な理由がない限り?
魔法のタコUr

@MagicOctopusUrn:理由は、偶数のインデックスが減少し、奇数のインデックスが増加するためです。
エミグナ

私がそこに書いたものの逆を除いて
...-エミグナ


1

Java 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()

オンラインで試す

最後の6バイトの保存は、anを返すことOptionalは有効であると私に納得させることができる人なら誰でも信じています。私は自分を納得させることができませんでした。

このソリューションの興味深い部分の1つは、ストリームから出力を取得する最も安価な方法を決定することでした。私はと考えられreducefindFirstおよびmin/ max、どれも直感的により短くありませんでしたfindAny


1

ルビー、31バイト

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

シングルトン配列を返します。


1

JavaScript(ES6)、45バイト

この昨夜に気付いた後、ニールが私をより良いJSソリューションに打ち負かしたことに気付きました。とにかくそれを投稿してもよいと思いました。

文字列と整数で動作します。

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


1

C#(.NETコア)101 + 18バイト

GrzegorzPuławski、数バイトの削減にご協力いただきありがとうございます。

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))よりも短い-すばらしい答えです!
グジェゴルツプワフスキ

また、最初の回答では、関数自体はSystem.Linq以外を使用しないため、回答に18バイトのみを追加できます(using System.Linq;namespace System.Linq{}
GrzegorzPuławski17年

@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

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

これは基本的に長いバージョンと同じですが、一致するものが見つかるとすぐに終了します。早めに終了すると、このプログラムにすべてのタプルを入力できないため、これを代替としてリストしました。


0

Mathematica、50バイト

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

オンラインでお試しください!


これは{'boop','boop'}テストケースでは機能しません。
Sanchises

@Sanchisesは「ブープは、」私は答えていないときや疑問がブープ編集が有効である前に、[、] tuples.Iは答えを信じてについてではなかった
J42161217

既存の回答を無効にするOPの明確化に関するポリシーがわかりません。それは編集についてのヘッズアップでした。
Sanchises

0

積み上げ、21バイト

[:$revmap,KeyArray\#]

オンラインでお試しください!これは、スタックから入力を受け取り、出力をスタックに残します。展開すると、次のようになります。

[ : $rev map , KeyArray \ # ]

説明

(('sad' 'beep') ('boop' 'boop'))and 'boop'を入力として取りましょう。次に、そのような配列は以下によって構築され:$revmap,ます:

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

つまり、配列のコピーがマップであり、各メンバーが逆になり、2つが連結されます。KeyArray次のように、与えられた値からハッシュを作成します。

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

次に、\検索文字列をスタックの先頭に移動し、次と一致するKeyArrayからキーを取得します#。これは1つの値のみを返すため、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)

可能な場合、サンプルI / Oが含まれます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.