Policz powtórzenia tablicy


20

Otrzymasz tablicę i musisz zwrócić liczbę całkowitą, która występuje więcej niż jeden raz.

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

Będzie to powrót 2, ponieważ każdy 234i 2pojawić się więcej niż jeden raz.

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

Lista nigdy nie będzie dłuższa niż 100 000 liczb całkowitych, a liczby całkowite na liście zawsze będą zawierać się w przedziale od -100 000 do 100 000.

Liczby całkowite należy liczyć, jeśli występują więcej niż jeden raz, więc jeśli liczba całkowita wystąpi 3 razy, nadal będzie liczona jako jedna powtórzona liczba całkowita.

Przypadki testowe

[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

Co masz na myśli Once it counts the repetition, don't count again? Ponadto, ponieważ chcemy znaleźć powtórzenie określonej liczby całkowitej, skąd mielibyśmy wiedzieć, której liczby całkowitej szukać, jeśli jej nie otrzymamy? Wreszcie przypadki testowe są nieco mylące; które są wyjściowe, a które wejściowe?
Embodiment of Ignorance

4
Zredagowałem to, aby było trochę jaśniej. Czy to jest to, co zamierzałeś? Prosimy również o umieszczenie odpowiedzi w tych przypadkach testowych.
Rɪᴋᴇʀ

1
Dodałem kilka odpowiedzi do przypadków testowych, przepraszam, jeśli je
pomylę

1
Głosowałem za zamknięciem tego pytania, dopóki nie potwierdzisz tego, co zamierzałeś.
Rɪᴋᴇʀ

4
Powiązane (wyprowadzaj nieunikalne przedmioty, zamiast ilości nieunikalnych przedmiotów).
Kevin Cruijssen

Odpowiedzi:


15

R , 20 bajtów

Czy o to ci chodzi? Używa tabledo zliczania wystąpień każdej z scanwartości wejściowych. Sprawdza, czy liczba wynosi> 1 i sumuje wartości rzeczywiste.

sum(table(scan())>1)

Wypróbuj online!


mój umysł poszedł na duplicatedpierwszym miejscu - pokorny tablejest tak przydatny do gry w golfa!
Giuseppe

@giuseppe table jest teraz ulubionym :)
MickyT

9

Haskell , 42 bajty

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

Wypróbuj online! Nadużywa faktu, że liczby całkowite na liście mają gwarantowane wartości w zakresie od -100 do 100 000.



7

APL (Dyalog Unicode) , 9 8 bajtów SBCS

-1 dzięki ngn

Anonimowa ukryta funkcja prefiksu.

+/1<⊢∘≢⌸

Wypróbuj online!

+/ suma

1< czy 1 jest mniejsze niż

 Dla każdego unikalnego elementu:

⊢∘ ignorując rzeczywisty unikalny element,

 liczba jego wystąpień


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

@ngn Thanks. Rejestrowy.
Adám

6

C (brzęk) 175 117 95 bajtów

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

Wypróbuj online!

Po raz pierwszy przesłałem jeden z nich, więc daj mi znać, jeśli występują problemy z formatowaniem lub coś w tym stylu.

Aktualizacje z komentarzy:

  • -58 do 117 bajtów od Jo King
  • -80 do 95 bajtów tylko z ASCII

oryginalne zgłoszenie


5
Witamy, dobry początek. Nie jestem osobą C, ale tutaj jest link do wskazówek na temat gry w golfa na stronie C
MickyT

2
117 bajtów => 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;}. Jak zauważył tylko @ ASCII, includes nie wpływają na kompilację twojego programu
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;}
Tylko ASCII,

1
@CollinPhillips tak. jak widać w linku napisałem, to nadal kompiluje grzywny bez obejmuje
ASCII-tylko

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

5

C # (interaktywny kompilator Visual C #) , 40 bajtów

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

Pierwszy szkic specyfikacji był niejasny i myślałem, że oznacza to zwrócenie wszystkich elementów, które pojawiają się więcej niż jeden raz. To jest zaktualizowana wersja.

Jakoś nie zauważyłem, że mój kod zwrócił liczbę elementów, które pojawiły się raz. Dzięki Paulowi Karamowi za złapanie tego!

Wypróbuj online!


