Elemen Tidak Unik


24

Tulis program yang menemukan elemen non-unik dari array bilangan bulat yang ditandatangani. Array yang dihasilkan bisa dalam urutan apa pun.

Jawaban Anda mungkin berupa potongan yang mengasumsikan input disimpan dalam variabel ( d, katakanlah) dan mengevaluasi hasil yang benar.

Uji Kasus

Setiap test case adalah satu baris dalam format input => output. Perhatikan bahwa permutasi lain dari output juga valid.

[]                        => []
[-1, 0, 1]                => []
[1, 1]                    => [1]
[3, 0, 0, 1, 1, 0, 5, 3]  => [3, 0, 1]
[-34, 0, 1, -34, 4, 8, 4] => [-34, 4]

Urutan elemen tidak masalah.

Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.



1
karena ini untuk array kode integer akan berbeda. Saya pikir jauh lebih pendek. Itu untuk sebuah string.
garg10mungkin

1
Apakah kami diizinkan menerima input sebagai garis dan bukan sebagai array? Misalnya, alih-alih [-1, 0, 1], bisa kita masukan (ganti \ n dengan baris baru): "-1\n0\n1"?
Addison Crump

1
Apakah output harus berupa daftar atau apakah suatu set dapat diterima?
Dennis

Dan apakah harus menampilkan dalam format itu?
Addison Crump

Jawaban:


16

K5 , 5 byte

Dengan asumsi input sudah dalam variabel yang disebut d,

?d^?d

Ambil elemen berbeda ( ?) dari d kecuali ( d^) elemen berbeda dari d ( ?d). Simetris dengan baik, bukan? Ini berfungsi karena operator "kecuali" hanya menghapus kemunculan pertama argumen kanan dari argumen kiri.

Lebih umum,

nu: {?x^?x}

Beraksi:

  nu'(();-1 0 1;1 1;3 0 0 1 1 0 5 3;-34 0 1 -34 4 8 4)
(()
 ()
 ,1
 0 1 3
 -34 4)

Edit:

Jika kami ingin mempertahankan urutan kemunculan elemen non-unik pertama, kami dapat membalikkan daftar sumber sebelum dan setelah kami menghapus elemen unik melalui kecuali dengan biaya 4 byte tambahan:

  nu: {?|(|x)^?x}
  nu'(();-1 0 1;1 1;3 0 0 1 1 0 5 3;-34 0 1 -34 4 8 4)
(()
 ()
 ,1
 3 0 1
 -34 4)

10

CJam, 10

Dengan asumsi array sudah dalam variabel D (berdasarkan komentar ini ):

