Finden Sie eindeutige Elemente basierend auf einem bestimmten Schlüssel

8

Eingang

Nehmen Sie eine Liste von Werten x i, die jeweils mit einem Schlüssel y i gepaart sind .

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

Ausgabe

Gibt eine Liste L zurück, die nur Werte aus der Menge { x i } enthält.

  • Die Länge von L muss gleich der Anzahl der eindeutigen Schlüssel k in der Menge { y i } sein.
  • Für jeden eindeutigen Schlüssel k muss ein Wert aus { x i } mit dem Schlüssel k vorhanden sein .

Einzelheiten

  • Standardlücken nicht zulässig.
  • Sie können davon ausgehen, dass alle Werte in der Eingabe nicht negative Ganzzahlen sind.
  • Möglicherweise sind doppelte Werte und Schlüssel vorhanden.
  • Sie können davon ausgehen, dass die Eingabe mindestens ein Wert / Schlüssel-Paar enthält.
  • Wenn Sie lieber zwei Listen gleicher Länge als Eingabe verwenden möchten (eine für Werte, eine für Schlüssel), ist dies in Ordnung.
  • Sie dürfen keine anderen Eingaben vornehmen.
  • Die Reihenfolge der von Ihnen ausgegebenen Liste spielt keine Rolle.
  • Das x i, das Sie für jeden Schlüssel auswählen, spielt keine Rolle.

Zum Beispiel mit Eingang [[0, 0], [1, 3], [2, 3]]können Sie zurückkommen entweder [0, 1]oder [0, 2]oder eine beliebige Permutation davon.

Beispiele

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

Wenig Bytes gewinnen.

Dylnan
quelle
Kann ich Eingaben in das Formular machen key value key value key value ...?
Wastl
@wastl Ja, Sie können
Dylnan
Was ist, wenn Ihre Sprache keine Karten unterstützt, die dieselben keys enthalten? Können wir zwei Arrays als keysund valuesals Eingabe nehmen? Oder erstellen Sie eine eigene benutzerdefinierte Map, die mehrere Werte als Eingabe verwendet (oder eine Liste von Schlüssel-Wert-Paaren)?
Kevin Cruijssen
1
@ KevinCruijssen If you prefer to take two lists of equal length as input that is fine.Ist das was du meinst? Ich weiß nicht, was du mit "Karten" meinst.
Dylnan
@dylnan Ah, das habe ich wirklich gemeint, danke. Lesen Sie daran vorbei. Und "Maps" ist der Begriff für Schlüssel-Wert-Paare in Java, nicht sicher, ob er in anderen Sprachen anders aufgerufen wird.
Kevin Cruijssen

Antworten:

4

Python 2 , 34 Bytes

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

Probieren Sie es online aus!

Nimmt die Eingabe als Werteliste und Schlüsselliste entgegen.
Generieren Sie ein Wörterbuch, tauschen Sie Schlüssel und Werte aus, sodass nur eindeutige y-Werte übrig bleiben. Gibt alle entsprechenden x-Werte zurück

Totes Opossum
quelle
1
Sie können 3 Bytes speichern, wenn Sie die Reihenfolge der Eingabeargumente umkehren (die Frage schreibt keine bestimmte Reihenfolge vor) und diese als variable Argumente annehmen und übergeben: tio.run/##K6gsycjPM/…
David Foerster
4

Gelee , 2 Bytes

Ḣƙ

Probieren Sie es online aus!

Nimmt zwei Listen gleicher Länge, erstens sind Schlüssel, zweitens sind Werte.

Erik der Outgolfer
quelle
4

J , 4 Bytes