1
Twoje dane wyjściowe są nieprawidłowe, należy policzyć elementy z co najmniej 2 wystąpieniami. Powinno być n=>n.GroupBy(c=>c).Count(c=>c.Count()>=2). OP twierdzi, że odpowiedź z tej listy to 2. Twój kod zwraca 5. Zmiana, którą ci dałem, zwraca 2.
Paul Karam

1
Lub po prostu >1zachować liczbę 40 bajtów
Paul Karam

@PaulKaram Nie zauważyłem tego, dzięki!
Wcielenie nieznajomości


4

J , 11 9 bajtów

-2 bajty dzięki Jonaszowi!

1#.1<1#.=

Wypróbuj online!

Oryginalne rozwiązanie:

1#.(1<#)/.~

Wypróbuj online!

Wyjaśnienie:

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

Hej Galen. 1#.1<1#.=za 9 bajtów + dobra, klasyczna zabawa.
Jonasz

1
@Jonah Thanks! Szczerze mówiąc, nie byłam tego świadoma.
Galen Iwanow

1
@Jonah Nice!
Adám

@ Adám i tutaj cieszę się, że udało mi się powiązać J z APL. Ponownie udaremniono :)
Jonasz



3

Galaretka , 4 bajty

ĠITL

Wypróbuj online!

...Lub ĠIƇL

W jaki sposób?

Ġ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

filtrowałby, aby zachować tylko prawdziwe wyniki I( [[6],[3,6]]), które również mają pożądaną długość.


3

Perl 6 , 15 bajtów

+*.repeated.Set

Wypróbuj online!

Dość oczywiste. Anonimowy blok kodu, który pobiera liczbę ( +) Setelementów wśród repeatedelementów input ( *).

Zdałem sobie sprawę, że opublikowałem prawie takie samo rozwiązanie dla pokrewnego pytania.



3

Java 8, 74 73 bajty

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

Wypróbuj online.

Wyjaśnienie:

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 bajtów

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

To rozwiązanie w zasadzie liczy, ile elementów listy ma ten sam element, który pojawia się dokładnie raz później na liście.


2

Haskell , 47 bajtów

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

Wypróbuj online!

To jest naiwne podejście. Jest prawdopodobnie coś, co można zrobić, aby to poprawić.

f[]=0

Wracamy 0po pustą listę

f(a:b)

W przypadku niepustej listy zaczynającej się od, aa następnie b.

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

Jeśli odfiltrowanie az bjest inne niż b(to ajest w b), zwracamy 1 więcej niż fzastosowane bz aodfiltrowanym s.

|1>0=f b

Jeśli filtrowanie as się nie zmienia, bpo prostu przeglądamy fresztę.

Oto inne podobne podejście, które ma tę samą długość:

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

Wypróbuj online!



2

Język Wolfram 34 bajty

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

Gathergrupuje identyczne liczby całkowite w listy. DeleteCases[...{x_}]eliminuje listy zawierające jeden numer. Lengthzwraca liczbę pozostałych list (każda zawierająca dwie lub więcej identycznych liczb całkowitych.


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


2

Pyth, 6 bajtów

l{.-Q{

Wypróbuj tutaj

Wyjaśnienie

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


2

PHP, 39 bajtów

miła okazja do zastosowania zmiennych zmiennych :

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

pobiera dane wejściowe z argumentów wiersza poleceń. Uruchom -nrlub wypróbuj online .


$argv[0]jest -i pojawia się tylko raz w argumentach, więc nie wpływa na wynik.


1

Element , 40 bajtów

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

Wypróbuj online!

Wymaga to, aby dane wejściowe miały dokładny format, taki jak [234, 2, 1000, 2, 99, 234](zamknięty []przecinkiem i spacją między liczbami całkowitymi).

Wyjaśnienie:

_                                        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 bajtów

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

Wypróbuj online! Link zawiera pakiet testowy, który dzieli każdą linię przecinkami. Wyjaśnienie:

O`.+

Sortuj równe wartości razem.

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

Policz liczbę przebiegów co najmniej dwóch wartości.



1

Rdza, 126 bajtów

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

Poddaję się. Jest to w zasadzie to samo co Ruby. Istnieje „inny sposób” tworzenia tablicy i indeksowania do niej przy użyciu wartości w wektorze wejściowym, +100000, jednak konwersje typów (jako usize / jako i32) zajmują zbyt dużo miejsca.



1

k, 8 bajtów

+/1<#:'=

brzmi: suma (długość każdej grupy)> 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)

Użyj przykładu (pierwszy przypadek testowy)

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

pisze 4

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.