D{De=(},_&

Cobalah online

Penjelasan:

D{…},   filter items of D based on the block
  De=   count occurrences in D
  (     decrement (resulting in true/false for duplicate/unique)
_&      remove duplicates from the results

Catatan: tambahkan a pjika Anda ingin mencetak cantik, jika tidak, array yang dihasilkan hanya dicetak tanpa pembatas secara default. Itu dapat diterima karena pertanyaan menentukan snippet hanya perlu "mengevaluasi hasil yang benar".

Versi input / output standar, 13:

q~_{1$e=(},&p

Cobalah online

Penjelasan:

q~      read and evaluate the input array
_       duplicate the array
{…},    filter items based on the block
  1$    copy the array
  e=    count occurrences
  (     decrement (resulting in true/false for duplicate/unique)
&       set intersection with the initial array (removes duplicates)
p       pretty print

1
13:q~$e`{((<~}%p
Sp3000

3
@ Sp3000 Saya menemukan versi 13-byte lain sebelum membaca komentar Anda :) Ini menjaga pesanan juga.
aditsu

9

Haskell - 32

import Data.List;f l=nub$l\\nub l

Cukup singkat, bahkan dengan impor. a \\ bmenghapus kemunculan pertama setiap elemen bdari a, dan nubmembuat semua elemen daftar menjadi unik.


7

Pyth, 7 byte

S{.-Q{Q

Cobalah online.

Bagaimana itu bekerja

Pyth secara otomatis menyimpan input yang dievaluasi Qdan mencetak semua nilai kembali yang tidak digunakan.

     {Q  Convert Q into a set. This removes duplicates.
  .-Q    Perform "bagwise" difference of Q and set(Q).
         This removes the first occurrence of all elements in Q.
 {       Convert to set to deduplicate.
S        Sort. Returns a list.

7

SQL, 44 42 byte

SELECT*FROM D GROUP BY I HAVING COUNT(*)>1

Saya harap tidak apa-apa untuk menganggap bilangan bulat disimpan dalam tabel D? Ini akan bekerja di SQLServer, PostgreSQL dan mungkin lainnya. Berkat @manatwork dari 2 byte.


Dengan asumsi saya adalah satu-satunya bidang dalam tabel d, dalam PostgreSQL Anda dapat menguranginya select*from d group by 1having count(*)>1. (Pengurai MySQL dan SQLite juga akan menangani bagian yang tidak terpisahkan select*from, tetapi mereka tidak mengerti 1having.)
manatwork

@manatwork bersorak untuk itu, sql server juga mengerti select*from. Tidak suka 1havingmeskipun .. akan meninggalkan itu sebagaiI having
MickyT

6

Mathematica, 29 26 byte

Dengan asumsi input disimpan dalam d:

Select[d⋃d,d~Count~#>1&]

Jika tidak, itu 29 byte sebagai fungsi yang tidak disebutkan namanya:

Cases[#⋃#,n_/;#~Count~n>1]&

Di sini, d⋃d(atau #⋃#) adalah trik bermain golf untuk menghapus duplikat - dengan membawa set union dengan sendirinya, Mathematica menafsirkan daftar sebagai set, menghapus duplikat secara otomatis, sedangkan union yang sebenarnya tidak melakukan apa-apa.

Setelah itu, kedua metode cukup memfilter elemen-elemen yang muncul dalam daftar asli setidaknya dua kali.


6

JavaScript (ES6), 37 byte

Jalankan ini di konsol JavaScript:

e={};d.filter(x=>(e[x]=1+e[x]||0)==1)

Ini berlaku umum bahwa JavaScript membutuhkan semacam fungsi "output / print" eksplisit (seperti console.log, alert, dll) yang akan dianggap lengkap. Jika sebuah tantangan mengatakan "tulis sebuah program atau fungsi", maka fungsi kembali juga sudah cukup. Selain itu, solusi yang sangat efisien!
Mwr247

1
@ Mwr247 Pertanyaannya menyatakan bahwa anwer mungkin berupa cuplikan yang mengevaluasi ke hasil yang benar .
Cristian Lupascu

1
Sepertinya saya salah menafsirkan paragraf itu. Permintaan maaf kemudian =)
Mwr247

@ Mwr247 Tidak masalah! :)
Cristian Lupascu

6

Matlab / Oktaf, 40

Saya mengasumsikan nilai input nyata (tidak kompleks). Input dalam variabel d.

unique(d(sum(triu(bsxfun(@eq,d,d')))>1))

Cobalah online di Octave.


Tidak perlu memasukkan, Anda dapat mengasumsikan data dalam variabel 'd'
garg10mungkin

1
@ garg10mungkin Terima kasih. Diperbarui. Anda harus menentukan hal itu di pos Anda
Luis Mendo

Outputnya salah ketika d = [3, 0, 0, 1, 1, 0, 5, 3]. Ada dua 0s.
alephalpha

@alephalpha Terima kasih! dikoreksi (8 lebih banyak byte)
Luis Mendo

Shorter: d(sum(triu(bsxfun(@eq,d,d')))==2). Atau dalam Octave:d(sum(triu(d==d'))==2)
alephalpha

6

Python 3.5, 30

[x for x in{*d}if~-d.count(x)]

Menggunakan set Python 3.5 untuk membongkar. The ~-mengurangi 1, yang membutuhkan hitungan 1-0 yang falsy.

Ini memberikan daftar. Jika memberi satu set tidak apa-apa, maka kami menggunakan pemahaman set, menyimpan 1 karakter dan tidak perlu versi 3.5:

{x for x in d if~-d.count(x)}

SyntaxError: invalid syntaxuntuk Python 3 apakah hanya valid untuk 3,5? Kapan python mulai menjadi esoteris.
garg10mungkin

@ garg10may Tunggu saja sampai Anda melihat apa yang ada di toko 3.6 ...
Sp3000

1
@ Sp3000 Luar Biasa. Sepertinya set-up yang sama dengan Scala. Jauh lebih mudah dibaca daripada lebih banyak alternatif.
Carcigenicate

6

PowerShell, 31 29 Bytes

($d|group|?{$_.Count-1}).Name

Asumsikan bahwa $dsudah diisi (seperti yang diberikan) - misalnya $d=@(-34,0,1,-34,4,8,4),.

Pipes array ke Group-Objectcmdlet, yang mengelompokkan item-suka bersama dan meludahkan objek yang pada dasarnya adalah array array. Kami menyalurkannya ke Where-Object( ?operator) yang memiliki Countlebih dari satu (yaitu, ada duplikat), dan mengeluarkan .Nameitem tersebut. Memiliki bonus tambahan untuk menjaga pemesanan awal juga.

Sunting - menyimpan dua byte berkat Danko Durbić


1
Saya pikir Anda dapat mengganti $_.Count-gt1dengan $_.Count-1yang benar untuk yang Countlebih dari satu.
Danko Durbić

@ DankoDurbić Luar Biasa!
AdmBorkBork

6

APL (Dyalog Unicode) , 13 9 byte SBCS

Fungsi awalan diam-diam anonim.

∊(⊂1↓⊣¨)⌸

Cobalah online!

(... )⌸ untuk setiap elemen unik (argumen kiri) dan indeks tempat terjadinya (argumen kanan), terapkan fungsi tacit berikut:

⊣¨ salah satu dari kiri (elemen unik) untuk masing-masing di sebelah kanan (indeks)

1↓ jatuhkan satu

 menyertakan (mencegah padding dengan nol untuk membuat matriks tidak kasar)

ϵ daftar (ratakan)


5

Julia, 30 29 byte

∪(d[find(sum(d.==d',1)-1)])

d.==d'menciptakan matriks simetris dengan nilai pada i,jtrue if d[i]==d[j]dan false sebaliknya. sumberbaur dalam satu dimensi dan kemudian mengurangi 1 akan menghasilkan nol jika hanya ada satu elemen dan bukan nol jika ada lebih dari satu. findakan mendapatkan indeks dari elemen-elemen non-nol, yang kemudian digunakan untuk mengindeks array ditu sendiri. (Union) bertindak seperti uniqueketika digunakan dengan cara ini, menghapus pengulangan.

Solusi lama:

∪(filter(i->sum(d.==i)>1,d))

Sederhana - untuk setiap entri, ia memeriksa apakah ada lebih dari satu di dalam array. Yang ada lebih dari satu dikembalikan oleh "filter", dan kemudian (gabungan) bertindak seperti uniqueketika digunakan dengan cara ini, menghapus pengulangan.

Catatan: awalnya menjadikannya sebagai fungsi, tetapi pertanyaan memungkinkan array disimpan dalam variabel, yang saya pilih dseperti disarankan dalam pertanyaan.


5

Python 2.7, 36 42

list(set(filter(lambda x:d.count(x)>1,d)))

sunting : dikelilingi ekspresi dengan daftar (..) untuk memenuhi format yang diperlukan dalam pertanyaan


ini akan mengeluarkan output bukan daftar
garg10may

Jadi, haruskah saya mengelilingi cuplikan saya dengan panggilan ke daftar (...)?
pelaku diet

Ya output harus berupa array saja.
garg10mungkin


5

R, 31 24 byte

Berkat flodel untuk 7 byte.

Dengan asumsi input sudah di d.

kode:

unique(d[duplicated(d)])

sunting: sekarang ini menghasilkan dengan benar jika ada lebih dari 2 duplikat seperti yang ditunjukkan oleh aditsu .


2
Itu terlihat indah! Tetapi test case ke-4 sepertinya tidak benar ...
aditsu

1
Anda dapat menghapus whichkarena [juga menerima argumen yang logis.
flodel

5

Python 3 - 33 30 byte

{_ for _ in d if d.count(_)>1}

Ganti output, dsebagai input.



4

Pyth, 7 byte

ft/QT{Q

Penjelasan:

ft/QT{Q
           Q = eval(input())
     {Q    set(Q) - deduplicate
f          filter - with T as the filter variable.
  /QT      count in Q of T
 t         minus 1.

Filter menghapus semua elemen yang muncul tepat sekali dari set elemen.


4

LINQ, 62 54 byte

Agak baru di sini, tapi tidak ada yang terjadi.

d.GroupBy(c=>c).Where(g=>g.Count()>1).Select(g=>g.Key)

Selamat datang di situs ini! Saya tidak tahu LINQ, tetapi ada beberapa spasi yang mungkin bisa Anda hapus dari ini untuk meningkatkan skor Anda.
DLosc

4

K (oK) , 7 byte

Larutan:

&1<#:'=

Cobalah online!

Penjelasan:

&1<#:'= / the solution
      = / group, key => value (index)
   #:'  / count length of each group
 1<     / 1 less than 
&       / keys where true

3

Shell + GNU coreutils, 12

sort|uniq -d

Output tes:

$ printf "%s\n" -34 0 1 -34 4 8 4 | ./nonuniq.sh 
-34
4
$ 

3

Mathematica, 23 byte

Dengan input disimpan di d:

Pick[#,#2>1]&@@@Tally@d

Sebagai fungsi, 24 byte:

Pick[#,#2>1]&@@@Tally@#&

misalnya dengan

d = {3, 0, 0, 1, 1, 0, 5, 3}
Tally@d

mengembalikan ini:

   {{3, 2},
    {0, 3},
    {1, 2},
    {5, 1}}

(Elemen pertama dari setiap sublist adalah elemen, elemen kedua adalah frekuensi kemunculannya). Menerapkan ke daftar ini Pick[#,#2>1]&@@@mengubahnya menjadi

{Pick[3,2>1], Pick[0,3>1], Pick[1,2>1], Pick[5,1>1]}

Dan di mana argumen kedua Pickmengevaluasi ke Trueargumen pertama dikembalikan.


3

K (bukan K5), 10 byte

x@&1<#:'=x

Asumsikan input dalam x. Saya pikir akan menyenangkan untuk melakukan jawaban non-K5!


3

Perl 6, 16 byte

Anggaplah daftar itu tersimpan di $_Anda dapat menggunakan salah satu cuplikan berikut.
(yang secara khusus diizinkan)

(--«.BagHash).Set.keys # 23 bytes
keys .Bag (-) .Set # 18 bytes
# U+2216 SET MINUS
keys .Bag∖.Set # 16 bytes in utf8

Jika Anda tidak peduli bahwa Anda mendapatkan Tas Anda bisa pergi keys .

$_ = [3, 0, 0, 1, 1, 0, 5, 3];
.Bag∖.Set  3 # True
.Bag∖.Set  5 # False

Tak satu pun dari ini memiliki batasan hanya bekerja pada bilangan bulat yang ditandatangani, atau bahkan hanya angka dalam hal ini.

say keys .Bag∖.Set given |(<a b c d a a c>), 1/3, 2/3 - 1/3;
# (a c 0.333333)



2

Common Lisp, 57 byte

(remove-duplicates(remove-if(lambda(x)(<(count x d)2))d))

2

Oktaf, 33 byte

[~,a]=unique(d);d(a)=[];unique(d)
  • Menemukan indeks kemunculan pertama setiap bilangan bulat unik,
  • menghapus kejadian itu, dan
  • menemukan elemen unik dari array yang tersisa.

Ini dia ideone . Saya telah membungkus snippet dalam suatu fungsi sehingga saya bisa menyebutnya menggunakan semua input sampel.


2

Java 8, 80 Bytes

x.stream().filter(i->x.indexOf(i)!=x.lastIndexOf(i)).collect(Collectors.toSet())

Dengan asumsi x berisi daftar input angka.


2

PHP, 35 37 byte

Cukup lurus ke depan:

array_diff_key($a,array_unique($a))

Sebagai catatan: Saya tidak menambahkan ;di akhir baris, karena pertanyaan menyatakan:

Jawaban Anda mungkin berupa potongan yang mengasumsikan input disimpan dalam variabel (d, katakanlah) dan mengevaluasi hasil yang benar

Jadi cuplikan ini dapat digunakan seperti ini dan mengevaluasi hasil yang benar:

print implode(' ', array_diff_key($a,array_unique($a)));

Catatan lain

Kode di atas berfungsi untuk semua kasus uji yang disediakan dalam tantangan. Dalam semua karakter non-unik paling banyak duplikat. Jika sebuah elemen dapat muncul lebih dari dua kali, elemen lainnya array_unique()diperlukan, yang menambah panjangnya menjadi 49 byte :

array_unique(array_diff_key($a,array_unique($a)))

Suntingan

  • Disimpan 2 byte dengan mengganti array_diff_assocdengan array_diff_key. Terima kasih untuk Jörg Hülsermann .

1
array_diff_keysebaliknyaarray_diff_assoc
Jörg Hülsermann

@ JörgHülsermann Tangkapan bagus. Terima kasih. Akan melihat saran Anda yang lain dalam beberapa hari mendatang.
masukkan nama pengguna
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.