Encuentra elementos únicos basados ​​en una clave dada

8

Entrada

Tome una lista de valores x i cada uno emparejado con una clave y i .

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

Salida

Devuelve una lista L que contiene solo valores del conjunto { x i }.

  • La longitud de L debe ser igual al número de claves únicas k en el conjunto { y i }.
  • Para cada clave única k debe haber un valor de { x i } que tenga la clave k .

Detalles

  • Lagunas estándar no permitidas.
  • Puede suponer que todos los valores en la entrada serán enteros no negativos.
  • Puede haber valores y claves duplicados.
  • Puede suponer que hay al menos un par valor / clave en la entrada.
  • Si prefiere tomar dos listas de igual longitud como entrada (una para valores, otra para claves), está bien.
  • No puede tomar ninguna otra entrada.
  • El orden de la lista que genera no importa.
  • La x i que elija para cada tecla no importa.

Por ejemplo, la entrada [[0, 0], [1, 3], [2, 3]]se puede devolver cualquiera [0, 1]o [0, 2]o cualquier permutación de estos.

Ejemplos

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

Pocos bytes ganan.

dylnan
fuente
¿Puedo tomar entrada en el formulario key value key value key value ...?
wastl
@wastl Sí puedes
dylnan
¿Qué sucede si su idioma no es compatible con los mapas que contienen los mismos keys? ¿Podemos tomar dos matrices como keysy valuescomo entrada? ¿O crear nuestro propio mapa personalizado que toma múltiples valores como entrada (o tal vez una lista de pares clave-valor)?
Kevin Cruijssen
1
@KevinCruijssen If you prefer to take two lists of equal length as input that is fine.¿Es esto lo que quieres decir? No sé a qué te refieres con "Mapas".
dylnan
@dylnan Ah, eso fue lo que quise decir, gracias. Lee más allá. Y "mapas" es el término para pares clave-valor en Java, no estoy seguro si se llama de manera diferente en otros idiomas.
Kevin Cruijssen

Respuestas:

4

Python 2 , 34 bytes

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

Pruébalo en línea!

Toma entrada como lista de valores y lista de claves.
Genere diccionario, intercambiando claves y valores, que deja solo valores y únicos. Devuelve todos los valores de x correspondientes

Zarigüeya muerta
fuente
1
Puede guardar 3 bytes si invierte el orden de los argumentos de entrada (la pregunta no prescribe un orden específico) y los toma y pasa como argumentos variados
David Foerster
4

Jalea , 2 bytes

Ḣƙ

Pruébalo en línea!

Toma dos listas de igual longitud, primero son las claves, segundo son los valores.

Erik el Outgolfer
fuente
4

J , 4 bytes

{./.

¿Cómo?

El argumento de la izquierda xes una lista de claves, la correcta y, una lista de valores

/.grupos de yacuerdox

{. toma el primer elemento de cada grupo

Pruébalo en línea!

Galen Ivanov
fuente
3

Clojure, 20 18 bytes

(comp vals zipmap)

Esto toma listas de valores y claves como argumentos, en ese orden.

NikoNyrh
fuente
2

Haskell , 49 47 bytes

map fst.nubBy((.snd).(==).snd)
import Data.List

Pruébalo en línea! Entrada como una lista de tuplas, por ejemplo [(1, 2), (3, 2), (3, 0)].


Entrada como lista de listas (49 bytes)

map(!!0).nubBy(\a b->a!!1==b!!1)
import Data.List

Pruébalo en línea!

Laikoni
fuente
2

JavaScript (ES8), 43 bytes

Toma la entrada como 2 listas distintas en la sintaxis de curry (values)(keys).

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

Pruébalo en línea!

Arnauld
fuente
Lección de JavaScript de hoy: las funciones son matrices.
Jakob
@Jakob Más precisamente, las funciones son objetos. Al final del primer caso de prueba, o parece { [Function: o] '0': 1, '2': 1 }.
Arnauld
2

Casco , 4 bytes

ṁhüt

Pruébalo en línea!

¿Cómo?

--hüt - Programa completo. 
  üt - Agrupar por cola (las listas sin el primer elemento).
ṁh - Cabezas de mapa (las listas sin el último elemento) y concatenar los resultados.
Sr. Xcoder
fuente
2

Stax , 5 bytes

╠HB%§

Ejecutar y depurarlo

Toma dos matrices, primero valores, luego claves.

Explicación:

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

Japt , 8 bytes

â £VgUbX

Intérprete Japt

Gracias a Shaggy por guardar 1 último byte

Completamente reelaborado la lógica. Toma algunas pistas de la respuesta de Luis, pero creo que todavía ha mejorado. Ahora toma la entrada como dos listas, keys, values. Aparentemente todavía estoy por debajo de lo óptimo.

Explicación:

â £         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
fuente
12 bytes . Es posible que pueda guardar unos pocos bytes tomando las claves y los valores como entradas separadas.
Shaggy
Hay una solución de 8 bytes si quieres probarla.
Shaggy
No ¥es necesario;)
Shaggy
@Shaggy De hecho! Me había estado preguntando cuál era la diferencia entre las sobrecargas de b, no noté en absoluto que solo uno de ellos tomaba una función.
Kamil Drakari
Y esa es la 8 solución que tenía en mente ahora, bien hecha. Incidendtally, que podría revertir las entradas y todavía sería de 8 bytes: Vâ £gVbX.
Shaggy
1

Rubí , 27 bytes

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

Pruébalo en línea!

Toma datos como dos matrices (el pie de página transforma los casos de prueba originales en este formato).

Kirill L.
fuente
1

05AB1E , 4 bytes

DÙkè

Tome dos listas de entrada: primero los valores, luego las claves.

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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

Java 8, 82 bytes

Una lambda de una corriente de int[]pares a java.util.Collection<Integer>.

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

Pruébalo en línea

Jakob
fuente
1

Julia 0.6 , 36 34 32 bytes

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

Pruébalo en línea!

(recortado dos bytes gracias a @JonathanFrech)
(otros dos bytes reemplazando con =comprensión)

El formato de entrada especificado en la pregunta [[1, 2], [2, 7]]funciona como lo es en Julia como una matriz de matrices que contienen pares de valores de clave (potenciales), lo único que hay que tener en cuenta es que la clave ocupa el segundo lugar y el valor primero.


Ligero cambio, para el mismo bytecount,

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

Pruébalo en línea!

sundar - Restablece a Monica
fuente
Bienvenido a PPCG! No estoy familiarizado de ninguna manera con Julia, pero me parece que puede eliminar dos bytes eliminando ambos corchetes.
Jonathan Frech
Gracias. Asumí que los corchetes siempre eran necesarios para la comprensión, pero parece que son opcionales cuando se usan como argumento. ¡Buena sugerencia, especialmente para un usuario que no es de Julia! :)
sundar - Restablecer Monica
1
Supongo que es una especie de comprensión de tuplas (proveniente de Python). Como consejo general, TIO tiene un asistente de copia que le permite componer fácilmente un envío PPCG (el icono de enlace en la esquina superior derecha evita problemas como el espacio inicial en su publicación actual). Con pequeños campos de golf como el mío no es absolutamente necesario, pero generalmente recomendaría acreditar las mejoras de otros usuarios.
Jonathan Frech
Ah, me preguntaba cómo las presentaciones de todos estaban en un formato uniforme, si había alguna herramienta de automatización que no conociera. Yo estaba usando el icono de enlace, pero con pereza deje de moverse en el uno de rebajas, y no nos dimos cuenta que había una específicamente para PPCG. (Y señaló sobre la parte de acreditación, lo hará.)
Sundar - Restablecer Mónica
1

