Benzersiz Olmayan Öğeler


24

Bir dizi imzalı tamsayının benzersiz olmayan öğelerini bulan bir program yazın. Ortaya çıkan dizi herhangi bir sırayla olabilir.

Cevabınız, bir değişkenin ( dörneğin,) bir değişkende saklanacak olan girişi doğrulayan ve doğru sonucu değerlendiren bir pasaj olabilir .

Test Kılıfları

Her test durumu biçiminde tek bir satırdır input => output. Çıktının diğer permütasyonlarının da geçerli olduğunu unutmayın.

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

Elementlerin sırası önemli değil.

Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.



1
Çünkü bu tamsayılar dizisi için kod farklı olurdu. Ben çok daha kısa düşünüyorum. Bu bir dize için.
garg10 may

1
Girdiyi dizi yerine satır olarak kabul etmemize izin var mı? Yerine örneğin [-1, 0, 1](N yeni satır ile \ yerine) giriş olabilir: "-1\n0\n1"?
Addison Crump,

1
Çıktı bir liste mi olmalı yoksa bir küme kabul edilebilir mi?
Dennis,

Ve bu formatta çıktı vermek zorunda mı?
Addison Crump,

Yanıtlar:


16

K5 , 5 bayt

Girişin zaten bir değişkende olduğunu varsayarak d,

?d^?d

Farklı elemanları (al ?hariç d) ( d^d) 'ye ait farklı elementler ( ?d). Güzel simetrik, hayır? Bu, çünkü "hariç" işleci, sağ argümanın sadece ilk oluşumunu sol argümandan çıkardığı için çalışır.

Daha genel olarak,

nu: {?x^?x}

Eylemde:

  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)

Düzenle:

Benzersiz olmayan öğelerin ilk oluşumu sırasını korumak istiyorsak, 4 ekstra bayt ücreti hariç benzersiz öğeleri kaldırmadan önce ve sonra kaynak listesini tersine çevirebiliriz:

  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

Dizinin zaten D değişkeninde olduğunu varsayarak ( bu yoruma göre ):

D{De=(},_&

Çevrimiçi deneyin

Açıklama:

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

Not: pgüzel bir baskı istiyorsanız bir tane ekleyin , aksi halde sonuçta elde edilen dizi varsayılan olarak sınırlayıcı olmadan yazdırılır. Soru, snippet'in yalnızca "doğru sonucu değerlendirmek" gerektiğini belirttiğinden, bu kabul edilebilir.

Standart giriş / çıkış versiyonu, 13:

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

Çevrimiçi deneyin

Açıklama:

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 Yorumunuzu okumadan önce 13 baytlık bir sürüm daha buldum :) Ayrıca siparişi korur.
aditsu

9

Haskell - 32

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

İthalatta bile oldukça kısa. a \\ bher bir elemanının ilk geçtiği kaldırır bgelen ave nubbir liste tüm elemanları tek hale getirir.


7

Pyth, 7 bayt

