นับซ้ำของอาร์เรย์


20

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

[234, 2, 12, 234, 5, 10, 1000, 2, 99, 234]

สิ่งนี้จะคืนค่า 2 เนื่องจากแต่ละรายการ234และ2ปรากฏมากกว่าหนึ่งครั้ง

[234, 2, 12, 234]
[2, 12, 234, 5, 10, 1000, 2]

รายการจะไม่ยาวเกิน 100k เต็มและจำนวนเต็มภายในรายการจะอยู่ระหว่าง -100k และ 100k

จำนวนเต็มควรนับถ้ามันเกิดขึ้นมากกว่าหนึ่งครั้งดังนั้นหากจำนวนเต็มเกิดขึ้น 3 ครั้งแล้วมันจะยังคงนับเป็นจำนวนเต็มซ้ำหนึ่งครั้งเท่านั้น

กรณีทดสอบ

[1, 10, 16, 4, 8, 10, 9, 19, 2, 15, 18, 19, 10, 9, 17, 15, 19, 5, 13, 20]  = 4
[11, 8, 6, 15, 9, 19, 2, 2, 4, 19, 14, 19, 13, 12, 16, 13, 0, 5, 0, 8]     = 5
[9, 7, 8, 16, 3, 9, 20, 19, 15, 6, 8, 4, 18, 14, 19, 12, 12, 16, 11, 19]   = 5
[10, 17, 17, 7, 2, 18, 7, 13, 3, 10, 1, 5, 15, 4, 6, 0, 19, 4, 17, 0]      = 5
[12, 7, 17, 13, 5, 3, 4, 15, 20, 15, 5, 18, 18, 18, 4, 8, 15, 13, 11, 13]  = 5
[0, 3, 6, 1, 5, 2, 16, 1, 6, 3, 12, 1, 16, 5, 4, 5, 6, 17, 4, 8]           = 6
[11, 19, 2, 3, 11, 15, 19, 8, 2, 12, 12, 20, 13, 18, 1, 11, 19, 7, 11, 2]  = 4
[6, 4, 11, 14, 17, 3, 17, 11, 2, 16, 14, 1, 2, 1, 15, 15, 12, 10, 11, 13]  = 6
[0, 19, 2, 0, 10, 10, 16, 9, 19, 9, 15, 0, 10, 18, 0, 17, 18, 18, 0, 9]    = 5
[1, 19, 17, 17, 0, 2, 14, 10, 10, 12, 5, 14, 16, 7, 15, 15, 18, 11, 17, 7] = 5

คุณหมายถึงOnce it counts the repetition, don't count againอะไร นอกจากนี้เนื่องจากเราต้องการค้นหาการทำซ้ำของจำนวนเต็มที่เฉพาะเจาะจงเราจะทราบได้อย่างไรว่าจำนวนเต็มใดที่จะค้นหาหากเราไม่ได้รับ ในที่สุดกรณีทดสอบนั้นค่อนข้างสับสน ซึ่งเป็นผลผลิตและที่อินพุต?
ศูนย์รวมแห่งความไม่รู้

4
ฉันได้แก้ไขสิ่งนี้เพื่อให้ชัดเจนขึ้น นี่คือสิ่งที่คุณตั้งใจหรือไม่ นอกจากนี้โปรดใส่คำตอบสำหรับกรณีทดสอบเหล่านั้น
Rɪᴋᴇʀ

1
ฉันได้เพิ่มคำตอบสำหรับกรณีทดสอบขออภัยถ้าฉันไปผิดพวกเขา
MickyT

1
ฉันลงคะแนนให้ปิดคำถามนี้จนกว่าคุณจะยืนยันว่านี่คือสิ่งที่คุณต้องการ
Rɪᴋᴇʀ

4
ที่เกี่ยวข้อง (แสดงรายการที่ไม่ซ้ำกันแทนจำนวนรายการที่ไม่ซ้ำ)
Kevin Cruijssen

คำตอบ:


15

R , 20 ไบต์

นี่คือสิ่งที่คุณเป็นหรือไม่ ใช้tableเพื่อนับการเกิดขึ้นของscanค่าอินพุตแต่ละค่า ทดสอบว่าการนับเป็น> 1 และผลรวม trues

sum(table(scan())>1)

ลองออนไลน์!


ใจของฉันเป็นduplicatedคนแรก - ผู้ถ่อมตนtableมีประโยชน์มากสำหรับการเล่นกอล์ฟ!
จูเซปเป้

