指定されたキーに基づいて一意の要素を検索します


8

入力

それぞれがキーy iとペアになっている値x iのリストを取ります。

[(x1, y1), (x2, y2), ...]

出力

セット{ x i } からの値のみを含むリストLを返します。

  • Lの長さは、セット{ y i } 内の一意のキーkの数と等しくなければなりません。
  • 各一意のキーに対してK {から値が存在しなければならないX Iキー有し} kは

細部

  • 標準の抜け穴は許可されていません。
  • 入力のすべての値が非負の整数であると想定できます。
  • 値とキーが重複している可能性があります。
  • 入力には少なくとも1つの値/キーのペアがあると想定できます。
  • 等しい長さの2つのリストを入力として取得する場合(1つは値、もう1つはキー)、それで問題ありません。
  • 他の入力は受け付けません。
  • 出力するリストの順序は関係ありません。
  • X 私はあなたが各キーのために選択した問題ではありません。

たとえば、入力[[0, 0], [1, 3], [2, 3]]を使用すると、これらのいずれ[0, 1][0, 2]または任意の順列を返すことができます。

[[1, 2], [3, 2], [3, 0]]  -> [1, 3] or [3, 3]
[[7, 2], [7, 0], [7, 1]]  -> [7, 7, 7]
[[4, 0], [4, 0], [9, 1], [5, 2]]  -> [4, 9, 5]
[[9, 1], [99, 10], [5, 5], [0, 3]]  -> [9, 99, 5, 0]

バイト数が最も少ない。


フォームに入力できますkey value key value key value ...か?
wastl

@wastlはい、できます
dylnan

言語が同じを含むマップをサポートしていない場合はどうなりますkeyか?私達はように2つの配列を取ることができますkeysし、values入力として?または、入力として複数の値(またはおそらくキーと値のペアのリスト)を取る独自のカスタムマップを作成しますか?
Kevin Cruijssen

1
@KevinCruijssen If you prefer to take two lists of equal length as input that is fine.これはどういう意味ですか?「マップ」の意味がわかりません。
dylnan

@dylnanああ、それは本当に私が意味したことでした、ありがとう。それを過ぎて読んでください。また、「マップ」はJavaでのキーと値のペアの用語であり、他の言語では異なる方法で呼び出されるかどうかは不明です。
Kevin Cruijssen

回答:


4

Python 2、34バイト

lambda a,b:dict(zip(b,a)).values()

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

入力を値のリストおよびキーのリストとして受け取ります。
キーと値を交換して辞書を生成します。これにより、一意のy値のみが残ります。対応するすべてのx値を返す


1
入力引数の順序を逆にして(質問は特定の順序を規定していません)、それらを可変引数として受け取って
David Foerster



3

Clojure、20 18バイト

(comp vals zipmap)

値とキーのリストを引数として、この順序で受け取ります。




2

JavaScript(ES8)、43バイト

入力をカリー化構文の2つの別個のリストとして受け取ります(values)(keys)

v=>k=>v.filter(o=(x,i)=>o[j=k[i]]?0:o[j]=1)

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


今日のJavaScriptレッスン:関数は配列です。
ヤコブ

@Jakobより正確には、関数はオブジェクトです。最初のテストケースの最後では、oはのようになり{ [Function: o] '0': 1, '2': 1 }ます。
Arnauld




2

Japt、8バイト

â £VgUbX

Japt通訳

最後の1バイトを保存してくれたShaggyに感謝

ロジックを完全に作り直しました。ルイスの答えからいくつかの手掛かりをとりますが、それはまだ改善されていると思います。入力を2つのリストとして受け取りますkeys, values。どうやら私はまだまだ最適ではありません。

説明:

â £         For each unique Key X
     Ub     find the first index in "keys"
       X    which is equal to X
   Vg       then take the "value" with the same index

12バイト。キーと値を別々の入力として取得することで、数バイトを節約できる場合があります。
Shaggy

試してみたい場合は、8バイトの解決策があります。
シャギー

これ¥は必要ありません;)
シャギー

@Shaggy確かに!のオーバーロードの違いは何だろうと思っていましたbが、そのうちの1つだけが関数を実行することにまったく気づきませんでした。
カミルドラカリ2018

そして、それは私が今考えていた8つの解決策です。偶然にも、入力を逆にしても、8バイトのままですVâ £gVbX
シャギー


1

05AB1E、4 バイト

DÙkè

2つの入力リストを取得します。最初に値、次にキーです。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

D        # Duplicate the values-list
 Ù       # Get all unique items of the values-list
         #  i.e. [0,0,1,0,2] → ['0','1','2']
  k      # Get all (first) indices of these unique values
         #  i.e. [0,0,1,0,2] and ['0','1','2'] → [0,2,4]
   è     # And use this index to get the key from the keys-list
         #  i.e. [0,2,4] and [4,4,9,5,4] → [4,9,4]

