Bir dizinin tekrarlarını sayma


20

Bir dizi alırsınız ve bir kereden fazla oluşan tamsayıların sayısını döndürmeniz gerekir.

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

Bu her yana, 2 dönecektir 234ve 2bir kereden fazla görünür.

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

Liste asla 100k tamsayıdan uzun olmayacak ve listedeki tamsayılar her zaman -100k ile 100k arasında olacaktır.

Tamsayılar bir kereden fazla ortaya çıkarsa sayılmalıdır, bu nedenle tamsayı 3 kez oluşursa, yine de yalnızca bir tekrarlanan tamsayı olarak sayılır.

Test senaryoları

[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

Ne demek istiyorsun Once it counts the repetition, don't count again? Ayrıca, belirli bir tamsayının tekrarını bulmak istediğimizden, verilmezse hangi tamsayıyı arayacağımızı nasıl bileceğiz? Son olarak, test senaryoları biraz kafa karıştırıcı; hangileri çıktı, hangileri girdi?
Cehaletin Somutlaştırılması

4
Bunu biraz daha açık hale getirmek için düzenledim. İstediğiniz bu mu? Ayrıca, lütfen bu test senaryoları için cevaplar koyun.
Rɪᴋᴇʀ

1
Test
senaryolarına

1
İstediğiniz şeyin bu olduğunu onaylayana kadar bu soruyu kapatmak için oy kullandım.
Rɪᴋᴇʀ

4
İlgili (benzersiz olmayan öğelerin miktarı yerine benzersiz olmayan öğeleri çıktılar).
Kevin Cruijssen

Yanıtlar:


15

R , 20 bayt

Arkanda olan bu mu? Giriş değerlerinin tableher birinin oluşumlarını saymak için kullanır scan. Sayım> 1 olup olmadığını test eder ve doğruları toplar.

sum(table(scan())>1)

Çevrimiçi deneyin!


aklım duplicatedilk gitti - mütevazı tablegolf için çok yararlı!
Giuseppe

@giuseppe masa şimdi bir favori :)
MickyT



7

APL (Dyalog Unicode) , 9 8 bayt SBCS

-1 sayesinde ngn

Anonim zımni önek fonksiyonu.

+/1<⊢∘≢⌸

Çevrimiçi deneyin!

+/ toplamı

1< 1'den küçük olup olmadığı

 Her benzersiz öğe için:

⊢∘ gerçek benzersiz öğeyi göz ardı ederek,

 oluşumlarının sayısı


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

@ngn Teşekkürler. Anonim.
Adam

6

C (çınlama) 175 117 95 bayt

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

Çevrimiçi deneyin!

Bunlardan birini ilk kez gönderdim, bu yüzden biçimlendirme ile ilgili herhangi bir sorun olup olmadığını bana bildirin.

Yorumlardan güncellemeler:

  • Jo King'den -58 ila 117 bayt
  • Yalnızca ASCII'den -80 ila 95 bayt

orijinal sunum


5
Hoş geldiniz, iyi bir başlangıç. C kişi değilim ama burada golf C sayfası için ipuçları için bir bağlantı
MickyT

2
117 bayt => 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;}. Sadece 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;}
Sadece ASCII

1
@CollinPhillips evet. Gönderdiğim bağlantıda gördüğünüz gibi, hala içermeyen iyi derliyor
ASCII-sadece

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

5

C # (Visual C # Etkileşimli Derleyici) , 40 bayt

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

Spesifikasyonun ilk taslağı belirsizdi ve bir kereden fazla görünen tüm unsurları iade etmek anlamına geldiğini düşündüm. Bu güncellenmiş versiyon.

Her nasılsa, kodumun bir kez görünen öğelerin sayısını döndürdüğünü fark etmedim. Paul Karam'a bunu yakaladığı için teşekkürler!

Çevrimiçi deneyin!


1
Çıktınız yanlış, 2 veya daha fazla oluşum içeren öğeleri saymak gerekiyor. Olmalı n=>n.GroupBy(c=>c).Count(c=>c.Count()>=2). OP bu listenin cevabının 2 olduğunu söylüyor. Kodunuz 5 döndürür. Size verdiğim değişiklik 2 döndürür.
Paul Karam

