Compter les répétitions d'un tableau

20

Vous recevrez un tableau et devez renvoyer le nombre d'entiers qui se produisent plusieurs fois.

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

Cela renverra 2, puisque chacun de 234et 2apparaîtra plus d'une fois.

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

La liste ne comportera jamais plus de 100 000 entiers et les entiers à l'intérieur de la liste seront toujours compris entre -100 000 et 100 000.

Les entiers doivent être comptés s'ils se produisent plus d'une fois, donc si un entier se produit 3 fois, il ne comptera toujours que comme un entier répété.

Cas de test

[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
la source
Qu'entendez-vous par Once it counts the repetition, don't count again? De plus, puisque nous voulons trouver la répétition d'un entier spécifique, comment saurions-nous quel entier rechercher si on ne le lui donne pas? Enfin, les cas de test sont un peu déroutants; qui sont sorties et qui sont entrées?
Incarnation de l'ignorance
4
J'ai édité ceci pour essayer de le rendre un peu plus clair. C'est bien ce que vous vouliez? Veuillez également indiquer les réponses pour ces cas de test.
Rɪᴋᴇʀ
1
J'ai ajouté quelques réponses aux cas de test, désolé si je me trompe
MickyT
1
J'ai voté pour fermer cette question jusqu'à ce que vous confirmiez que c'est ce que vous vouliez.
Rɪᴋᴇʀ
4
Liés (sortie des éléments non uniques, au lieu du nombre d'éléments non uniques).
Kevin Cruijssen

Réponses:

15

R , 20 octets

C'est ce que tu cherches? Permet tablede compter les occurrences de chacune des scanvaleurs d'entrée. Teste si le nombre est> 1 et additionne les vrais.

sum(table(scan())>1)

Essayez-le en ligne!

MickyT
la source
mon esprit est allé en duplicatedpremier - l'humble tableest si utile pour le golf!
Giuseppe
@giuseppe table est un favori maintenant :)
MickyT
9

Haskell , 42 octets

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

Essayez-le en ligne! Abuse le fait que les entiers de la liste sont garantis à l'intérieur de -100k et 100k.

Laikoni
la source
7

APL (Dyalog Unicode) , 9 8 octets SBCS

-1 grâce à ngn

Fonction de préfixe tacite anonyme.

+/1<⊢∘≢⌸

Essayez-le en ligne!

+/ somme de

1< si 1 est inférieur à

 Pour chaque élément unique:

⊢∘ ignorer l'élément unique réel,

 le nombre de ses occurrences

Adam
la source
{1<≢⍵}⌸->1<⊢∘≢⌸
ngn
@ngn Merci. Incorporé.
Adám
6

C (bruit) 175 117 95 bytes

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

Essayez-le en ligne!

C'est la première fois que j'en soumets un, alors faites-moi savoir s'il y a des problèmes de mise en forme ou quoi que ce soit.

Mises à jour des commentaires:

  • -58 à 117 octets de Jo King
  • -80 à 95 octets en ASCII uniquement

soumission originale

Collin Phillips
la source
5
Bienvenue, bon début. Je ne suis pas une personne C mais voici un lien vers un des conseils pour jouer au golf C Page
MickyT
2
117 octets => 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;}. Comme @ ASCII uniquement noté, les includes n'affectent pas la compilation de votre programme
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 uniquement le
1
@CollinPhillips oui. comme vous pouvez le voir dans le lien que j'ai posté, il compile toujours très bien sans les inclus
ASCII uniquement le
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);}
uniquement ASCII
5

C # (Visual C # Interactive Compiler) , 40 octets

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

Le premier brouillon de la spécification n'était pas clair, et j'ai pensé que cela signifiait retourner tous les éléments qui apparaissent plus d'une fois. Ceci est la version mise à jour.

D'une manière ou d'une autre, je n'ai pas remarqué que mon code renvoyait le nombre d'éléments apparus une fois. Merci à Paul Karam d'avoir attrapé ça!

Essayez-le en ligne!

Incarnation de l'ignorance
la source
1
Votre sortie est erronée, elle doit compter les éléments avec 2 occurrences ou plus. Ça devrait l'être n=>n.GroupBy(c=>c).Count(c=>c.Count()>=2). L'OP dit que la réponse de cette liste est 2. Votre code retourne 5. Le changement que je vous ai donné retourne 2.
Paul Karam
1
Ou tout simplement >1pour garder le nombre de 40 octets
Paul Karam
@PaulKaram Je ne l'ai pas remarqué, merci!
Incarnation de l'ignorance
4

J , 11 9 octets

-2 octets grâce à Jonah!

1#.1<1#.=

Essayez-le en ligne!

Solution originale:

1#.(1<#)/.~

Essayez-le en ligne!

Explication:

        /.~   group the list by itself
   (   )      for each group
    1<#       is the length greater than 1
1#.           sum by base-1 conversion
Galen Ivanov
la source
Salut Galen. 1#.1<1#.=pour 9 octets + bon plaisir d'auto-classification.
Jonah
1
@Jonah Merci! Honnêtement, je n'étais pas au courant de cela.
Galen Ivanov
1
@Jonah Nice!
Adám
@ Adám et ici, j'étais content d'avoir réussi à faire en sorte que J soit lié à APL. Déjoué à nouveau :)
Jonah
3