@giuseppe table เป็นรายการโปรดในขณะนี้ :)
MickyT



7

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

-1 ขอบคุณ ngn

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

+/1<⊢∘≢⌸

ลองออนไลน์!

+/ ผลรวมของ

1< ไม่ว่าจะเป็น 1 น้อยกว่า

...  สำหรับองค์ประกอบที่ไม่ซ้ำกัน:

⊢∘ ไม่สนใจองค์ประกอบเฉพาะจริง

 จำนวนครั้งของเหตุการณ์ที่เกิดขึ้น


{1<≢⍵}⌸->1<⊢∘≢⌸
ngn

@ngn ขอบคุณ Incorporated
อดัม

6

C (เสียงดังกราว) 175 117 95 ไบต์

c(*a,*b){return*a-*b;}r(*l,m){qsort(l,m,4,c);return((!m||l[1]-*l)&l[-1]==*l)+(m?r(l+1,m-1):0);}

ลองออนไลน์!

นี่เป็นครั้งแรกที่ฉันส่งสิ่งใดสิ่งหนึ่งต่อไปนี้โปรดแจ้งให้เราทราบหากมีปัญหาเกี่ยวกับการจัดรูปแบบหรืออะไรก็ตาม

อัพเดทจากความคิดเห็น:

  • -58 ถึง 117 ไบต์จาก Jo King
  • -80 ถึง 95 ไบต์จาก ASCII เท่านั้น

ส่งต้นฉบับ


5
ยินดีต้อนรับเริ่มต้นที่ดี ฉันไม่ใช่คนซี แต่นี่คือลิงก์ไปยังเคล็ดลับสำหรับการเล่นกอล์ฟหน้าC
MickyT

2
117 ไบต์ d,i;c(*a,*b){return*a-*b;}r(l[],m){qsort(l,m,4,c);for(i=d=0;++i<m;)d+=((l[i+1]-l[i]||i>m-2)&&l[i-1]==l[i]);return d;}=> ดังที่ @ ASCII ระบุไว้เท่านั้นโปรแกรมincludeจะไม่ส่งผลต่อการรวบรวมโปรแกรมของคุณ
Jo King

2
@JoKing 100:d;c(*a,*b){return*a-*b;}r(*l,m){qsort(l,m,4,c);for(d=0;~m--;)d+=(!m||l[1]-*l)&l[-1]==*l++;return d;}
เพียง ASCII

1
@CollinPhillips ใช่ อย่างที่คุณเห็นในลิงค์ที่ฉันโพสต์มันก็ยังรวบรวมได้โดยไม่รวม
ASCII- เท่านั้น

2
95:c(*a,*b){return*a-*b;}r(*l,m){qsort(l,m,4,c);return((!m||l[1]-*l)&l[-1]==*l)+(m?r(l+1,m-1):0);}
ASCII เท่านั้น

5

C # (Visual C # Interactive Compiler) , 40 ไบต์

n=>n.GroupBy(c=>c).Count(c=>c.Count()>1)

ร่างแรกของสเป็คไม่ชัดเจนและฉันคิดว่ามันหมายถึงคืนองค์ประกอบทั้งหมดที่ปรากฏมากกว่าหนึ่งครั้ง นี่เป็นรุ่นที่อัปเดตแล้ว

อย่างใดฉันไม่ได้สังเกตว่ารหัสของฉันคืนจำนวนองค์ประกอบที่ปรากฏครั้งเดียว ขอบคุณ Paul Karam สำหรับการจับ!

ลองออนไลน์!


1
ผลลัพธ์ของคุณผิดต้องนับองค์ประกอบที่มีอย่างน้อย 2 เหตุการณ์ n=>n.GroupBy(c=>c).Count(c=>c.Count()>=2)มันควรจะเป็น OP กล่าวว่าคำตอบของรายการนี้คือ 2 รหัสของคุณส่งคืน 5 การเปลี่ยนแปลงที่ฉันให้คุณส่งคืน 2
พอล Karam

1
หรือเพียง>1เพื่อให้นับ 40 ไบต์
Paul Karam

@ PaulKaram ฉันไม่ได้สังเกตว่าขอบคุณ!
ศูนย์รวมแห่งความไม่รู้


4

J , 11 9 ไบต์

-2 ไบต์ขอบคุณ Jonah!

1#.1<1#.=

ลองออนไลน์!

ทางออกเดิม:

1#.(1<#)/.~

ลองออนไลน์!

คำอธิบาย:

        /.~   group the list by itself
   (   )      for each group
    1<#       is the length greater than 1