{./.

Wie?

Das linke Argument xist eine Liste von Schlüsseln, das rechte yeine Liste von Werten

/.Gruppen ynachx

{. nimmt das erste Element jeder Gruppe

Probieren Sie es online aus!

Galen Ivanov
quelle
3

Clojure, 20 18 Bytes

(comp vals zipmap)

Dies verwendet Listen von Werten und Schlüsseln als Argumente in dieser Reihenfolge.

NikoNyrh
quelle
2

JavaScript (ES8), 43 Byte

Nimmt die Eingabe als 2 verschiedene Listen in der Curry-Syntax auf (values)(keys).

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

Probieren Sie es online aus!

Arnauld
quelle
Die heutige JavaScript-Lektion: Funktionen sind Arrays.
Jakob
@ Jakob Genauer gesagt sind Funktionen Objekte. Am Ende des ersten Testfalls sieht o so aus { [Function: o] '0': 1, '2': 1 }.
Arnauld
2

Schale , 4 Bytes

ṁhüt

Probieren Sie es online aus!

Wie?

ṁhüt - Vollständiges Programm. 
  üt - Nach Schwanz gruppieren (die Listen ohne das erste Element).
ṁh - Ordnen Sie die Köpfe (die Listen ohne das letzte Element) zu und verketten Sie die Ergebnisse.
Mr. Xcoder
quelle
2

Stax , 5 Bytes

╠HB%§

Führen Sie es aus und debuggen Sie es

Nimmt zwei Arrays, zuerst Werte, dann Schlüssel.

Erläuterung:

cu:I@J Full program, unpacked
cu     Push a unique copy of the keys.
  :I   Indices of the unique elements
    @  Index the values array
     J Join by space
       Implicit output
wastl
quelle
2

Japt , 8 Bytes

â £VgUbX

Japt Interpreter

Vielen Dank an Shaggy für das Speichern von 1 letzten Byte

Die Logik wurde komplett überarbeitet. Nimmt einige Hinweise aus Luis 'Antwort, aber ich denke, es ist immer noch verbessert. Nimmt nun die Eingabe als zwei Listen , keys, values. Anscheinend bin ich immer noch nicht optimal.

Erläuterung:

â £         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
Kamil Drakari
quelle
12 Bytes . Möglicherweise können Sie einige Bytes speichern, indem Sie die Schlüssel und Werte als separate Eingaben verwenden.
Shaggy
Es gibt eine 8-Byte-Lösung, wenn Sie es versuchen möchten.
Shaggy
Das ¥wird nicht benötigt;)
Shaggy
@ Shaggy In der Tat! Ich hatte mich gefragt, was der Unterschied zwischen den Überlastungen von bwar, bemerkte überhaupt nicht, dass nur einer von ihnen eine Funktion übernahm.
Kamil Drakari
Und das ist die 8 Lösung, an die ich jetzt gedacht hatte, gut gemacht. Übrigens könnten Sie die Eingaben umkehren und es wären immer noch 8 Bytes : Vâ £gVbX.
Shaggy
1

Ruby , 27 Bytes

->a,b{b.zip(a).to_h.values}

Probieren Sie es online aus!

Nimmt die Eingabe als zwei Arrays auf (die Fußzeile wandelt die ursprünglichen Testfälle in dieses Format um).

Kirill L.
quelle
1

05AB1E , 4 Bytes

DÙkè

Nehmen Sie zwei Eingabelisten: zuerst die Werte, dann die Tasten.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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]
Kevin Cruijssen
quelle
1

Java 8, 82 Bytes

Ein Lambda aus einem Strom von int[]Paaren zu java.util.Collection<Integer>.

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

Probieren Sie es online aus

Jakob
quelle
1

Julia 0,6 , 36 34 32 Bytes

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

Probieren Sie es online aus!

(zwei Bytes dank @JonathanFrech rasiert)
(weitere zwei Bytes durch Ersetzen durch =im Verständnis)

Das in der Frage angegebene Eingabeformat [[1, 2], [2, 7]]funktioniert wie in Julia als Array von Arrays mit (potenziellen) Schlüsselwertpaaren. Das einzige, worauf Sie achten müssen, ist, dass der Schlüssel an zweiter Stelle und der Wert an erster Stelle steht.


Leichte Änderung bei gleicher Anzahl von Bytes,

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

Probieren Sie es online aus!

Sundar - Monica wieder einsetzen
quelle
Willkommen bei PPCG! Ich bin mit Julia in keiner Weise vertraut, aber es scheint mir, dass Sie möglicherweise zwei Bytes rasieren können, indem Sie beide eckigen Klammern entfernen.
Jonathan Frech
Vielen Dank. Ich hatte angenommen, dass die Klammern für das Verständnis immer notwendig sind, aber sie scheinen optional zu sein, wenn sie als Argument verwendet werden. Guter Vorschlag, besonders für einen Nicht-Julia-Benutzer! :)
Sundar - Wiedereinsetzung Monica
1
Ich gehe davon aus, dass es sich um eine Art Tupelverständnis handelt (das aus Python stammt). Als allgemeinen Tipp verfügt TIO über einen Kopierassistenten, mit dem Sie auf einfache Weise eine PPCG-Übermittlung erstellen können (Link-Symbol in der oberen rechten Ecke, umgeht Probleme wie das führende Leerzeichen in Ihrem aktuellen Beitrag). Bei kleinen Golfplätzen wie meinem ist dies nicht unbedingt erforderlich, aber im Allgemeinen würde ich empfehlen, Golfverbesserungen von anderen Benutzern zu würdigen.
Jonathan Frech
Ah, ich habe mich nur gefragt, wie alle Einsendungen in einem einheitlichen Format waren, ob es ein Automatisierungstool gab, von dem ich nichts wusste. Ich wurde mit dem Link - Symbol, aber träge blieb an der Markdown eines Scrollen, und wusste nicht, gab es einen speziell für PPCG. (Und über den Gutschriftsteil vermerkt, wird tun.)
Sundar - Reinstate Monica
1

