Compter les occurrences d'un ensemble dans une liste

15

Étant donné un ensemble de chaînes non vide et une liste de chaînes, découvrez combien de fois l'ensemble se produit dans la liste, c'est-à-dire combien de fois vous pouvez créer l'ensemble avec des éléments de la liste. Chaque élément de la liste ne peut être utilisé qu'une seule fois.

Astuce: un ensemble est une liste non ordonnée d'articles uniques.

Les règles d'entrée / sortie par défaut s'appliquent.

Aucune bibliothèque externe autorisée. Les bibliothèques standard du compilateur / interprète sont correctes. C'est le golf de code, donc la solution la plus courte compte.


Cas de test:

["apple", "banana"], ["apple", "pear", "apple", "banana", "banana"] => 2

["apple", "banana"], ["apple", "pear", "apple", "banana", "apple"] => 1

["apple", "banana", "pear"], ["apple", "banana", "kiwi", "apple"] => 0

["coconut"], [] => 0

EDIT: suppression d'une phrase indiquant que les paramètres d'entrée sont définis dans la portée locale. Cela contredit les règles d'E / S par défaut liées ci-dessus.

Hubert Grzeskowiak
la source
Oui, cela clarifie les choses. Cependant, je suis un peu accroché à la troisième phrase. Qu'entendez-vous par «ne gère pas les objets»?
Post Rock Garf Hunter
@WheatWizard certains langages ne sont pas orientés objet et ne connaissent pas le concept de comparaison d'objets arbitraires.
Hubert Grzeskowiak
1
Vous devriez probablement changer cela en orienté objet car chaque langage que je connais gère des objets d'un certain type même si les objets sont une classe fermée. Je dois également souligner qu'il existe de nombreuses langues qui ne peuvent pas du tout gérer les chaînes.
Post Rock Garf Hunter
@WheatWizard ok, description mise à jour. Ce paragraphe était destiné à des langages tels que C, Assembleur ou Maple.
Hubert Grzeskowiak
Quels langages sont orientés objet? Que devraient-ils utiliser sinon des chaînes? Je pense que la chose la plus simple serait de se limiter aux seules chaînes. Ou, alternativement, uniquement des entiers. Consultez ces conseils sur l'utilisation du type le plus simple qui suffit.
xnor

Réponses:

12

Python, 30 octets

lambda s,l:min(map(l.count,s))

Essayez-le en ligne!

ovs
la source
Joli. Je n'ai pas pensé à utiliser la carte. Vous pouvez économiser un peu en utilisant l'impression au lieu de définir un lambda BTW.
Hubert Grzeskowiak
1
@HubertGrzeskowiak La modification de la valeur lambdaen a printamène le nombre d'octets à 37 en raison des deux input()s requis.
Post Rock Garf Hunter
@WheatWizard comme indiqué dans le défi, considérez les entrées définies dans la portée locale. Vous n'êtes PAS obligé d'avoir les entrées explicitement définies, par exemple en tant que paramètres de fonction ou entrées utilisateur.
Hubert Grzeskowiak
@HubertGrzeskowiak s'il n'y a pas de bonne raison à cela, vous ne devriez pas écraser nos valeurs par défaut pour la prise d'entrée et de sortie et nos valeurs par défaut pour les soumissions de
codegolf
@ovs oh, je n'étais pas au courant de ce message. Merci.
Hubert Grzeskowiak
6

Gelée , 4 octets

⁼þSṂ

Essayez-le en ligne!

Comment?

⁼þSṂ - Main link: list theSet, list theList
 þ   - outer product using the dyadic operation:
⁼    -     is equal? (non-vectorising)
  S  - sum (vectorises) (yields the number of times each element of theSet appears in theList)
   Ṃ - minimum (can only make the minimum as a multiple)
Jonathan Allan
la source
6

Gelée , 6 5 4 octets

ċ@€Ṃ

Essayez-le en ligne!

Le premier argument du programme est l'ensemble et le deuxième argument est la liste.

Explication

ċ@€Ṃ
ċ@   -- Create a link which finds the number of occurrences of 
          its left argument in its right argument (the list)
  €  -- Map this link over each element in the first argument
          of the program (the set)
   Ṃ -- Minimum value of this.

-1 octet grâce à @ETHproductions

-1 octet encore grâce à @ETHproductions