1
Ya da sadece >140 bayt sayısını korumak için
Paul Karam

@PaulKaram Bunu fark etmedim, teşekkürler!
Cehaletin Somutlaştırılması


4

J , 11 9 bayt

Jonah sayesinde -2 bayt!

1#.1<1#.=

Çevrimiçi deneyin!

Orijinal çözüm:

1#.(1<#)/.~

Çevrimiçi deneyin!

Açıklama:

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

Selam Galen. 1#.1<1#.=9 bayt + iyi ol 'kendini sınıflandırmak eğlenceli.
Jonah

1
@Jonah Teşekkürler! Dürüst olmak gerekirse, bunun farkında değildim.
Galen Ivanov

1
@Jonah Güzel!
Adám

@ Adám ve burada J'nin APL ile bağlaması beni memnun etti. Yine başarısız oldu :)
Jonah



3

Jöle , 4 bayt

ĠITL

Çevrimiçi deneyin!

...Veya ĠIƇL

Nası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

istenen uzunluğa sahip I( [[6],[3,6]]) yönteminin yalnızca doğru sonuçlarını tutmak için filtreleyecektir .




3

Java 8, 74 73 bayt

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

Çevrimiçi deneyin.

Açıklama:

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 bayt

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

Bu çözüm temel olarak, listeden kaç öğenin tam olarak bir kez daha listede göründüğünü sayar.


2

Haskell , 47 bayt

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

Çevrimiçi deneyin!

Bu naif bir yaklaşımdır. Bunu iyileştirmek için yapılabilecek bir şey var.

f[]=0

0Boş liste için geri dönüyoruz

f(a:b)

Boş olmayan listesinde durumunda başlayarak ave daha sonra b.

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

Filtre ise atakım bfarklı b(yani aiçinde b), daha sonra geri dönmek 1 'den fazla ftatbik bile afiltre s.

|1>0=f b

Filtreleme Eğer as değişmez bo zaman sadece koşmakf kalanı boyunca.

İşte aynı uzunlukta başka bir benzer yaklaşım:

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

Çevrimiçi deneyin!



2

Wolfram Dili 34 bayt

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

Gatherözdeş tam sayıları listeler halinde gruplandırır. DeleteCases[...{x_}]tek bir sayı içeren listeleri ortadan kaldırır. Lengthkalan listelerin sayısını döndürür (her biri iki veya daha fazla aynı tamsayı içerir.


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


2

Pyth, 6 bayt

l{.-Q{

Burada deneyin

açıklama

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


2

PHP, 39 bayt

değişken değişkenleri kullanmak için güzel bir fırsat :

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

komut satırı bağımsız değişkenlerinden girdi alır. Birlikte çalışın-nr veya çevrimiçi deneyin .


$argv[0]olduğunu -o sonucu etkilemeyecek şekilde ve sadece bir kez argümanlar o görünür.


1

Öğe , 40 bayt

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

Çevrimiçi deneyin!

Bu, girdinin aşağıdaki gibi kesin bir biçimde olmasını gerektirir [234, 2, 1000, 2, 99, 234]([] tamsayılar arasında virgül ve boşlukla kapsanmış) .

Açıklama:

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

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

Çevrimiçi deneyin! Bağlantı, her satırı virgül üzerine ayıran test paketini içerir. Açıklama:

O`.+

Eşit değerleri birlikte sıralayın.

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

En az iki değerin çalışma sayısını sayın.


1

Temiz , 59 54 bayt

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

Çevrimiçi deneyin!

Listeyi sıralar, bitişik eşit öğeleri gruplandırır ve 1'den fazla öğe içeren sayıyı sayar.


1

Pas, 126 bayt

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

Pes ediyorum. Bu temelde Ruby ile aynı. Bir dizi oluşturmak ve giriş vektörü +100000'deki değerleri kullanarak dizine dizin oluşturmak için "başka bir yol" vardır, ancak tür dönüşümleri (usize / i32 olarak) çok fazla yer kaplar.



1

k, 8 bayt

+/1<#:'=

şu şekilde okunur: toplam (her grubun uzunluğu)> 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)

Örnek kullanın (ilk test örneği)

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

yazar 4

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.