Hitung pengulangan array


20

Anda akan menerima array dan harus mengembalikan jumlah bilangan bulat yang terjadi lebih dari satu kali.

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

Ini akan mengembalikan 2, karena masing-masing 234dan 2muncul lebih dari sekali.

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

Daftarnya tidak akan lebih dari 100k bilangan bulat, dan bilangan bulat di dalam daftar akan selalu berada di antara -100k dan 100k.

Bilangan bulat harus dihitung jika terjadi lebih dari satu kali, jadi jika bilangan bulat terjadi 3 kali maka itu hanya akan dihitung sebagai satu bilangan bulat yang diulang.

Uji kasus

[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

Apa maksudmu Once it counts the repetition, don't count again? Juga, karena kita ingin menemukan pengulangan bilangan bulat tertentu, bagaimana kita tahu bilangan bulat mana yang harus dicari jika kita tidak diberikannya? Terakhir, kasus uji agak membingungkan; yang merupakan output dan yang merupakan input?
Perwujudan Ketidaktahuan

4
Saya telah mengedit ini untuk membuatnya sedikit lebih jelas. Apakah ini yang Anda maksudkan? Harap berikan jawaban untuk kasus-kasus uji tersebut.
Rɪᴋᴇʀ

1
Saya telah menambahkan beberapa jawaban untuk kasus uji, maaf jika saya salah melakukannya
MickyT

1
Saya telah memilih untuk menutup pertanyaan ini sampai Anda mengonfirmasi ini yang Anda maksudkan.
Rɪᴋᴇʀ

4
Terkait (menampilkan item yang tidak unik, bukan jumlah item yang tidak unik).
Kevin Cruijssen

Jawaban:


15

R , 20 byte

Apakah ini yang Anda cari? Penggunaan tableuntuk menghitung kemunculan dari masing-masing nilai scaninput. Tes jika hitung adalah> 1 dan jumlah jejak.

sum(table(scan())>1)

Cobalah online!


Pikiranku duplicatedlebih dulu - yang sederhana tablesangat berguna untuk bermain golf!
Giuseppe

@giuseppe table menjadi favorit sekarang :)
MickyT



7

APL (Dyalog Unicode) , 9 8 byte SBCS

-1 terima kasih kepada ngn

Fungsi awalan diam-diam anonim.

+/1<⊢∘≢⌸

Cobalah online!

+/ jumlah dari

1< apakah 1 kurang dari

...  untuk setiap elemen unik:

⊢∘ mengabaikan elemen unik yang sebenarnya,

 hitungan kemunculannya


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

@ ngn Terima kasih. Tergabung.
Adám

6

C (dentang) 175 117 95 byte

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);}

Cobalah online!

Ini adalah pertama kalinya saya mengirimkan salah satu dari ini, jadi beri tahu saya jika ada masalah dengan pemformatan atau apa pun.

Pembaruan dari komentar:

  • -58 hingga 117 byte dari Jo King
  • -80 hingga 95 byte dari ASCII-only

pengiriman asli


5
Selamat datang, awal yang bagus. Saya bukan orang C tetapi di sini ada tautan ke kiat untuk bermain golf C halaman
MickyT

2
117 byte => 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;}. Seperti yang dicatat oleh ASCII saja, includes tidak mempengaruhi kompilasi program Anda
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 ya. seperti yang Anda lihat di tautan yang saya posting, masih dapat dikompilasi dengan baik tanpa menyertakan
ASCII-only

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 byte

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

Draf pertama spesifikasi tidak jelas, dan saya pikir itu berarti mengembalikan semua elemen yang muncul lebih dari sekali. Ini adalah versi yang diperbarui.

Entah bagaimana saya tidak melihat bahwa kode saya mengembalikan jumlah elemen yang muncul sekali. Terima kasih kepada Paul Karam karena menangkap itu!

Cobalah online!


1
Output Anda salah, perlu menghitung elemen dengan 2 kejadian atau lebih. Seharusnya begitu n=>n.GroupBy(c=>c).Count(c=>c.Count()>=2). OP mengatakan jawaban dari daftar ini adalah 2. Kode Anda kembali 5. Perubahan yang saya berikan kepada Anda mengembalikan 2.
Paul Karam

1
Atau hanya >1untuk menjaga hitungan 40 byte
Paul Karam

