องค์ประกอบที่ไม่ซ้ำ


24

เขียนโปรแกรมที่ค้นหาองค์ประกอบที่ไม่ซ้ำกันของอาร์เรย์ของจำนวนเต็มที่ลงนามแล้ว อาร์เรย์ที่เป็นผลลัพธ์สามารถอยู่ในลำดับใดก็ได้

คำตอบของคุณอาจเป็นข้อมูลโค้ดที่สมมติว่าอินพุตถูกเก็บไว้ในตัวแปร ( d, พูด) และประเมินผลลัพธ์ที่ถูกต้อง

กรณีทดสอบ

input => outputกรณีทดสอบแต่ละคนเป็นบรรทัดเดียวในรูปแบบ โปรดสังเกตว่าการเรียงสับเปลี่ยนอื่นของเอาต์พุตนั้นใช้ได้เช่นกัน

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

ลำดับขององค์ประกอบไม่สำคัญ

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ



1
ตั้งแต่นี้สำหรับอาร์เรย์ของรหัสจำนวนเต็มจะแตกต่างกัน ฉันคิดว่าสั้นกว่ามาก นั่นคือสำหรับสตริง
garg10may

1
เราอนุญาตให้ยอมรับอินพุตเป็นบรรทัดแทนที่จะเป็นอาร์เรย์หรือไม่? ตัวอย่างเช่นแทนที่จะของ[-1, 0, 1]เราสามารถป้อนข้อมูล (แทนที่ \ n กับการขึ้นบรรทัดใหม่): "-1\n0\n1"?
Addison Crump

1
เอาต์พุตต้องเป็นรายการหรือชุดจะยอมรับได้หรือไม่?
Dennis

และจะต้องส่งออกในรูปแบบนั้นหรือไม่?
Addison Crump

คำตอบ:


16

K5 , 5 ไบต์

สมมติว่าการป้อนข้อมูลที่มีอยู่แล้วในตัวแปรที่เรียกว่าd,

?d^?d

ใช้องค์ประกอบที่แตกต่าง ( ?) ของ d ยกเว้น ( d^) องค์ประกอบที่แตกต่างของ d ( ?d) สมมาตรกันใช่มั้ย ใช้งานได้เนื่องจากตัวดำเนินการ "ยกเว้น" ลบเฉพาะอาร์กิวเมนต์แรกที่ถูกต้องออกจากอาร์กิวเมนต์ซ้ายเท่านั้น

ให้เป็นปกติมากกว่านี้,

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
 0 1 3
 -34 4)

แก้ไข:

หากเราต้องการรักษาลำดับขององค์ประกอบที่ไม่ซ้ำกันครั้งแรกเราสามารถย้อนกลับรายการแหล่งข้อมูลก่อนและหลังที่เราลบองค์ประกอบที่ไม่ซ้ำกันผ่านทางยกเว้นค่าใช้จ่าย 4 ไบต์พิเศษ:

  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

สมมติว่าอาร์เรย์มีอยู่ในตัวแปร D (ตามความคิดเห็นนี้ ):

D{De=(},_&

ลองออนไลน์

คำอธิบาย:

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

หมายเหตุ: ผนวก a pถ้าคุณต้องการพิมพ์สวยมิฉะนั้นอาร์เรย์ผลลัพธ์จะพิมพ์ออกมาโดยไม่มีตัวคั่นตามค่าเริ่มต้น เป็นสิ่งที่ยอมรับได้เนื่องจากคำถามระบุตัวอย่างข้อมูลที่ต้องการเพียง "ประเมินผลลัพธ์ที่ถูกต้องเท่านั้น"

เวอร์ชั่นอินพุต / เอาต์พุตมาตรฐาน 13:

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

ลองออนไลน์

คำอธิบาย:

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 ฉันพบอีกรุ่น 13 ไบต์ก่อนที่จะอ่านความคิดเห็นของคุณ :) มันเก็บคำสั่งไว้
aditsu

9

Haskell - 32

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

ค่อนข้างสั้นแม้จะมีการนำเข้า a \\ bลบการเกิดขึ้นครั้งแรกของแต่ละองค์ประกอบbจากaและnubทำให้องค์ประกอบทั้งหมดของรายการไม่ซ้ำกัน


7

Pyth, 7 ไบต์

