Encontre elementos exclusivos com base em uma determinada chave


8

Entrada

Faça uma lista dos valores x i cada um emparelhado com uma tecla y i .

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

Resultado

Retorne uma lista L contendo apenas valores do conjunto { x i }.

  • O comprimento de L deve ser igual ao número de chaves exclusivas k no conjunto { y i }.
  • Para cada chave exclusiva k , deve haver um valor de { x i } que tenha a chave k .

Detalhes

  • Lacunas padrão não permitidas.
  • Você pode assumir que todos os valores na entrada serão números inteiros não negativos.
  • Pode haver valores e chaves duplicados.
  • Você pode assumir que há pelo menos um par de valor / chave na entrada.
  • Se você preferir usar duas listas de tamanho igual como entrada (uma para valores e outra para chaves), tudo bem.
  • Você não pode receber nenhuma outra entrada.
  • A ordem da lista que você produz não importa.
  • O x i que você escolher para cada chave não importa.

Por exemplo, com a entrada [[0, 0], [1, 3], [2, 3]]você pode retornar tanto [0, 1]ou [0, 2]ou qualquer permutação destes.

Exemplos

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

Menos bytes ganha.


Posso receber informações no formulário key value key value key value ...?
Wastl

@wastl Sim, você pode
dylnan

E se o seu idioma não suportar mapas que contenham os mesmos keys? Podemos pegar duas matrizes como keyse valuescomo entrada? Ou crie nosso próprio mapa personalizado que aceita vários valores como entrada (ou talvez uma lista de pares de valores-chave)?
Kevin Cruijssen 06/06/19

1
@KevinCruijssen If you prefer to take two lists of equal length as input that is fine.É isso que você quer dizer? Não sei o que você quer dizer com "Maps".
dylnan

@ Dylnan Ah, isso foi realmente o que eu quis dizer, obrigado. Leia além disso. E "mapas" é o termo para pares de valores-chave em Java, não tenho certeza se é chamado de maneira diferente em outras linguagens.
Kevin Cruijssen 06/06/19

Respostas:


4

Python 2 , 34 bytes

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

Experimente online!

Recebe a entrada como lista de valores e lista de chaves.
Gere dicionário, trocando chaves e valores, o que deixa apenas valores y únicos. Retornar todos os valores x correspondentes


1
Você pode salvar 3 bytes se você inverter a ordem dos argumentos de entrada (a questão não prescreve uma ordem específica) e tomar e passá-las como argumentos variádicos: tio.run/##K6gsycjPM/...
David Foerster


4

J , 4 bytes

{./.

Quão?

O argumento da esquerda xé uma lista de chaves, a correta y- uma lista de valores

/.grupos de yacordox

{. pega o primeiro elemento de cada grupo

Experimente online!


3

Clojure, 20 18 bytes

(comp vals zipmap)

Isso leva listas de valores e chaves como argumentos, nessa ordem.




2

JavaScript (ES8), 43 bytes

Recebe entrada como 2 listas distintas na sintaxe de currying (values)(keys).

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

Experimente online!


Lição de JavaScript de hoje: funções são matrizes.
Jakob

@Jakob Mais precisamente, funções são objetos. No final do primeiro caso de teste, o parece { [Function: o] '0': 1, '2': 1 }.
Arnauld

2

Casca , 4 bytes

ṁhüt

Experimente online!

Quão?

ühüt - Programa completo. 
  üt - Agrupe por cauda (as listas sem o primeiro elemento).
--h - Mapeie os cabeçalhos (as listas sem o último elemento) e concatene os resultados.

2

Stax , 5 bytes

╠HB%§

Execute e depure

Leva duas matrizes, primeiro valores e depois chaves.

Explicação:

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


2

Japonês , 8 bytes

â £VgUbX

Intérprete Japt

Obrigado a Shaggy por salvar 1 último byte

Completamente reformulada a lógica. Toma algumas pistas da resposta de Luis, mas acho que ainda está melhorada. Agora recebe a entrada como duas listas keys, values,. Aparentemente, ainda estou aquém do ideal.

Explicação:

â £         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 bytes . Você pode salvar alguns bytes, tomando as chaves e os valores como entradas separadas.
Shaggy

Existe uma solução de 8 bytes, se você quiser tentar.
Shaggy

O que ¥não é necessário;) #
1138 Shaggy

@Shaggy Indeed! Eu estava imaginando qual seria a diferença entre as sobrecargas b, e nem percebi que apenas uma delas fazia uma função.
Kamil Drakari 06/07/19

E essa é a solução que eu tinha em mente agora, bem feita. Incidendtally, você poderia inverter as entradas e ainda seria 8 bytes: Vâ £gVbX.
Shaggy


1

05AB1E , 4 bytes

DÙkè

Tome duas listas de entrada: primeiro os valores e depois as teclas.

Experimente online ou verifique todos os casos de teste .

Explicação:

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 bytes

Um lambda de um fluxo de int[]pares para java.util.Collection<Integer>.

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

Experimente Online


1

Julia 0.6 , 36 34 32 bytes

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

Experimente online!

(eliminou dois bytes graças a @JonathanFrech)
(outros dois bytes substituindo por =em compreensão)

O formato de entrada especificado na pergunta [[1, 2], [2, 7]] funciona como em Julia como uma matriz de matrizes contendo pares de valores-chave (potenciais), a única coisa a se cuidar é que a chave fique em segundo e o valor em primeiro lugar.


Pequenas alterações, pelo mesmo número anterior,

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

Experimente online!


Bem-vindo ao PPCG! Não estou familiarizado com Julia, mas parece-me que você pode cortar dois bytes removendo os dois colchetes.
Jonathan Frech

Obrigado. Eu tinha assumido que os colchetes sempre eram necessários para a compreensão, mas parece que eles são opcionais quando usados ​​como argumento. Boa sugestão, especialmente para um usuário que não seja Julia! :)
sundar - Restabelece Monica 6/06/06

