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.

garg10mungkin
sumber
4
Terkait
Sp3000
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)
JohnE
sumber
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
aditsu
sumber
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.

C. Quilley
sumber
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.
Dennis
sumber
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.

MickyT
sumber
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.

Martin Ender
sumber
6

JavaScript (ES6), 37 byte

Jalankan ini di konsol JavaScript:

e={};d.filter(x=>(e[x]=1+e[x]||0)==1)
Cristian Lupascu
sumber
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.

Luis Mendo
sumber
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)}
Tidak
sumber
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ć

AdmBorkBork
sumber
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)

Adm
sumber
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.

Glen O
sumber
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

pelaku diet
sumber
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

Oktaf, 22 byte

Berdasarkan jawaban Luis Mendo .

d(sum(triu(d==d'))==2)
alephalpha
sumber
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 .

Mutador
sumber
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.

pppery
sumber
4

Mathematica, 31 29

Cases[{s_,t_/;t>1}:>s]@*Tally
alephalpha
sumber
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.

isaacg
sumber
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)
noisyass2
sumber
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
streetster
sumber
3

Shell + GNU coreutils, 12

sort|uniq -d

Output tes:

$ printf "%s\n" -34 0 1 -34 4 8 4 | ./nonuniq.sh 
-34
4
$ 
Trauma Digital
sumber
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.

LLlAMnYP
sumber
3

K (bukan K5), 10 byte

x@&1<#:'=x

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

kirbyfan64sos
sumber
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)
Brad Gilbert b2gills
sumber
3

Ruby, 30 28 byte

Dalam Shell Ruby Interaktif :

d.select{|x|d.count(x>1)}|[]

Disimpan 2 byte berkat Kirill L.

Cristian Lupascu
sumber
1
Simpan 2 byte:d.select{|x|d.count(x>1)}|[]
Kirill L.
2

Common Lisp, 57 byte

(remove-duplicates(remove-if(lambda(x)(<(count x d)2))d))
pengasuh
sumber
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.

gelas kimia
sumber
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.

Rnet
sumber
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 .
masukkan nama pengguna di sini
sumber
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