Temukan elemen unik berdasarkan kunci yang diberikan

8

Memasukkan

Ambil daftar nilai x i masing-masing dipasangkan dengan kunci y i .

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

Keluaran

Kembalikan daftar L yang hanya berisi nilai dari set { x i }.

  • Panjang L harus sama dengan jumlah kunci unik k pada set { y i }.
  • Untuk setiap kunci unik k, harus ada nilai dari { x i } yang memiliki kunci k .

Detail

  • Celah standar tidak diijinkan.
  • Anda dapat mengasumsikan semua nilai dalam input adalah bilangan bulat tidak negatif.
  • Mungkin ada nilai dan kunci duplikat.
  • Anda dapat mengasumsikan setidaknya ada satu pasangan nilai / kunci dalam input.
  • Jika Anda memilih untuk mengambil dua daftar dengan panjang yang sama sebagai input (satu untuk nilai, satu untuk kunci) itu baik-baik saja.
  • Anda tidak boleh mengambil input lain apa pun.
  • Urutan daftar yang Anda hasilkan tidak masalah.
  • The x i yang Anda pilih untuk setiap tombol tidak masalah.

Misalnya, dengan input [[0, 0], [1, 3], [2, 3]]Anda dapat mengembalikan salah satu [0, 1]atau[0, 2] atau permutasi ini.

Contohnya

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

Bytes paling sedikit menang.

dylnan
sumber
Bisakah saya mengambil input dalam formulir key value key value key value ...?
wastl
@wastl Ya Anda bisa
dylnan
Bagaimana jika bahasa Anda tidak mendukung Maps yang mengandung yang sama key? Bisakah kita mengambil dua array sebagai keysdan valuessebagai input? Atau buat Peta khusus kami sendiri yang mengambil banyak nilai sebagai input (atau mungkin daftar pasangan nilai kunci)?
Kevin Cruijssen
1
@KevinCruijssen If you prefer to take two lists of equal length as input that is fine.Apakah ini yang Anda maksud? Saya tidak tahu maksud Anda tentang "Maps".
dylnan
@ Dylnan Ah, memang itulah yang saya maksudkan, terima kasih. Baca melewatinya. Dan "peta" adalah istilah untuk pasangan nilai kunci di Jawa, tidak yakin apakah itu disebut berbeda dalam bahasa lain.
Kevin Cruijssen

Jawaban:

4

Python 2 , 34 byte

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

Cobalah online!

Mengambil input sebagai daftar nilai dan daftar kunci.
Hasilkan kamus, bertukar kunci dan nilai, yang hanya menyisakan nilai y unik. Kembalikan semua nilai x yang sesuai

Possum Mati
sumber
1
Anda dapat menyimpan 3 byte jika Anda membalik urutan argumen input (pertanyaan tidak menentukan urutan tertentu) dan mengambil dan meneruskannya sebagai argumen variadik
David Foerster
4

Jelly , 2 byte

Ḣƙ

Cobalah online!

Mengambil dua daftar dengan panjang yang sama, pertama adalah kunci, kedua adalah nilai.

Erik the Outgolfer
sumber
4

J , 4 byte