Julia 0.6 , 29 26 19 bytes

valuesDictzip

Pruébalo en línea!

Estilo sin puntos. Toma datos como una matriz de claves y una matriz de valores.


Solución anterior:

29 26 bytes

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

Pruébalo en línea!

-3 bytes usando la sintaxis del operador en lugar de lambda

Toma datos como una matriz de valores y una matriz de claves.

sundar - Restablece a Monica
fuente
1

MATL , 9 bytes

viiQ(5Mu)

Pruébalo en línea!

Probablemente subóptimo, pero bueno, ¡funciona!

Utiliza los hechos de que (a) se garantiza que la entrada solo tiene enteros no negativos, (b) MATL extiende una matriz de intentos de asignar a un índice que no existe.

v - crear una matriz vacía en la pila

i - obtener una matriz de valores

iQ - obtenga una matriz de claves, incremente en 1 (por lo que el valor mínimo es 1, no 0, ya que la indexación MATL se basa en 1)

( - indexación de asignación: use la matriz de claves como índices y asigne los valores a esos índices (si alguna tecla se repite, solo el último valor permanece en esa ubicación)

5M - obtiene la última entrada de la última llamada - que sería la matriz de índices que utilizamos

u) - tome una lista única de esos índices, indexe con esa lista y deje ese resultado (que es una lista de valores de claves únicas) en la pila

sundar - Restablece a Monica
fuente
1

Japt , 24 20 16 8 bytes

-4 bytes gracias a @Shaggy

Toma entrada como key, values

â £VgUbX

Pruébalo en línea!


Japt , 20 18 bytes

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

Pruébalo en línea!

Luis felipe De jesus Munoz
fuente
1
Algunos consejos / sugerencias rápidas para ayudarlo a seguir 1jugando golf: invierta las entradas, 2verifique los accesos directos de Unicode.
Shaggy
Gracias @ Shaggy Todavía estoy leyendo todos los métodos de los documentos y estoy tratando de adaptarme. Jugaré golf aún más en un par de horas
Luis felipe De jesus Munoz
Hay una solución de 8 bytes si quieres probarla.
Shaggy
En lugar de m@A?B:C} k¥B, es posible que desee probar k@A} m@C:-)
ETHproductions
0

Perl 5 -pa , 24 bytes

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

Pruébalo en línea!

Toma entrada en el formato key value key value key value .... El pie de página de TIO es solo para separar los casos de prueba.

wastl
fuente
0

Perl 6 , 25 bytes

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

Intentalo

Expandido:

{  # 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
fuente
Bien hecho. Siempre me sorprende la concisión de Perl 6.
Jakob
0

C-Sharp, 63 bytes

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

Devuelve un enumerable de enteros.

LHHuman
fuente
0

Óxido , 81 bytes

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

Pruébalo en línea!

Toma dos iteradores, devuelve un iterador.

Konrad Borowski
fuente
0

Perl 6 , 12 bytes

{%$_.values}

Pruébalo en línea!

Convierte la lista dada en un hash y luego devuelve los valores. Esto funciona tanto en una lista de pares como en una lista de key, value, key, value....

Jo King
fuente