1
Estou assumindo que é algum tipo de compreensão da tupla (proveniente do Python). Como dica geral, o TIO possui um assistente de cópia que permite compor facilmente um envio PPCG (ícone de link no canto superior direito, contorna problemas como o espaço à esquerda na sua postagem atual). Com pequenos golfe como o meu, não é absolutamente necessário, mas geralmente aconselho a creditar melhorias no golfe de outros usuários.
Jonathan Frech

Ah, eu estava me perguntando como os envios de todos estavam em um formato uniforme, se havia alguma ferramenta de automação que eu não conhecia. Eu estava usando o ícone do link, mas preguiçosamente parou de rolar no Markdown e não percebi que havia um especificamente para o PPCG. (E anotado sobre a parte do crédito, servirá.)
sundar - Restabelece Monica 6/06/06


1

MATL , 9 bytes

viiQ(5Mu)

Experimente online!

Provavelmente abaixo do ideal, mas ei, funciona!

Usa os fatos de que (a) a entrada é garantida como tendo números inteiros não negativos, (b) o MATL estende uma matriz que você tenta atribuir a um índice que não existe.

v - crie uma matriz vazia na pilha

i - obter matriz de valores

iQ - obtém uma matriz de chaves, incrementa em 1 (então o valor mínimo é 1, não 0, pois a indexação MATL é baseada em 1)

( - indexação de atribuição - use a matriz de chaves como índices e atribua os valores a esses índices (se alguma tecla for repetida, apenas o último valor permanecerá nesse local)

5M - obtém a última entrada da última chamada - que seria a matriz de índices que usamos

u) - pegue uma lista exclusiva desses índices, indexe com essa lista e deixe esse resultado (que é uma lista de valores de chaves exclusivas) na pilha


1

Japt , 24 20 16 8 bytes

-4 bytes graças a @Shaggy

Aceita entrada como key, values

â £VgUbX

Experimente online!


Japonês , 20 18 bytes

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

Experimente online!


1
Algumas dicas / sugestões rápidas para ajudá-lo a jogar ainda mais: 1Inverta as entradas, 2verifique os atalhos Unicode.
Shaggy

Obrigado @Shaggy Eu ainda estou lendo todos os métodos dos documentos e estou tentando me adaptar. Vou jogar isso ainda mais em algumas horas #
Luis felipe De jesus Munoz

Existe uma solução de 8 bytes, se você quiser tentar.
Shaggy

Em vez de m@A?B:C} k¥B, você pode querer tentar k@A} m@C:-)
ETHproductions


0

Perl 5 -pa , 24 bytes

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

Experimente online!

Recebe entrada no formato key value key value key value .... O rodapé do TIO serve apenas para separar os casos de teste.


0

Perl 6 , 25 bytes

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

Tente

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

Bem feito. Estou sempre chocado com a concisão do Perl 6.
Jakob

0

C-Sharp, 63 bytes

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

Retorna um enumerável de números inteiros.




0

Perl 6 , 12 bytes

{%$_.values}

Experimente online!

Coercifica a lista fornecida em um Hash e, em seguida, retorna os valores. Isso funciona tanto em uma lista de pares quanto em uma lista de key, value, key, value....

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.