@ PaulKaram Saya tidak menyadarinya, terima kasih!
Perwujudan Ketidaktahuan


4

J , 11 9 byte

-2 byte terima kasih untuk Jonah!

1#.1<1#.=

Cobalah online!

Solusi asli:

1#.(1<#)/.~

Cobalah online!

Penjelasan:

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

Hai Galen. 1#.1<1#.=untuk 9 byte + menyenangkan untuk mengklasifikasikan diri sendiri.
Jonah

1
@Jonah, terima kasih! Jujur, saya tidak menyadari hal ini.
Galen Ivanov

1
@Jonah Bagus!
Adám

@ Adám dan di sini saya senang saya mendapatkan J untuk diikat dengan APL. Digagalkan lagi :)
Jonah



3

Jelly , 4 byte

ĠITL

Cobalah online!

...Atau ĠIƇL

Bagaimana?

Ġ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

akan menyaring untuk menjaga hanya hasil yang benar dari I( [[6],[3,6]]) yang juga memiliki panjang yang diinginkan.




3

Java 8, 74 73 byte

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

Cobalah online.

Penjelasan:

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

Haskell, 41 byte

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

Solusi ini pada dasarnya menghitung berapa banyak elemen dalam daftar yang memiliki elemen yang sama persis muncul satu kali kemudian dalam daftar.


2

Haskell , 47 byte

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

Cobalah online!

Ini adalah pendekatan naif. Kemungkinan ada sesuatu yang bisa dilakukan untuk memperbaikinya.

f[]=0

Kami kembali 0untuk daftar kosong

f(a:b)

Dalam hal daftar yang tidak kosong dimulai dengan adan kemudian b.

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

Jika penyaringan akeluar bberbeda dari b(yaitu ada adi b) maka kami mengembalikan 1 lebih dari yang fditerapkan bdengan as disaring.

|1>0=f b

Jika pemfilteran atidak berubah, bmaka kita jalankan fsisanya.

Berikut ini adalah pendekatan serupa lainnya yang memiliki panjang yang sama:

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

Cobalah online!



2

Bahasa Wolfram 34 byte

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

Gathermengelompokkan bilangan bulat identik ke dalam daftar. DeleteCases[...{x_}]menghilangkan daftar yang berisi satu nomor. Lengthmengembalikan jumlah daftar yang tersisa (masing-masing berisi dua atau lebih bilangan bulat yang identik.


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


2

Pyth, 6 byte

l{.-Q{

Coba di sini

Penjelasan

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


2

PHP, 39 byte

kesempatan yang baik untuk menggunakan variabel variabel :

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

mengambil input dari argumen baris perintah. Jalankan dengan -nratau coba online .


$argv[0]adalah -dan itu hanya muncul sekali dalam argumen, sehingga tidak mempengaruhi hasilnya.


1

Elemen , 40 byte

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

Cobalah online!

Ini membutuhkan masukan untuk menjadi dalam format yang tepat seperti [234, 2, 1000, 2, 99, 234](tertutup dengan[] koma dan spasi di antara bilangan bulat).

Penjelasan:

_                                        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

Retina 0.8.2 , 19 byte

O`.+
m`^(.+)(¶\1)+$

Cobalah online! Tautan termasuk test suite yang membagi setiap baris pada koma. Penjelasan:

O`.+

Urutkan nilai yang sama bersama.

m`^(.+)(¶\1)+$

Hitung jumlah proses setidaknya dua nilai.


1

Bersih , 59 54 byte

import StdEnv,StdLib
$l=sum[1\\[_,_:_]<-group(sort l)]

Cobalah online!

Urutkan daftar, kelompokkan elemen yang berdekatan, dan hitung jumlahnya dengan lebih dari 1 item.


1

Rust, 126 byte

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()};

Saya menyerah. Ini pada dasarnya sama dengan Ruby. Ada "cara lain" membuat array dan mengindeks ke dalamnya menggunakan nilai-nilai dalam vektor input, +100000, namun konversi jenis (seperti usize / as i32) mengambil terlalu banyak ruang.



1

k, 8 byte

+/1<#:'=

terbaca sebagai: jumlah (panjang masing-masing kelompok)> 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)

Gunakan contoh (test case pertama)

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

menulis 4

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.