S{.-Q{Q

Çevrimiçi deneyin.

Nasıl çalışır

Pyth değerlendirilen girişi otomatik olarak kaydeder Qve kullanılmayan tüm dönüş değerlerini yazdırır.

     {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 bayt

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

Umarım, tamsayıların D tablosunda depolandığını varsaymak iyidir. Bu, SQLServer, PostgreSQL ve muhtemelen başkalarında çalışacaktır. 2 bayttan @manatwork sayesinde.


İ'nin tablo d'deki tek alan olduğunu varsayarsak, PostgreSQL'de bunu azaltabilirsiniz select*from d group by 1having count(*)>1. (MySQL ve SQLite ayrıştırıcısı da ayrıştırılmamış select*fromkısmı kullanacaktır , fakat anlamıyorlar 1having.)
manatwork

Bunun için @manatwork alkış, sql server da anlar select*from. 1havingGerçi o gibi değil .. bırakacaktırI having
MickyT 14:15 'de

6

Mathematica, 29 26 bayt

Bu girişin saklandığı varsayılarak d:

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

Aksi takdirde, adsız bir işlev olarak 29 bayttır:

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

Burada, d⋃d(veya #⋃#) kopyaları çıkarmak için bir golf oyunu - set birliğini kendisiyle alarak Mathematica, bir takım olarak yorumluyor, kopyaları otomatik olarak kaldırırken, asıl birlik hiçbir şey yapmıyor.

Daha sonra, her iki yöntem de orijinal listede görünen öğeleri en az iki kez filtrelemeyi sağlar.


6

JavaScript (ES6), 37 bayt

Bunu JavaScript konsolunda çalıştırın:

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

Genelde, JavaScript'in console.log, alerteksiksiz olarak kabul edilmesi için bir tür açık "çıktı / baskı" işlevine (örneğin , vb.) İhtiyacı olduğu kabul edilir. Eğer bir meydan okuma "bir program veya fonksiyon yaz" diyorsa, fonksiyon da yeterli olur. Bunun yanında, çok verimli bir çözüm!
Mwr247

1
Anwer bir olabileceğini soru durumları Mwr247 @ pasajı doğru sonuç olarak değerlendirilir .
Cristian Lupascu

1
Görünüşe göre bu paragrafı yanlış yorumluyorum. Özürler sonra =)
Mwr247

@ Mwr247 Sorun değil! :)
Cristian Lupascu 13:15

6

Matlab / Octave, 40

Girdi değerlerinin gerçek olduğunu varsayıyorum (karmaşık değil). Giriş bir değişkende d.

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

Octave'da çevrimiçi olarak deneyin .



1
@ garg10may Teşekkürler. Güncellenmiş. Bu yazısında belirtmelisiniz
Luis Mendo

Çıktı ne zaman yanlıştır d = [3, 0, 0, 1, 1, 0, 5, 3]. İki tane var 0.
alephalpha

@alephalpha Teşekkürler! düzeltildi (8 bayt daha fazla)
Luis Mendo

Daha kısa: d(sum(triu(bsxfun(@eq,d,d')))==2). Veya d(sum(triu(d==d'))==2)
Octave'da

6

Python 3.5, 30

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

Python 3.5'in paket açma paketini kullanır. ~-Falsy 1 0 arasında bir sayı alır çıkarır 1,.

Bu bir liste verir. Bir set vermek tamamsa, o zaman 1 karakter tasarruf eden ve 3.5 sürümüne ihtiyaç duymayan bir set anlayışı kullanırız:

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

SyntaxError: invalid syntaxPython 3 için sadece 3.5 için geçerlidir? Python ne zaman ezoterik olmaya başladı.
garg10 may

@ garg10may Sadece 3.6, mağazada neler
Sp3000 14:15 '

1
@ Sp3000 Harika. Scala ile aynı kurulum gibi gözüküyor. Alternatiflerden çok daha fazla okunabilir.
Carcigenicate

6

PowerShell, 31 29 Bayt

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

$dZaten doldurulmuş olduğunu varsayar (verildiği gibi) - örneğin $d=@(-34,0,1,-34,4,8,4),.

Diziyi Group-Object, benzer öğeleri bir araya toplayan ve esas olarak bir dizi dizisi olan bir nesneyi yayan cmdlet'e boruları yerleştirir . Biz boru bir karşı Where-Object( ?vardır operatör) Countbirden büyük (yani çiftleri vardır) ve çıkış .Namebu öğelerin. Ayrıca ilk sıralamayı korumanın da bir yan bonusu var.

Düzenleme - Danko Durbić sayesinde iki bayt kaydedildi


1
Sana yerini alabilir mi $_.Count-gt1ile $_.Count-1hangi herhangi için de geçerli olacağı Countbirden büyük.
Danko Durbić

@ DankoDurbić Mükemmel!
AdmBorkBork

6

APL (Dyalog Unicode) , 13 9 bayt SBCS

Anonim zımni önek işlevi.

∊(⊂1↓⊣¨)⌸

Çevrimiçi deneyin!

()⌸ Her benzersiz öğe (sol argüman) ve gerçekleştiği endeksler (sağ argüman) için, aşağıdaki tacit işlevini uygulayın:

⊣¨ sağdaki her biri için soldan biri (benzersiz öğe) (dizinler)

1↓ bir tane bırak

 enclose (düzensiz bir matris oluşturmak için sıfırlarla doldurmayı önler)

ε nlist (düzleştirmek)


5

Julia, 30 29 bayt

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

d.==d'Aksi takdirde i,jtrue d[i]==d[j]ve false değeri olan simetrik bir matris yaratır . sumBir boyutta ming yapmak ve sonra 1'i çıkarmak, eğer elemanlardan sadece biri varsa sıfır, eğer birden fazla ise sıfırdan farklı olacaktır.findSıfır olmayan elemanların indekslerini elde eder, bu daha sonra dizinin dkendisini indekslemek için kullanılır . (sendika) uniquebu şekilde kullanıldığında olduğu gibi davranır , tekrarları kaldırır.

Eski çözüm:

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

Basit - her giriş için dizide birden fazla olup olmadığını kontrol eder. Birden fazla olanlar "süzgeç" tarafından döndürülür, sonra (sendika) gibi davranırunique bu şekilde kullanıldığında tekrar eder, böylece tekrar eder.

Not: başlangıçta bir işlev olarak kullanıyordu, ancak soru dizinin d, soruda önerildiği gibi seçtiğim bir değişkende saklanmasına izin veriyor .


5

Python 2.7, 36 42

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

edit : soruda istenen formata uymak için ifadeyi listeyle (..) çevreledi


Bu bir liste değil çıktı setini verecek
garg10may 13:15

Öyleyse, snippet'imi bir liste (...) çağrısı ile çevreliyim mi?
diyet

Evet, çıktı sadece bir dizi olmalıdır.
garg10 may


5

R, 31 24 bayt

7 bayt için flodel sayesinde .

Girdi zaten varsayalım d.

kod:

unique(d[duplicated(d)])

düzenleme: şimdi aditsu tarafından belirtildiği gibi 2'den fazla kopya varsa, doğru çıktı .


2
Bu güzel görünüyor! Ancak 4. test davası doğru görünmüyor ...
aditsu

1
Sen kaldırabilirsiniz whichberi [de mantıklı bir argüman kabul eder.
flodel

5

Python 3 - 33 30 bayt

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

dGiriş olarak repl çıkışı .



4

Pyth, 7 bayt

ft/QT{Q

Açıklama:

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.

Filtre, öğeler kümesinden bir kez beliren tüm öğeleri kaldırır.


4

LINQ, 62 54 bayt

Biraz yeni, ama işte hiçbir şey yok.

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

Siteye Hoşgeldiniz! LINQ'u tanımıyorum, ancak puanınızı artırmak için muhtemelen bundan kaldırabileceğiniz bir boşluk var.
DLosc


3

Shell + GNU coreutils, 12

sort|uniq -d

Test çıkışı:

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

3

Mathematica, 23 bayt

Giriş saklanırken d:

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

Bir fonksiyon olarak, 24 bayt:

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

örneğin

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

bunu döndürür:

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

(her alt listenin birinci elemanı, ikinci ise oluşum sıklığıdır). Bu listeye uygulamak Pick[#,#2>1]&@@@onu dönüştürür

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

Ve ikinci Pickdeğerlendirme Trueargümanının ilk argümana dönüştüğü yerde .


3

K (K5 değil), 10 bayt

x@&1<#:'=x

Girişin var olduğunu varsayar x. K5 olmayan bir cevap vermenin eğlenceli olacağını düşündüm!


3

Perl 6, 16 bayt

Listede kayıtlı $_olduğunu varsayalım, aşağıdaki snippet'lerden herhangi birini kullanabilirsiniz.
(özellikle izin verildi)

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

Bir çantanızın olmasına aldırış etmiyorsanız, bırakabilirsiniz keys .

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

Bunların hiçbiri yalnızca imzalı tamsayılar üzerinde çalışmayı, hatta bu konuda sadece rakamları sınırlamaz.

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



2

Ortak Lisp, 57 bayt

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

2

Octave, 33 bayt

[~,a]=unique(d);d(a)=[];unique(d)
  • Her bir tamsayının ilk oluşumunun indekslerini bulur,
  • bu oluşumları kaldırır ve
  • Kalan dizinin benzersiz elemanlarını bulur.

İşte ideone üzerinde . Snippet'i bir fonksiyona sardım, böylece tüm örnek girişlerini kullanarak arayabilirim.


2

Java 8, 80 Bayt

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

X'in varsayalım sayılar listesi.


2

PHP, 35 37 bayt

Oldukça yalındır:

array_diff_key($a,array_unique($a))

Not olarak: Sorulardan da belirtildiği ;gibi, satırın sonuna şunu eklemedim :

Cevabınız, bir değişkenin (d, say) bir değişkende saklanacak olan girdiyi varsayan ve doğru sonucu değerlendiren bir pasaj olabilir

Böylece bu snippet bu şekilde kullanılabilir ve doğru sonucu değerlendirir:

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

Başka bir not

Yukarıdaki kod, mücadelede verilen tüm test durumları için geçerlidir. Bunların hepsinde benzersiz olmayan karakterler en fazla yinelenir. Bir eleman iki kereden fazla meydana gelebilirse array_unique(), uzunluğu 49 bayta yükselten bir tane daha gerekli olacaktır :

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

Düzenlemeler

  • Kaydedilen 2 bayt yerine array_diff_associle array_diff_key. Jörg Hülsermann'a teşekkürler .

1
array_diff_keybunun yerinearray_diff_assoc
Jörg Hülsermann

@ JörgHülsermann İyi yakalayın. Teşekkürler. Gelecek günlerde diğer önerilerinize bir göz atın.
insertusernamehere
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.