fireflame241
la source
Très agréable! Vous pouvez enregistrer un octet en combinant les liens en une seule ligne: ⁹ċ$€Ṃj'ai le sentiment que je peux le raccourcir en utilisant l'argument implicite de droite à la place de ...
ETHproductions
Je pense que cela ċ@€Ṃ fonctionne pour économiser un autre octet ... (l' @inverse les arguments ċ)
ETHproductions
@ETHproductions Fonctionne correctement pour autant que j'ai testé.
fireflame241
Il n'existait pas avant le 12 mai de l'année dernière, mais à la place de @€(avec des arguments inversés au programme) enregistre encore un autre octet: Essayez-le en ligne!
Unrelated String
6

JavaScript (ES6), 56 octets

f=(n,h)=>Math.min(...n.map(c=>h.filter($=>$==c).length))

Essayez-le en ligne

Alberto Rivera
la source
1
Économisez 2 octets en utilisant une fonction anonyme et une autre en curryant les paramètres: n=>h=>Math.min(...n.map(c=>h.filter($=>$==c).length))pour 53 octets
Shaggy
5

JavaScript (ES6), 64 octets

(s,l)=>l.map(e=>m[s.indexOf(e)]++,m=s.map(e=>0))&&Math.min(...m)

Suppose les deux set lsont des tableaux d'objets. Utilise une stricte égalité JavaScript pour les comparaisons, donc par exemple [] === []est faux.

Neil
la source
Solution très intéressante. Veuillez retourner ou imprimer le résultat. AFAIK cela renvoie une fonction anonyme.
Hubert Grzeskowiak
2
@HubertGrzeskowiak Le code tel qu'indiqué correspond à une fonction anonyme. Lorsqu'elle est appelée, la fonction renvoie le nombre comme souhaité.
Neil
4

Haskell , 37 34 octets

Merci à @Laikoni d'avoir rasé trois octets.

s#l=minimum[sum[1|y<-l,y==x]|x<-s]

Appelez avec (set::[a]) # (list::[a])an'importe quel type dérivant Eq.

Julian Wolf
la source
Au lieu de length[y|y<-l,y==x]vous pouvez utiliser sum[1|y<-l,y==x].
Laikoni
@Laikoni, êtes-vous sûr de cela? Je pense que j'aurais besoin d'utiliser quelque chose comme sum[1|y<-l,y==x,_<-y], ce qui fait deux octets de plus - je pourrais certainement manquer quelque chose là-bas
Julian Wolf
Peu importe, vous avez certainement raison. Bon appel.
Julian Wolf
3

CJam , 11 octets

q~f{\e=}:e<

Essayez-le en ligne!

Explication

q~           e# Read and eval the input
  f{\e=}     e# Map each item in the set to the number of times it appears in the list
        :e<  e# Find the minimum of the resulting list
Chat d'affaires
la source
3

Mathematica, 24 octets

Min[#/.Rule@@@Tally@#2]&

Fonction pure prenant deux listes comme arguments dans l'ordre suggéré et retournant un entier non négatif. Tallycompte le nombre d'occurrences de chaque symbole dans la liste d'entrée et #/.Rule@@@convertit chaque élément de l'ensemble d'entrée en nombre d'occurrences correspondant.

Greg Martin
la source
3

T-SQL, 62 59 octets

La version précédente ne fonctionnait pas pour les ensembles sans correspondance

select top 1(select count(*)from l where l=s)from s order by 1

Avec s et l comme tables et colonnes nommées de la même manière que la table

select top 1         -- return only the first result
    (select count(*) -- count of rows
     from l          -- from table l
     where l=s)      -- for each l equal
from s               -- to each from s
order by 1           -- sort by count ascending
MickyT
la source
3

Swift, 39 octets

s.map{w in l.filter{$0==w}.count}.min()

explication:

s.map{} passe par chaque mot en s et produira un tableau de comptes

w in nomme le mot mappé à utiliser dans le filtre suivant

l.filter{} applique un filtre au tableau l

$0==w est le mot correspondant à la condition du filtre w

.count donne le nombre d'éléments de l qui remplissaient la condition

.min() renvoie le nombre le plus bas du résultat mappé

user68380
la source
1
Bienvenue chez PPCG! J'ai ajouté un formatage de code pour votre solution. Vous pouvez le faire en ajoutant 4 espaces aux lignes contenant du code.
Mego
3

APL (Dyalog) , 9 octets

⌊/+/⎕∘.≡⎕

Essayez-le en ligne!

 obtenir une entrée évaluée (liste de chaînes)

⎕∘.≡ obtenir une entrée évaluée (ensemble de chaînes non vide) et créer une table d'équivalence

+/ ajouter à travers

⌊/ minimum à travers

Adam
la source
2

Perl 6 ,  37  18 octets

37

{+(($_=@^a⊍@^b)≽@a)&&.values.min}

Essayez-le

Étendu:

{
  +( # turn into a 0 if False

    (
      $_ =        # store into $_ the result of
        @^a  @^b # use the baggy multiplication operator
    )  @a        # is that the baggy superset of the set
  )

  &&          # if that is True

  .values.min # get the minimum value from the Bag in $_
}

Voir Ensembles, sacs et mélanges pour plus d'informations.


18

{@^b.Bag{@^a}.min}

Essayez-le

Explication:

@^b.Bagcréer un sac à partir de la
{@^a}clé de valeurs dans ce sac (retourne une liste de comptes)
.minobtenir la valeur minimale de la liste résultante


Brad Gilbert b2gills
la source
Réponses soignées, mais ni l'une ni l'autre ne ressemble à des fonctions / programmes complets
Julian Wolf
@JulianWolf J'avais l'impression que les extraits étaient autorisés sur la base des déclarations «Considérez les deux entrées définies dans la portée actuelle comme s et l» et «Vous n'avez pas besoin de définir une fonction.» Je suis allé et l'ai édité quand même .
Brad Gilbert b2gills
Ah, tu as tout à fait raison. Cela a dû être modifié dans la question après l'avoir lu. En tout cas, j'aime l'esthétique de cette version encore plus que la précédente - la syntaxe de Perl restera toujours un mystère pour moi.
Julian Wolf
@JulianWolf Ce n'est pas vraiment un bon exemple de code Perl 6. Je recommande de voir le discours de 1hr d'Ovide Perl 6 - Pourquoi les gens sont tellement excités , ou regardant le Ressources onglet sur Perl6.org .
Brad Gilbert b2gills
Ouais, désolé pour la confusion. C'est mon premier défi et je ne savais pas qu'il existait déjà des règles d'entrée et de sortie. Je l'ai changé parce que la plupart des réponses utilisaient ces règles même si elles n'étaient pas obligatoires.
Hubert Grzeskowiak
2

Axiome, 42 octets

f(a,b)==reduce(min,[count(x,b)for x in a])

code de test et résultats

(28) -> f(["1","2"], ["1", "2", "1", "1", "7"])
   (28)  1
                                                    Type: PositiveInteger
(29) -> f(["apple","banana"],["apple","pear","apple","banana","banana"])
   (29)  2
                                                    Type: PositiveInteger
(30) -> f(["apple","banana"],["apple","pear","apple","banana","apple"])
   (30)  1
                                                    Type: PositiveInteger
(31) -> f(["apple","banana","pear"],["apple","banana","kiwi","apple"])
   (31)  0
RosLuP
la source
2

C ++, 203 201 octets

Merci à @Quentin d'avoir économisé deux octets!

#import<vector>
#import<string>
using T=std::vector<std::string>;
int f(T S,T L){for(int j,b,i=0;;++i)for(auto s:S){for(b=j=0;j<L.size();++j)if(L[j]==s){b=1;L.erase(begin(L)+j);break;}if(!b)return i;}}

Essayez-le en ligne!

Steadybox
la source
L.begin()-> begin(L)enregistre un octet :)
Quentin
En using T=std::vector<std::string>;sauve aussi un autre! Qui savait que la jolie syntaxe moderne pourrait également aider au golf.
Quentin
@Quentin J'ai essayé ça au début. Il y avait probablement une faute de frappe simple que je n'ai pas remarquée.
Steadybox
1

PHP, 74 octets

<?foreach($_GET[0]as$v)$t[]=array_count_values($_GET[1])[$v];echo+min($t);

Cas de test

PHP, 108 octets

<?[$x,$y]=$_GET;echo($a=array_intersect)($x,$y)==$x?min(($a._key)(array_count_values($y),array_flip($x))):0;

Cas de test

Jörg Hülsermann
la source
1

Pyth, 5 octets

hS/LF

Prend la liste en premier et le deuxième ensemble. Suite de tests.

Explication:

    F  Expand the input into l and s (not literally, 
                  since those are function names in Pyth, but...)
   L   for d in s:
  /        Count instances of d in l
   L   Package all the results as a list
 S     Sort the results smallest-first
h      grab the smallest element
Steven H.
la source
1

C #, 36 octets

f=(n,h)=>n.Min(c=>h.Count(x=>x==c));

net hsont string[]et la sortie est un int.

Essayez-le en ligne!

Cette réponse est inspirée par la logique de @ovs et @Alberto Rivera. Je vous remercie!

aloisdg passe à codidact.com
la source
1

Java, 135 octets

int f(List<String> s,List<String> l){int n=0,i=0;while(i<s.size()){if(!l.remove(s.get(i++)))break;if(i==s.size()){n++;i=0;}};return n;}

Ceci est mon premier défi et réponse de golf de code, donc je ne suis pas sûr du format. Doit-il s'agir d'un programme de compilation complet? Dois-je définir les paramètres? Suggestions appréciées.

EDIT : code encapsulé dans une fonction. Merci @Steadybox

Hubert Grzeskowiak
la source
Une réponse peut être un programme complet, une fonction ou une autre construction semblable à une fonction . Vous pouvez prendre les paramètres par exemple comme arguments dans une fonction ou depuis une entrée standard.
Steadybox
1

05AB1E , 7 octets

v²y¢})W