1

Java 8、82バイト

int[]ペアのストリームからへのラムダjava.util.Collection<Integer>

m->m.collect(java.util.stream.Collectors.toMap(a->a[1],a->a[0],(a,b)->a)).values()

オンラインで試す


1

ジュリア0.636の 34 32バイト

A->values(Dict(y=>x for(x,y)=A))

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

(@JonathanFrechのおかげで2バイトを削り取った)
(内包で置き換えることで別の2バイト=

質問で指定された入力形式[[1, 2], [2, 7]]は、(可能性のある)キー値のペアを含む配列の配列としてJuliaでそのまま機能します。注意すべき唯一のことは、キーが2番目にあり、値が最初に来ることです。


同じバイトカウントのわずかな変更、

A->values(Dict((y,x)for(x,y)∈A))

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


PPCGへようこそ!私はジュリアに慣れていませんが、両方の角かっこを削除することで2バイトを削ることができるように思えます。
Jonathan Frech

ありがとうございました。括弧は常に内包表記に必要であると想定していましたが、引数として使用する場合は省略可能のようです。特にジュリア以外のユーザーにとっては良い提案です!:)
sundar-モニカ

1
私はそれが(Pythonから来ている)ある種のタプル理解であると想定しています。一般的なヒントとして、TIOにはPPCG送信を簡単に作成できるコピーウィザードがあります(右上隅のリンクアイコンは、現在の投稿の先頭のスペースなどの問題を回避します)。私のような小さなゴルフではそれは絶対に必要というわけではありませんが、一般的に私は他のユーザーからのゴルフの改善を信用することを勧めます。
Jonathan Frech

ああ、私が知らない自動化ツールがあるかどうか、みんなの提出物がどのように統一された形式であるのかと思っていました。私リンクアイコンを使用していましたが、Markdownでのスクロールをゆっくりと停止し、PPCG専用のスクロールアイコンがあることを知りませんでした。(そしてクレジット部分については言及します、そうします。)
sundar-

1

ジュリア0.629の 26 19バイト

valuesDictzip

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

ポイントフリースタイル。入力をキーの配列および値の配列として受け取ります。


古いソリューション:

29 26バイト

v\k=values(Dict(zip(k,v)))

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

ラムダの代わりに演算子構文を使用する-3バイト

入力を値の配列およびキーの配列として受け取ります。


1

MATL、9バイト

viiQ(5Mu)

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

おそらく準最適ですが、ちょっと、うまくいきます!

(a)入力には負でない整数のみが含まれることが保証されているという事実を使用します。(b)MATLは、存在しないインデックスに割り当てようとする配列を拡張します。

v -スタックに空の配列を作成します

i -値の配列を取得

iQ -キーの配列を取得し、1ずつインクリメントします(MATLインデックスは1ベースであるため、最小値は0ではなく1です)。

( -割り当てインデックス-キーの配列をインデックスとして使用し、それらのインデックスに値を割り当てます(キーが繰り返される場合、最後の値のみがその場所に残ります)

5M -最後の呼び出しの最後の入力を取得します-これは、使用したインデックスの配列になります

u) -それらのインデックスの一意のリストを取り、そのリストでインデックスを付け、その結果(一意のキーの値のリスト)をスタックに残します


1

Japt24 20 16 8バイト

@Shaggyのおかげで-4バイト

入力をとる key, values

â £VgUbX

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


Japt20 18バイト

r@bY <Z?X:XpVgY}[]

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


1
これをさらに進めるのに役立ついくつかの簡単なヒント/ヒント:1入力を逆にして2、Unicodeのショートカットを確認してください。
Shaggy

おかげで@Shaggy私はまだドキュメントからすべてのメソッドを読んでいて、適応しようとしています。私はこれをさらに数時間でゴルフします
Luis felipe De jesus Munoz

試してみたい場合は、8バイトの解決策があります。
シャギー

代わりにm@A?B:C} k¥B、あなたは試してみたいかもしれませんk@A} m@C:-)
ETHproductions



0

Perl 6、25バイト

{.unique(:as(*[1]))[*;0]}

それを試してみてください

拡張:

{  # bare block lambda with implicit parameter $_

  .unique(  # find the unique results (implicit method call on $_)

    :as(    # use this code to compare
      *[1]  # the second value (WhateverCode lambda)
    )

  )[        # index into that
    *;      # all in the top level
    0       # only the first value from each
  ]
}

よくやった。私はいつものPerl 6の簡潔さにショックを受けています
ヤコブ

0

C-Sharp、63バイト

object _(int[][]p)=>p.GroupBy(i=>i[1]).Select(g=>g.First()[0]);

整数の列挙可能なものを返します。




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