Julia 0,6 , 29 26 19 Bytes

valuesDictzip

Probieren Sie es online aus!

Punktfreier Stil. Nimmt die Eingabe als Array von Schlüsseln und als Array von Werten auf.


Ältere Lösung:

29 26 Bytes

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

Probieren Sie es online aus!

-3 Bytes mit Operatorsyntax anstelle von Lambda

Nimmt die Eingabe als Array von Werten und als Array von Schlüsseln auf.

Sundar - Monica wieder einsetzen
quelle
1

MATL , 9 Bytes

viiQ(5Mu)

Probieren Sie es online aus!

Wahrscheinlich suboptimal, aber hey, es funktioniert!

Verwendet die Fakten, dass (a) Eingaben garantiert nur nicht negative Ganzzahlen enthalten. (B) MATL erweitert ein Array, das Sie versuchen, einem nicht vorhandenen Index zuzuweisen.

v - Erstellen Sie ein leeres Array im Stapel

i - Array von Werten erhalten

iQ - Array von Schlüsseln abrufen, um 1 erhöhen (der Mindestwert ist also 1, nicht 0, da die MATL-Indizierung auf 1 basiert)

( - Zuweisungsindizierung - Verwenden Sie das Array von Schlüsseln als Indizes und weisen Sie diesen Indizes die Werte zu (wenn Schlüssel wiederholt werden, verbleibt nur der letzte Wert an dieser Stelle).

5M - Ruft die letzte Eingabe des letzten Aufrufs ab. Dies ist das Array der von uns verwendeten Indizes

u) - Nehmen Sie eine eindeutige Liste dieser Indizes, indizieren Sie mit dieser Liste und belassen Sie das Ergebnis (eine Liste mit Werten eindeutiger Schlüssel) im Stapel

Sundar - Monica wieder einsetzen
quelle
1

Japt , 24 20 16 8 Bytes

-4 Bytes dank @Shaggy

Nimmt Eingabe als key, values

â £VgUbX

Probieren Sie es online aus!


Japt , 20 18 Bytes

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

Probieren Sie es online aus!

Luis felipe De jesus Munoz
quelle
1
Ein paar schnelle Tipps / Hinweise, die Ihnen dabei helfen, weiter zu spielen: 1Umkehren der Eingaben, 2Überprüfen Sie die Unicode-Verknüpfungen.
Shaggy
Danke @Shaggy Ich lese immer noch alle Methoden aus den Dokumenten und versuche mich anzupassen. Ich werde dies in ein paar Stunden noch mehr Golf spielen
Luis Felipe De Jesus Munoz
Es gibt eine 8-Byte-Lösung, wenn Sie es versuchen möchten.
Shaggy
Stattdessen m@A?B:C} k¥Bmöchten Sie vielleicht versuchen k@A} m@C:-)
ETHproductions
0

Perl 5 -pa , 24 Bytes

%a=@F;$_=join$/,values%a

Probieren Sie es online aus!

Nimmt Eingaben im Format vor key value key value key value .... Die TIO-Fußzeile dient nur zur Trennung von Testfällen.

wastl
quelle
0

Perl 6 , 25 Bytes

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

Versuch es

Erweitert:

{  # 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
  ]
}
Brad Gilbert b2gills
quelle
Gut gemacht. Ich bin immer schockiert von der Prägnanz von Perl 6.
Jakob
0

C-Sharp, 63 Bytes

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

Gibt eine Aufzählung von Ganzzahlen zurück.

LHHuman
quelle
0

Rost , 81 Bytes

|a,b|b.zip(a).collect::<std::collections::HashMap<_,_>>().into_iter().map(|v|v.1)

Probieren Sie es online aus!

Nimmt zwei Iteratoren und gibt einen Iterator zurück.

Konrad Borowski
quelle
0

Perl 6 , 12 Bytes

{%$_.values}

Probieren Sie es online aus!

Erzwingt die angegebene Liste zu einem Hash und gibt dann die Werte zurück. Dies funktioniert sowohl für eine Liste von Paaren als auch für eine Liste von key, value, key, value....

Scherzen
quelle