Essayez-le en ligne!

v   }   # For each item in the first list...
 ²y¢    # Count the occurances in the second list.
     )W # Take the minimum occurrence count, return.
Urne de poulpe magique
la source
1

Java, 114 octets

<T>int a(Set<T>b,List<T>c){int m=2e32;b.stream().map(i->{int j=java.util.Collections.frequency(c,i);m=j<m?j:m;});return m;}

Tio arrive bientôt

Explication

  • crée la variable locale m.

  • mappe l'ensemble à un flux.

  • pour chaque élément, si le nombre d'occurrences de l'élément dans la liste est inférieur à m, m est défini sur cette valeur.

  • renvoie m, qui est le nombre de versions complètes de l'ensemble

Targz
la source
0

R 54 octets

f<-function(s,l) min(table(factor(l[l%in%s],levels=s)))

Explication: création d'un tableau des décomptes uniquement des valeurs de la liste qui apparaissent également dans la sous-liste.

Je transforme ensuite la variable en facteur afin de générer des zéros si une valeur qui apparaît dans la sous-liste n'apparaît pas dans la liste. Enfin, je prends le minimum de comptes.

Michal
la source
0

R, 61 57 44 octets

print(min(sapply(s,function(x)sum(l%in%x))))

Fonction anonyme. Apparemment, vous n'avez pas à définir de fonction pour ce défi. Enregistré 13 octets grâce au compte.