1#.           sum by base-1 conversion

เฮเลนเลน 1#.1<1#.=for 9 bytes + good ol 'จัดหมวดหมู่สนุก ๆ
โยนาห์

1
@Jonah ขอบคุณ! สุจริตฉันไม่ได้ตระหนักถึงสิ่งนี้
Galen Ivanov

1
@Jonah Nice!
อดัม

@ Adámและที่นี่ฉันดีใจที่ฉันได้รับ J เพื่อผูกกับ APL แพ้อีกแล้ว :)
โยนาห์



3

เยลลี่ขนาด 4 ไบต์

ĠITL

ลองออนไลน์!

...หรือ ĠIƇL

อย่างไร?

ĠITL - Link: list of integers   e.g. [234, 2, 12, 234, 5, 10, 1000, 2, 99, 234]
Ġ    - group indices by value        [[2,8],5,6,3,9,[1,4,10],7]
 I   - incremental differences       [[6],[],[],[],[],[3,6],[]]
  T  - truthy indices                [1,6]
   L - length                        2

จะกรองเพื่อให้ได้ผลลัพธ์ตามจริงของI( [[6],[3,6]]) ซึ่งมีความยาวตามที่ต้องการ


3

Perl 6 , 15 ไบต์

+*.repeated.Set

ลองออนไลน์!

สวยด้วยตนเองอธิบาย บล็อกโค้ดที่ไม่ระบุชื่อที่ได้รับจำนวน ( +) Setขององค์ประกอบจากrepeatedองค์ประกอบของอินพุต ( *)

ฉันรู้แล้วว่าฉันโพสต์คำตอบเดียวกันเกือบทุกคำถามที่เกี่ยวข้อง



3

Java 8, 74 73 ไบต์

L->L.stream().filter(i->L.indexOf(i)<L.lastIndexOf(i)).distinct().count()

ลองออนไลน์

คำอธิบาย:

L->                      // Method with ArrayList parameter and integer return-type
  L.stream()             //  Create a stream of the input-list
   .filter(i->           //  Filter it by:
     L.indexOf(i)        //   Where the first index of a value
     <L.lastIndexOf(i))  //   is smaller than the last index of a value
   .distinct()           //  Deduplicate this filtered list
   .count()              //  And return the count of the remaining values

3

APL (Dyalog Extended) , 8 7 ไบต์SBCS

ไม่ประสงค์ออกนามฟังก์ชั่นโดยปริยายคำนำหน้าโดยใช้วิธีการของโยนาห์

+/1<∪⍧⊢

ลองออนไลน์!

+/ จำนวนรวมที่เกิดขึ้น
  จริงคือผลรวมของความจริง

1< ที่หนึ่งน้อยกว่า

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

 นับใน

 อาร์กิวเมนต์ที่ไม่ได้แก้ไข


3

Haskell , 41 ไบต์

f(h:t)=sum[1|filter(==h)t==[h]]+f t
f _=0

ลองออนไลน์!

นับส่วนต่อท้ายที่องค์ประกอบแรกhปรากฏอย่างแน่นอนหนึ่งครั้งในส่วนtที่มาหลังจาก


Haskell , 40 ไบต์

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

ลองออนไลน์!

การขโมยวิธีการจากคำตอบอื่น ๆ


Dammit เราได้คำตอบเหมือนกันแน่นอน
ภูมิใจ haskeller

3

Haskell, 41 ไบต์

f[]=0
f(a:s)=sum[1|filter(==a)s==[a]]+f s

วิธีการแก้ปัญหานี้โดยทั่วไปนับจำนวนองค์ประกอบของรายการที่มีองค์ประกอบเดียวกันปรากฏอย่างแน่นอนอีกครั้งในรายการ


2

Haskell , 47 ไบต์

f[]=0
f(a:b)|x<-filter(/=a)b,x/=b=1+f x|1>0=f b

ลองออนไลน์!

นี่คือวิธีการไร้เดียงสา อาจมีบางสิ่งที่สามารถทำได้เพื่อปรับปรุงสิ่งนี้

f[]=0

เรากลับ0สำหรับรายการที่ว่างเปล่า

f(a:b)

ในกรณีของรายการที่ไม่ว่างเปล่าที่เริ่มต้นด้วยแล้วab

|x<-filter(/=a)b,x/=b=1+f x

หากการกรองaออกbแตกต่างจากb(ที่มีaอยู่b) เราจะคืนค่ามากกว่าที่fใช้bกับการaกรอง s