S{.-Q{Q

ลองออนไลน์

มันทำงานอย่างไร

Pyth จะเก็บอินพุตที่ประเมินโดยอัตโนมัติQและพิมพ์ค่าส่งคืนที่ไม่ได้ใช้ทั้งหมด

     {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 ไบต์

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

ฉันหวังว่ามันโอเคที่จะคิดว่าจำนวนเต็มถูกเก็บไว้ในตาราง D? สิ่งนี้จะใช้ได้ทั้งใน SQLServer, PostgreSQL และอื่น ๆ ขอบคุณ @manatwork จาก 2 ไบต์


สมมติว่าผมเป็นเพียงข้อมูลในตาราง d ใน PostgreSQL select*from d group by 1having count(*)>1คุณสามารถลดความมันไป (ตัวแยกวิเคราะห์ของ MySQL และ SQLite จะจัดการselect*fromส่วนที่แยกออกจากกัน แต่พวกเขาไม่เข้าใจ1having)
manatwork

ไชโย @manatwork การที่เซิร์ฟเวอร์ SQL select*fromยังเข้าใจ ไม่ชอบ1havingแม้ว่า .. จะปล่อยให้เป็นI having
มิกกี้

6

มาติกา 29 26 ไบต์

สมมติว่าอินพุตถูกเก็บในd:

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

มิฉะนั้นจะมี 29 ไบต์เป็นฟังก์ชันที่ไม่มีชื่อ:

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

ที่นี่d⋃d(หรือ#⋃#) เป็นเคล็ดลับการตีกอล์ฟเพื่อลบรายการที่ซ้ำกัน - โดยใช้ชุดสหภาพด้วยตัวเอง Mathematica ตีความรายการเป็นชุดโดยการลบรายการที่ซ้ำกันโดยอัตโนมัติในขณะที่สหภาพที่แท้จริงไม่ได้ทำอะไรเลย

หลังจากนั้นทั้งสองวิธีจะกรององค์ประกอบที่ปรากฏในรายการต้นฉบับอย่างน้อยสองครั้ง


6

JavaScript (ES6), 37 ไบต์

รันสิ่งนี้ในคอนโซล JavaScript:

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

มันได้รับการยอมรับโดยทั่วไปว่า JavaScript ต้องการเรียงลำดับของอย่างชัดเจน "การส่งออก / พิมพ์" ฟังก์ชั่นบางอย่าง (เช่นconsole.log, alertฯลฯ ) ที่จะถือว่าเสร็จสมบูรณ์ หากความท้าทายบอกว่า "เขียนโปรแกรมหรือฟังก์ชั่น" แสดงว่าฟังก์ชั่นส่งคืนก็เพียงพอแล้ว นอกจากนั้นทางออกที่มีประสิทธิภาพมาก!
Mwr247

1
@ Mwr247 รัฐคำถามที่ anwer อาจจะเป็นข้อมูลโค้ดซึ่งประเมินผลที่ถูกต้อง
Cristian Lupascu

1
ดูเหมือนว่าฉันตีความตีความผิดในย่อหน้านั้น ขอโทษแล้ว =)
Mwr247

@ Mwr247 ไม่มีปัญหา! :)
Cristian Lupascu

6

Matlab / Octave, 40

ฉันสมมติว่าค่าอินพุตเป็นจริง (ไม่ซับซ้อน) dการป้อนข้อมูลที่อยู่ในตัวแปร

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

ลองออนไลน์ใน Octave


ไม่จำเป็นต้องป้อนข้อมูลคุณสามารถสมมติข้อมูลในตัวแปร 'd'
garg10may

1
@ garg10may ขอบคุณ Updated คุณควรระบุว่าในโพสต์ของคุณ
หลุยส์เมนโด

d = [3, 0, 0, 1, 1, 0, 5, 3]การส่งออกไม่ถูกต้องเมื่อ มีสอง0s
alephalpha

@alephalpha ขอบคุณ! แก้ไขแล้ว (8 ไบต์ขึ้นไป)
Luis Mendo

d(sum(triu(bsxfun(@eq,d,d')))==2)สั้น: หรือใน Octave:d(sum(triu(d==d'))==2)
alephalpha

6

Python 3.5, 30

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

ใช้ชุดการเปิด Python 3.5 การ~-ลบ 1 ซึ่งใช้เวลานับ 1 ถึง 0 ซึ่งเป็นเท็จ

นี่เป็นรายการ หากการให้ชุดตกลงเราจะใช้ชุดความเข้าใจประหยัด 1 ถ่านและไม่จำเป็นต้องใช้เวอร์ชัน 3.5:

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

SyntaxError: invalid syntaxสำหรับ Python 3 ใช้ได้กับ 3.5 เท่านั้นหรือไม่ เมื่อไพ ธ อนเริ่มลึกลับ
garg10may

@ garg10may รอจนกว่าคุณจะเห็นว่ามี 3.6 อะไรในร้าน ...
Sp3000

1
@ Sp3000 ยอดเยี่ยม ดูเหมือนว่าการตั้งค่าเช่นเดียวกับ Scala สามารถอ่านได้มากกว่าอนันต์ทางเลือกอื่น ๆ
Carcigenicate

6

PowerShell, 31 29 ไบต์

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

สันนิษฐานว่า$dเป็นประชากรที่มีอยู่แล้ว (ตามที่กำหนด) - $d=@(-34,0,1,-34,4,8,4)เช่น

ไพพ์อาร์เรย์ลงในGroup-Objectcmdlet ซึ่งจัดกลุ่มสิ่งที่ชอบเข้าด้วยกันและแยกวัตถุที่เป็นอาร์เรย์ของอาร์เรย์ เราไปป์นั้นไปยังWhere-Object(ตัว?ดำเนินการ) ที่มีCountมากกว่าหนึ่ง (เช่นมีซ้ำกัน) และส่งออก.Nameของรายการเหล่านั้น มีโบนัสด้านการรักษาลำดับแรกไว้เช่นกัน

แก้ไข - บันทึกสองไบต์ด้วยDanko Durbić


1
ฉันคิดว่าคุณสามารถแทนที่$_.Count-gt1ด้วย$_.Count-1ซึ่งจะเป็นจริงสำหรับCountมากกว่าหนึ่ง
Danko Durbić

@ DankoDurbićยอดเยี่ยม!
AdmBorkBork

6

APL (Dyalog Unicode) , 13 9 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ

∊(⊂1↓⊣¨)⌸

ลองออนไลน์!

(... )⌸ สำหรับแต่ละองค์ประกอบที่ไม่ซ้ำกัน (อาร์กิวเมนต์ซ้าย) และดัชนีที่เกิดขึ้น (อาร์กิวเมนต์ขวา) ให้ใช้ฟังก์ชัน tacit ต่อไปนี้:

⊣¨ ด้านซ้ายหนึ่งรายการ (องค์ประกอบที่เป็นเอกลักษณ์) สำหรับแต่ละรายการทางด้านขวา (ดัชนี)

1↓ ปล่อยหนึ่งอัน

 ล้อมรอบ (ป้องกันการขยายด้วยศูนย์เพื่อสร้างเมทริกซ์ที่ไม่มอมแมม)

ϵ รายการ (แผ่)


5

Julia, 30 29 ไบต์

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

d.==d'สร้างเมทริกซ์สมมาตรที่มีค่าi,jเป็นจริงถ้าd[i]==d[j]และเท็จอย่างอื่น sumหมิงในมิติเดียวแล้วลบ 1 จะสร้างศูนย์ถ้ามีเพียงหนึ่งในองค์ประกอบและไม่ใช่ศูนย์ถ้ามีมากกว่าหนึ่ง findจะได้รับดัชนีขององค์ประกอบที่ไม่เป็นศูนย์ซึ่งจะใช้ในการทำดัชนีอาร์เรย์dเอง (สหภาพ) ทำหน้าที่เหมือนuniqueเมื่อใช้ในลักษณะนี้ลบซ้ำ

โซลูชันเก่า:

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

ง่าย - สำหรับแต่ละรายการมันตรวจสอบว่ามีมากกว่าหนึ่งรายการในอาร์เรย์ ผู้ที่มีมากกว่าหนึ่งจะถูกส่งกลับโดย "ตัวกรอง" แล้ว(สหภาพ) ทำหน้าที่เหมือนuniqueเมื่อใช้ในวิธีนี้เอาออกซ้ำ

หมายเหตุ: แต่เดิมมีฟังก์ชั่น แต่คำถามอนุญาตให้เก็บอาร์เรย์ในตัวแปรซึ่งฉันได้เลือกไว้dตามที่แนะนำในคำถาม


5

Python 2.7, 36 42

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

แก้ไข : ล้อมรอบนิพจน์ด้วย list (.. ) เพื่อให้เป็นไปตามรูปแบบที่ต้องการในคำถาม


ผลลัพธ์นี้จะไม่ได้ตั้งค่ารายการ
garg10may

ดังนั้นฉันจะล้อมรอบตัวอย่างของฉันด้วยรายการโทร (... ) หรือไม่
Dieter

ใช่ผลลัพธ์ควรเป็นอาร์เรย์เท่านั้น
garg10may


5

R, 31 24 ไบต์

ขอบคุณflodelสำหรับ 7 ไบต์

dสมมติว่าการป้อนข้อมูลที่มีอยู่แล้วใน

รหัส:

unique(d[duplicated(d)])

แก้ไข: ตอนนี้มันจะออกผลลัพธ์อย่างถูกต้องถ้ามีมากกว่า 2 รายการที่ซ้ำกันเป็นแฉกโดยaditsu


2
นั่นดูสวยงาม! แต่ดูเหมือนว่ากรณีการทดสอบครั้งที่ 4 จะไม่ถูกต้อง ...
aditsu

1
คุณสามารถลบได้whichเนื่องจาก[ยอมรับข้อโต้แย้งเชิงตรรกะ
flodel



4

Pyth, 7 ไบต์

ft/QT{Q

คำอธิบาย:

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.

ตัวกรองจะลบองค์ประกอบทั้งหมดที่ปรากฏอย่างแน่นอนหนึ่งครั้งจากชุดองค์ประกอบ


4

LINQ, 62 54 ไบต์

ค่อนข้างใหม่ที่นี่ แต่ไม่มีอะไรเลย

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

ยินดีต้อนรับสู่เว็บไซต์! ฉันไม่รู้จัก LINQ แต่มีพื้นที่ว่างบางส่วนที่คุณสามารถลบออกจากสิ่งนี้เพื่อปรับปรุงคะแนนของคุณ
DLosc



3

Mathematica ขนาด 23 ไบต์

ด้วยอินพุตที่เก็บไว้ในd:

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

ในฐานะที่เป็นฟังก์ชั่น 24 ไบต์:

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

ตัวอย่างเช่นด้วย

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

ส่งคืนสิ่งนี้:

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

(องค์ประกอบแรกของแต่ละรายการย่อยคือองค์ประกอบส่วนที่สองคือความถี่ของการเกิดขึ้น) การนำไปใช้กับรายการนี้จะPick[#,#2>1]&@@@แปลงเป็น

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

และที่อาร์กิวเมนต์ที่สองของการPickประเมินTrueเป็นอาร์กิวเมนต์แรกจะถูกส่งกลับ


3

K (ไม่ใช่ K5), 10 ไบต์

x@&1<#:'=x

xถือว่าอยู่ในการป้อนข้อมูล ฉันคิดว่ามันคงจะสนุกถ้าได้รับคำตอบที่ไม่ใช่ K5!


3

Perl 6, 16 ไบต์

สมมติว่ารายการนั้นถูกเก็บไว้ใน$_คุณสามารถใช้ตัวอย่างใด ๆ ต่อไปนี้
(ซึ่งได้รับอนุญาตโดยเฉพาะ)

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

keys ถ้าคุณไม่สนใจว่าคุณจะได้รับกระเป๋าคุณสามารถออกนอก

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

สิ่งเหล่านี้ไม่มีข้อ จำกัด เพียงแค่ทำงานกับจำนวนเต็มที่ลงนามแล้วหรือแม้แต่เพียงแค่ตัวเลขสำหรับเรื่องนั้น

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




2

อ็อกเทฟ 33 ไบต์

[~,a]=unique(d);d(a)=[];unique(d)
  • ค้นหาดัชนีของการเกิดขึ้นครั้งแรกของแต่ละจำนวนเต็มที่ไม่ซ้ำกัน
  • ลบเหตุการณ์เหล่านั้นและ
  • ค้นหาองค์ประกอบที่เป็นเอกลักษณ์ของอาร์เรย์ที่เหลืออยู่

นี่มันอยู่บนideone ฉันได้วางส่วนย่อยไว้ในฟังก์ชั่นดังนั้นฉันจึงสามารถเรียกมันได้โดยใช้อินพุตตัวอย่างทั้งหมด


2

Java 8, 80 Bytes

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

สมมติว่า x มีรายการอินพุตของตัวเลข


2

PHP, 35 37ไบต์

ตรงไปตรงมาสวย:

array_diff_key($a,array_unique($a))

ตามที่ทราบ:ฉันไม่ได้เพิ่ม;ส่วนท้ายของบรรทัดตามที่คำถามระบุไว้:

คำตอบของคุณอาจเป็นตัวอย่างซึ่งถือว่าอินพุตจะถูกเก็บไว้ในตัวแปร (d, พูด) และประเมินผลลัพธ์ที่ถูกต้อง

ดังนั้นข้อมูลโค้ดนี้สามารถใช้แบบนี้และประเมินผลลัพธ์ที่ถูกต้อง:

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

หมายเหตุอื่น

รหัสด้านบนใช้ได้กับกรณีทดสอบทั้งหมดที่มีให้ในการทดสอบ ในบรรดาตัวละครที่ไม่ซ้ำกันทั้งหมดจะซ้ำกันมากที่สุด หากองค์ประกอบสามารถเกิดขึ้นได้มากกว่าสองครั้งองค์ประกอบอื่น ๆarray_unique()ก็จำเป็นซึ่งจะเพิ่มความยาวเป็น49 ไบต์ :

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

การแก้ไข

  • ที่บันทึกไว้ 2 ไบต์โดยการแทนที่ด้วยarray_diff_assoc array_diff_keyขอขอบคุณที่JörgHülsermann

1
array_diff_keyแทนarray_diff_assoc
JörgHülsermann

@ JörgHülsermannจับได้ดี ขอบคุณ จะดูข้อเสนอแนะอื่น ๆ ของคุณภายในไม่กี่วันถัดไป
insertusernamehere
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.