{./.

Bagaimana?

Argumen kiri xadalah daftar kunci, yang kanan y- daftar nilai

/.kelompok ymenurutx

{. mengambil elemen pertama dari setiap grup

Cobalah online!

Galen Ivanov
sumber
3

Clojure, 20 18 byte

(comp vals zipmap)

Ini mengambil daftar nilai dan kunci sebagai argumen, dalam urutan itu.

NikoNyrh
sumber
2

Haskell , 49 47 byte

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

Cobalah online! Masukan sebagai daftar tupel, mis [(1, 2), (3, 2), (3, 0)].


Input sebagai daftar daftar (49 byte)

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

Cobalah online!

Laikoni
sumber
2

JavaScript (ES8), 43 byte

Mengambil input sebagai 2 daftar berbeda dalam sintaks currying (values)(keys).

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

Cobalah online!

Arnauld
sumber
Pelajaran JavaScript hari ini: fungsi adalah array.
Jakob
@ Jakob Lebih tepatnya, fungsi adalah objek. Pada akhir kasus tes pertama, o terlihat seperti { [Function: o] '0': 1, '2': 1 }.
Arnauld
2

Sekam , 4 byte

ṁhüt

Cobalah online!

Bagaimana?

ṁhüt - Program lengkap. 
  üt - Kelompokkan dengan ekor (daftar tanpa elemen pertama).
ṁh - Memetakan kepala (daftar tanpa elemen terakhir) dan menggabungkan hasilnya.
Tuan Xcoder
sumber
2

Stax , 5 byte

╠HB%§

Jalankan dan debug itu

Membawa dua array, nilai pertama, lalu kunci.

Penjelasan:

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

R , 30 byte

function(x,y)x[!duplicated(y)]

Cobalah online!

ngm
sumber
2

Japt , 8 byte

â £VgUbX

Japt Interpreter

Terima kasih kepada Shaggy karena menyimpan 1 byte terakhir

Logika ulang sepenuhnya. Mengambil isyarat dari jawaban Luis, tapi saya pikir itu masih membaik. Sekarang mengambil input sebagai dua daftar keys, values,. Ternyata saya masih kurang optimal.

Penjelasan:

â £         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
sumber
12 byte . Anda mungkin dapat menyimpan beberapa byte dengan mengambil kunci & nilai sebagai input terpisah.
Shaggy
Ada solusi 8 byte jika Anda ingin mencobanya.
Shaggy
Itu ¥tidak diperlukan;)
Shaggy
@Shaggy Memang! Saya bertanya-tanya apa perbedaan antara kelebihan beban b, tidak menyadari sama sekali bahwa hanya satu dari mereka yang mengambil fungsi.
Kamil Drakari
Dan itulah 8 solusi yang ada dalam pikiran saya sekarang, dilakukan dengan baik. Incidendtally, Anda bisa membalikkan input dan masih akan menjadi 8 bytes: Vâ £gVbX.
Shaggy
1

Ruby , 27 byte

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

Cobalah online!

Mengambil input sebagai dua array (footer mengubah kasus uji asli ke dalam format ini).

Kirill L.
sumber
1

05AB1E , 4 byte

DÙkè

Ambil dua daftar input: pertama nilainya, lalu kunci.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Java 8, 82 byte

Lambda dari aliran int[]pasangan ke java.util.Collection<Integer>.

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

Cobalah secara Online

Jakob
sumber
1

Julia 0,6 , 36 34 32 byte

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

Cobalah online!

(mencukur dua byte berkat @JonathanFrech)
(dua byte lainnya dengan mengganti dengan =dalam pemahaman)

Format input yang ditentukan dalam pertanyaan [[1, 2], [2, 7]]berfungsi seperti halnya di Julia sebagai array array yang berisi pasangan nilai kunci (potensial), satu-satunya hal yang harus diperhatikan adalah bahwa kunci menjadi yang kedua dan nilai yang pertama.


Sedikit perubahan, untuk bytecount yang sama,

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

Cobalah online!

sundar - Pasang kembali Monica
sumber
Selamat datang di PPCG! Saya sama sekali tidak akrab dengan Julia, tetapi menurut saya Anda mungkin dapat mencukur dua byte dengan menghapus kedua kurung siku.
Jonathan Frech
Terima kasih. Saya berasumsi tanda kurung selalu diperlukan untuk pemahaman, tetapi tampaknya itu opsional jika digunakan sebagai argumen. Saran bagus, terutama untuk pengguna non-Julia! :)
sundar - Reinstate Monica
1
Saya menganggap itu semacam pemahaman tuple (berasal dari Python). Sebagai tip umum, TIO memiliki wizard penyalinan yang memungkinkan Anda untuk dengan mudah menyusun pengiriman PPCG (ikon tautan di sudut kanan atas, menghindari masalah seperti ruang utama di pos Anda saat ini). Dengan golf kecil seperti milik saya itu tidak mutlak diperlukan, tetapi umumnya saya akan menyarankan untuk menghargai peningkatan golf dari pengguna lain.
Jonathan Frech
Ah, saya hanya ingin tahu bagaimana kiriman semua orang dalam format yang seragam, apakah ada beberapa alat otomasi yang saya tidak tahu. Saya telah menggunakan link icon, tapi malas berhenti bergulir di satu penurunan harga, dan tidak menyadari ada satu khusus untuk PPCG. (Dan mencatat tentang bagian pengkreditan, akan dilakukan.)
sundar - Reinstate Monica
1