Explication:

sum(l%in%x))renvoie le nombre de fois où une chaîne sest trouvée dans l.

lapply(s,function(x)) applique cela à chaque chaîne s séparément et renvoie une liste de sommes.

min() renvoie le plus petit de cette liste.

BLT
la source
Peut être ramené à 40 octets avec une boucle for:z=c();for(i in s)z[i]=sum(l%in%i);min(z)
count
Ou encore plus loin à 37 octets avec sapply:min(sapply(s,function(x)sum(l%in%x)))
comptez le
Brillant, j'oublie toujours que vous pouvez additionner des booléens. Je modifierai cela plus tard. On m'a dit que j'avais besoin de print () si ce n'est pas une fonction.
BLT
0

JavaScript (ES6), 59 octets

a=>b=>a.reduce((x,y)=>(l=b.filter(s=>s==y).length)>x?x:l)|0

Essayez-le

f=

a=>b=>a.reduce((x,y)=>(l=b.filter(s=>s==y).length)>x?x:l)|0

console.log(f(["apple","banana"])(["apple","pear","apple","banana","banana"]))
console.log(f(["apple","banana"])(["apple", "pear", "apple", "banana", "apple"]))
console.log(f(["apple","banana","pear"])(["apple","banana","kiwi","apple"]))
console.log(f(["coconut"])([]))

Hirsute
la source