|1>0=f b

หากการกรองaไม่เปลี่ยนแปลงbเราก็จะวิ่งfไปตามส่วนที่เหลือ

นี่เป็นอีกวิธีที่คล้ายกันที่มีความยาวเท่ากัน:

f[]=0
f(a:b)|elem a b=1+f(filter(/=a)b)|1>0=f b

ลองออนไลน์!



2

ภาษา Wolfram 34 ไบต์

 Length@DeleteCases[Gather@#,{x_}]&

Gatherกลุ่มจำนวนเต็มเหมือนกันลงในรายการ DeleteCases[...{x_}]กำจัดรายการที่มีหมายเลขเดียว Lengthส่งคืนจำนวนรายการที่เหลืออยู่ (แต่ละรายการมีจำนวนเต็มเท่ากันสองตัวหรือมากกว่า


1
Count[{_,__}]@*Gather
alephalpha


2

Pyth, 6 ไบต์

l{.-Q{

ลองที่นี่

คำอธิบาย

l{.-Q{
     {Q   Deduplicate the (implicit) input.
  .-Q     Remove the first instance of each from the input.
l{        Count unique.


2

PHP, 39 ไบต์

โอกาสที่ดีในการใช้ตัวแปรตัวแปร :

foreach($argv as$v)$r+=++$$v==2;echo$r;

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง ทำงานด้วย-nrหรือลองออนไลน์


$argv[0]เป็น-และที่ปรากฏเพียงครั้งเดียวในการขัดแย้งจึงไม่ส่งผลกระทบต่อผล


1

องค์ประกอบ 40 ไบต์

_(#'{"2:0+4:'~1+";~2=[''1+""]$2+'[(#]'}`

ลองออนไลน์!

สิ่งนี้ต้องใช้อินพุตในรูปแบบที่แม่นยำเช่น[234, 2, 1000, 2, 99, 234](ล้อมรอบด้วย[]เครื่องหมายจุลภาคและเว้นวรรคระหว่างจำนวนเต็ม)

คำอธิบาย:

_                                        input
 (#                                      delete the [ at start of input
   '{"                               '}  WHILE the string is non-empty
   '{"2:                             '}    duplicate it
   '{"  0+                           '}    add 0 to coerce to integer (gets next number in array)
   '{"    4:                         '}    make 3 additional copies
   '{"      '                        '}    temporarily move 1 copy to control stack
   '{"       ~                       '}    fetch the current map value for given integer
   '{"        1+                     '}    increment map value
   '{"          "                    '}    retrieve temporary copy of integer (the key for the map)
   '{"           ;                   '}    store updated map value
   '{"            ~                  '}    fetch map value again (1 if 1st instance, 2 if 2nd, etc.)
   '{"             2=                '}    test for map value = 2, this is the first duplication
   '{"               [      ]        '}    IF
   '{"               [''    ]        '}      move stuff from main stack to control stack
   '{"               [  1+  ]        '}      increment the counter of duplicate (bottom of stack)
   '{"               [    ""]        '}      move stuff back to main stack
   '{"                       $       '}    take length of current integer
   '{"                        2+     '}    add 2 (for the comma and space)
   '{"                          '[  ]'}    FOR loop with that number
   '{"                          '[(#]'}      trim those many characters from front of input string
                                       ` output result



1

สนิม 126 ไบต์

let f=|v:Vec<i32>|{let mut u=v.clone();u.sort();u.dedup();u.iter().filter(|i|v.iter().filter(|n|**n==**i).count()>1).count()};

ฉันยอมแพ้. โดยพื้นฐานแล้วนี่ก็เหมือนกับทับทิม มี "วิธีอื่น" ในการสร้างอาร์เรย์และจัดทำดัชนีโดยใช้ค่าในเวกเตอร์อินพุต +100000 อย่างไรก็ตามการแปลงประเภท (ตามการใช้งาน / เป็น i32) ใช้พื้นที่มากเกินไป



1

k, 8 ไบต์

+/1<#:'=

อ่านเป็น: ผลรวม (ความยาวแต่ละกลุ่ม)> 1

+/ is sum (plus over)

#:' is length each

= is group (ex. =1 2 1 6 7 2 generates 1 2 6 7!(0 2;1 5;,3;,4) (dictionary of unique value and its positions)

ใช้ตัวอย่าง (กรณีทดสอบครั้งแรก)

+/1<#:'=1 10 16 4 8 10 9 19 2 15 18 19 10 9 17 15 19 5 13 20

เขียน 4

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