Julia 0,6 , 29 26 19 byte

valuesDictzip

Cobalah online!

Gaya bebas poin. Mengambil input sebagai array kunci dan array nilai.


Solusi yang lebih lama:

29 26 byte

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

Cobalah online!

-3 byte menggunakan sintaks operator bukan lambda

Mengambil input sebagai array nilai dan array kunci.

sundar - Pasang kembali Monica
sumber
1

MATL , 9 byte

viiQ(5Mu)

Cobalah online!

Mungkin suboptimal, tapi hei, itu berhasil!

Menggunakan fakta bahwa (a) input dijamin hanya memiliki bilangan bulat non-negatif, (b) MATL memperluas array yang Anda coba tetapkan ke indeks yang tidak ada.

v - buat array kosong di tumpukan

i - dapatkan berbagai nilai

iQ - dapatkan larik kunci, naik 1 (jadi nilai minimum adalah 1, bukan 0, karena pengindeksan MATL berbasis 1)

( - pengindeksan penugasan - gunakan array kunci sebagai indeks dan tetapkan nilai untuk indeks tersebut (jika ada kunci yang diulang, hanya nilai terakhir yang tersisa di lokasi itu)

5M - mendapatkan input terakhir dari panggilan terakhir - yang akan menjadi array indeks yang kami gunakan

u) - ambil daftar unik dari indeks tersebut, indeks dengan daftar itu, dan biarkan hasil itu (yang merupakan daftar nilai kunci unik) di tumpukan

sundar - Pasang kembali Monica
sumber
1

Japt , 24 20 16 8 byte

-4 byte terima kasih kepada @Shaggy

Mengambil input sebagai key, values

â £VgUbX

Cobalah online!


Japt , 20 18 byte

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

Cobalah online!

Luis felipe De jesus Munoz
sumber
1
Beberapa tips / petunjuk cepat untuk membantu Anda bermain golf ini lebih lanjut: 1Membalikkan input, 2Periksa pintasan Unicode.
Shaggy
Terima kasih @ Shaggy saya masih membaca semua metode dari dokumen dan mencoba beradaptasi. Saya akan bermain golf ini lebih banyak lagi dalam beberapa jam
Luis felipe De jesus Munoz
Ada solusi 8 byte jika Anda ingin mencobanya.
Shaggy
Alih-alih m@A?B:C} k¥B, Anda mungkin ingin mencoba k@A} m@C:-)
ETHproduk
0

Perl 5 -pa , 24 byte

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

Cobalah online!

Mengambil input dalam format key value key value key value .... Footer TIO hanya untuk memisahkan test case.

wastl
sumber
0

Perl 6 , 25 byte

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

Cobalah

Diperluas:

{  # 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
sumber
Sudah selesai dilakukan dengan baik. Saya selalu dikejutkan oleh keringkasan Perl 6.
Jakob
0

C-Sharp, 63 byte

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

Mengembalikan enumerable of integer.

Manusia
sumber
0

Karat , 81 byte

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

Cobalah online!

Membawa dua iterator, mengembalikan iterator.

Konrad Borowski
sumber
0

Perl 6 , 12 byte

{%$_.values}

Cobalah online!

Memaksa daftar yang diberikan ke Hash dan kemudian mengembalikan nilai. Ini berfungsi pada daftar pasangan, dan daftar key, value, key, value....

Jo King
sumber