05AB1E , 4 octets

Ù¢≠O

Essayez-le en ligne! ou comme suite de tests

Explication

   O  # sum
  ≠   # the false values
 ¢    # in the count
Ù     # of each unique digit in input
Emigna
la source
Donc, toutes les valeurs qui ne sont pas 1 sont fausses?
Adám
@ Adám: Oui, c'est exact.
Emigna
3

Gelée , 4 octets

ĠITL

Essayez-le en ligne!

...Ou ĠIƇL

Comment?

Ġ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

filtrerait pour ne conserver que les résultats véridiques de I( [[6],[3,6]]) qui a également la longueur souhaitée.

Jonathan Allan
la source
3

Perl 6 , 15 octets

+*.repeated.Set

Essayez-le en ligne!

Assez explicite. Un bloc de code anonyme qui obtient le nombre ( +) Setdes éléments parmi les repeatedéléments de l'entrée ( *).

J'ai réalisé que j'avais publié presque la même solution exacte pour une question connexe.

Jo King
la source
3

Java 8, 74 73 octets

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

Essayez-le en ligne.

Explication:

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
la source
3

Haskell , 41 octets

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

Essayez-le en ligne!

Comptez les suffixes où le premier élément happaraît exactement une fois dans la partie suivante t.


Haskell , 40 octets

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

Essayez-le en ligne!

Voler la méthode à partir d'autres réponses.

xnor
la source
Bon sang
3

Haskell, 41 octets

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

Cette solution compte essentiellement combien d'éléments de la liste le même élément apparaît exactement une fois plus tard dans la liste.

fier haskeller
la source
2

Haskell , 47 octets

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

Essayez-le en ligne!

C'est l'approche naïve. Il y a probablement quelque chose qui pourrait être fait pour améliorer cela.

f[]=0

Nous revenons 0pour la liste vide

f(a:b)

Dans le cas d'une liste non vide commençant par apuis b.

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

Si le filtrage ade best différent de b(c'est-à-dire aest b), nous renvoyons 1 de plus fqu'appliqué bavec le as filtré.

|1>0=f b

Si le filtrage ane change pas, bnous parcourons simplement fle reste.

Voici une autre approche similaire qui a la même longueur:

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

Essayez-le en ligne!

Assistant de blé
la source
2

Langue Wolfram 34 octets

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

Gatherregroupe des entiers identiques dans des listes. DeleteCases[...{x_}]élimine les listes contenant un seul numéro. Lengthrenvoie le nombre de listes restantes (chacune contenant au moins deux entiers identiques.

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

Japt , 12 11 9 8 6 octets

ü èÈÊÉ

Avec beaucoup d'aide de @ ASCII uniquement et des suggestions de @Shaggy et @Luis felipe De jesus Munoz.

Essayez-le en ligne!

Quintec
la source
11
ASCII uniquement le
9 9 9?
ASCII uniquement le
8 8
ASCII uniquement
2
6
ASCII uniquement le
2
6 6
ASCII uniquement
2

Pyth, 6 octets

l{.-Q{

Essayez-le ici

Explication

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

la source
2

Brachylog , 7 octets

ọzt;1xl

Essayez-le en ligne!

Explication:

ọ          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.
Chaîne indépendante
la source
2

PHP, 39 octets

une belle occasion d'utiliser des variables variables :

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

prend l'entrée des arguments de la ligne de commande. Courez avec -nrou essayez-le en ligne .


$argv[0]est -et qui n'apparaît qu'une seule fois dans les arguments, donc cela n'affecte pas le résultat.

Titus
la source
1

Élément , 40 octets

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

Essayez-le en ligne!

Cela nécessite que l'entrée soit dans un format précis comme [234, 2, 1000, 2, 99, 234](entouré []d'une virgule et d'un espace entre les entiers).

Explication:

_                                        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
la source
1

Retina 0.8.2 , 19 octets

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

Essayez-le en ligne! Le lien comprend une suite de tests qui divise chaque ligne par des virgules. Explication:

O`.+

Triez des valeurs égales ensemble.

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

Comptez le nombre d'exécutions d'au moins deux valeurs.

Neil
la source
1

Nettoyer , 59 54 octets

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

Essayez-le en ligne!

Trie la liste, regroupe les éléments égaux adjacents et compte le nombre avec plus d'un élément.

Οurous
la source
1

Rouille, 126 octets

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

J'abandonne. C'est fondamentalement la même chose que Ruby. Il existe une "autre façon" de créer un tableau et de l'indexer en utilisant les valeurs du vecteur d'entrée, +100000, mais les conversions de type (comme usize / comme i32) prennent trop de place.

Don Bright
la source
1

k, 8 octets

+/1<#:'=

se lit comme suit: somme (longueur de chaque groupe)> 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)

Exemple d'utilisation (premier cas de test)

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

écrit 4

J. Sendra
la source