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
jayko03
sumber
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!

MickyT
sumber
Pikiranku duplicatedlebih dulu - yang sederhana tablesangat berguna untuk bermain golf!
Giuseppe
@giuseppe table menjadi favorit sekarang :)
MickyT
9

Haskell , 42 byte

f s=sum[1|x<-[-9^6..9^6],filter(==x)s>[x]]

Cobalah online! Menyalahgunakan fakta bilangan bulat dalam daftar dijamin dalam -100k dan 100k.

Laikoni
sumber
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

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

Collin Phillips
sumber
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!

Perwujudan Ketidaktahuan
sumber
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
Galen Ivanov
sumber
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

05AB1E , 4 byte

Ù¢≠O

Cobalah online! atau sebagai Test Suite

Penjelasan

   O  # sum
  ≠   # the false values
 ¢    # in the count
Ù     # of each unique digit in input
Emigna
sumber
Jadi semua nilai yang bukan 1 salah?
Adám
@ Adám: Ya, itu benar.
Emigna
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.

Jonathan Allan
sumber
3

Perl 6 , 15 byte

+*.repeated.Set

Cobalah online!

Cukup jelas. Blok kode anonim yang mendapat hitungan ( +) Setdari elemen di antara repeatedelemen input ( *).

Saya menyadari bahwa saya telah memposting hampir solusi yang sama persis untuk pertanyaan terkait.

Jo King
sumber
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
Kevin Cruijssen
sumber
3

Haskell , 41 byte

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

Cobalah online!

Hitung akhiran di mana elemen pertama hmuncul tepat sekali di bagian tyang muncul setelahnya.


Haskell , 40 byte

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

Cobalah online!

Mencuri metode dari jawaban lain.

Tidak
sumber
Sialan, kami punya jawaban yang sama persis
haskeller bangga
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.

haskeller bangga
sumber
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!

Wisaya Gandum
sumber
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.

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

Japt , 12 11 9 8 6 byte

ü èÈÊÉ

Dengan banyak bantuan dari @ ASCII-Only, dan saran dari @Shaggy dan @Luis felipe De jesus Munoz.

Cobalah online!

Quintec
sumber
11
ASCII
9 9 9?
ASCII
8 8
ASCII
2
6
ASCII
2
6 6
ASCII-only
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.

sumber
2

Brachylog , 7 byte

ọzt;1xl

Cobalah online!

Penjelasan:

ọ          For every unique element E of the input, [E, how many times E occurs]
 zt        The last elements of the previous value.
   ;1x     With every 1 removed,
      l    how many there are.
String yang tidak terkait
sumber
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.

Titus
sumber
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
PhiNotPi
sumber
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.

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

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

jangan cerah
sumber
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

J. Sendra
sumber