Cuenta las ocurrencias de un conjunto en una lista

15

Dado un conjunto de cadenas no vacío y una lista de cadenas, averigüe cuántas veces se produce el conjunto en la lista, es decir, cuántas veces podría crear el conjunto con elementos de la lista. Cada elemento de la lista solo se puede usar una vez.

Sugerencia: un conjunto es una lista desordenada de elementos únicos.

Se aplican las reglas predeterminadas de entrada / salida .

No se permiten bibliotecas externas. Las bibliotecas estándar del compilador / intérprete están bien. Este es el código de golf, por lo que la solución más corta cuenta.


Casos de prueba:

["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

EDITAR: eliminó una oración que indica que los parámetros de entrada están definidos en el ámbito local. Esto contradice las reglas de IO predeterminadas vinculadas anteriormente.

Hubert Grzeskowiak
fuente
Sí, eso lo aclara. Sin embargo, estoy un poco colgado en la tercera oración. ¿Qué quieres decir con "no maneja objetos"?
Post Rock Garf Hunter
@WheatWizard algunos lenguajes no están orientados a objetos y no conocen el concepto de comparar objetos arbitrarios.
Hubert Grzeskowiak
1
Probablemente debería cambiarlo a orientado a objetos porque cada lenguaje que conozco maneja objetos de algún tipo, incluso si los objetos son una clase cerrada. También debo señalar que hay una gran cantidad de idiomas que tampoco pueden manejar cadenas en absoluto.
Post Rock Garf Hunter
@WheatWizard está bien, descripción actualizada. Ese párrafo estaba destinado a lenguajes como C, Assembler o Maple.
Hubert Grzeskowiak
¿Qué lenguajes están orientados a objetos? ¿Qué deberían usar si no son cadenas? Creo que lo más fácil sería restringirlo solo a cadenas. O, alternativamente, solo enteros. Vea este consejo sobre el uso del tipo más simple que sea suficiente.
xnor

Respuestas:

12

Python, 30 bytes

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

Pruébalo en línea!

ovs
fuente
Buena esa. No pensé en usar el mapa. Puede ahorrar un poco usando print en lugar de definir un lambda BTW.
Hubert Grzeskowiak
1
@HubertGrzeskowiak Al cambiar lambdaa a, printel recuento de bytes es de hasta 37 debido a los dos input()s requeridos.
Post Rock Garf Hunter
@WheatWizard como se indica en el desafío, considere las entradas definidas en el ámbito local. NO es necesario que tenga las entradas definidas explícitamente, por ejemplo, como parámetros de función o entradas de usuario.
Hubert Grzeskowiak
@HubertGrzeskowiak si no hay una buena razón para ello, no debe sobrescribir nuestros valores predeterminados para tomar entradas y salidas y nuestros valores predeterminados para las presentaciones de
codegolf
@ovs oh, no estaba al tanto de esa publicación. Gracias.
Hubert Grzeskowiak
6

Jalea , 4 bytes

⁼þSṂ

Pruébalo en línea!

¿Cómo?

⁼þ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
fuente
6

Gelatina , 6 5 4 bytes

ċ@€Ṃ

Pruébalo en línea!

El primer argumento del programa es el conjunto, y el segundo argumento es la lista.

Explicación

ċ@€Ṃ
ċ@   -- 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 byte gracias a @ETHproductions

-1 byte nuevamente gracias a @ETHproductions

fireflame241
fuente
¡Muy agradable! Puede guardar un byte combinando los enlaces en una línea: ⁹ċ$€Ṃtengo la sensación de que puede
acortarse
Creo que ċ@€Ṃ funciona para salvar otro byte ... ( @revierte los argumentos ċ)
ETHproductions
@ETHproductions funciona correctamente por lo que he probado.
fireflame241
No existía hasta el 12 de mayo del año pasado, pero en lugar de @€(con argumentos invertidos para el programa) guarda otro byte: ¡ Pruébelo en línea!
Cadena no relacionada
6

JavaScript (ES6), 56 bytes

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

Pruébalo en línea

Alberto Rivera
fuente
1
Ahorre 2 bytes mediante el uso de una función anónima y otra al cursar los parámetros: n=>h=>Math.min(...n.map(c=>h.filter($=>$==c).length))para 53 bytes
Shaggy
5

JavaScript (ES6), 64 bytes

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

Asume ambos sy lson matrices de objetos. Utiliza la igualdad estricta de JavaScript para las comparaciones, por lo que, por ejemplo, [] === []es falso.

Neil
fuente
Muy interesante solución. Por favor devuelva o imprima el resultado. AFAIK esto devuelve una función anónima.
Hubert Grzeskowiak
2
@HubertGrzeskowiak El código que se muestra se evalúa como una función anónima. Cuando se llama, la función devuelve el recuento como se desea.
Neil
4

Haskell , 37 34 bytes

Gracias a @Laikoni por reducir tres bytes.

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

Llame con (set::[a]) # (list::[a])donde ase deriva cualquier tipo Eq.

Julian Wolf
fuente
En lugar de length[y|y<-l,y==x]que pueda usar sum[1|y<-l,y==x].
Laikoni
@Laikoni, ¿estás seguro de eso? Creo que necesitaría usar algo como sum[1|y<-l,y==x,_<-y], que llega a dos bytes más, sin embargo, definitivamente podría estar perdiendo algo allí
Julian Wolf
No importa, definitivamente tienes razón. Buena llamada.
Julian Wolf
3

CJam , 11 bytes

q~f{\e=}:e<

Pruébalo en línea!

Explicación

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
Gato de negocios
fuente
3

Mathematica, 24 bytes

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

Función pura que toma dos listas como argumentos en el orden sugerido y devuelve un entero no negativo. Tallycuenta cuántas ocurrencias de cada símbolo ocurren en la lista de entrada y #/.Rule@@@convierte cada elemento del conjunto de entrada en el número correspondiente de ocurrencias.

Greg Martin
fuente
3

T-SQL, 62 59 bytes

La versión anterior no funcionaba para sets sin coincidencias

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

Con s y l como tablas y columnas con el mismo nombre que la tabla

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
fuente
3

Swift, 39 bytes

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

explicación:

s.map{} pasa por cada palabra en sy producirá una serie de recuentos

w in nombra la palabra asignada para usar en el siguiente filtro

l.filter{} aplica un filtro a la matriz l

$0==w es la condición de filtro que coincide con la palabra w

.count da el número de elementos de l que cumplen la condición

.min() devuelve el recuento más bajo en el resultado asignado

usuario68380
fuente
1
Bienvenido a PPCG! He agregado formato de código para su solución. Puede hacer esto anteponiendo 4 espacios a líneas que contienen código.
Mego
3

APL (Dyalog) , 9 bytes

⌊/+/⎕∘.≡⎕

Pruébalo en línea!

 obtener entrada evaluada (lista de cadenas)

⎕∘.≡ obtener una entrada evaluada (conjunto de cadenas no vacío) y crear una tabla de equivalencia

+/ agregar a través

⌊/ mínimo a través

Adán
fuente
2

Perl 6 ,  37  18 bytes

37

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

Intentalo

Expandido:

{
  +( # 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 $_
}

Ver Conjuntos, Bolsas y Mezclas para más información.


18 años

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

Intentalo

Explicación:

@^b.Bagcree una bolsa a partir de la
{@^a}clave de valores en esa bolsa (devuelve una lista de recuentos)
.minobtenga el valor mínimo de la lista resultante


Brad Gilbert b2gills
fuente
Respuestas ordenadas, pero ninguna de estas funciones parecen programas completos
Julian Wolf
@JulianWolf Tenía la impresión de que se permitían fragmentos basados ​​en las declaraciones "Considere que ambas entradas se definen en el alcance actual como sy l" y "No es necesario definir una función". Fui y la edité de todos modos .
Brad Gilbert b2gills
Ah, tienes toda la razón. Eso debe haber sido editado en la pregunta después de que lo leí. En cualquier caso, me gusta la estética de esta versión incluso más que la anterior: la sintaxis de Perl siempre será un misterio para mí.
Julian Wolf
@JulianWolf Este no es realmente un buen ejemplo de código Perl 6. Recomendaría ver la charla de 1 hora de Ovidio Perl 6: por qué la gente está tan emocionada , o mirar la pestaña Recursos en Perl6.org .
Brad Gilbert b2gills
Sí, perdón por la confusión. Este es mi primer desafío y no sabía que ya hay reglas para la entrada y la salida. Lo cambié porque la mayoría de las respuestas usaban estas reglas incluso cuando no era obligatorio.
Hubert Grzeskowiak
2

Axioma, 42 bytes

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

código de prueba y resultados

(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
fuente
2

C ++, 203 201 bytes

¡Gracias a @Quentin por guardar dos bytes!

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

Pruébalo en línea!

Steadybox
fuente
L.begin()-> begin(L)guarda un byte :)
Quentin
Además, using T=std::vector<std::string>;guarda otro! Quién sabía que la sintaxis bonita moderna también podría ayudar al golf.
Quentin
@Quentin Lo intenté al principio. Probablemente hubo algún error tipográfico simple que no noté.
Steadybox
1

PHP, 74 bytes

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

Casos de prueba

PHP, 108 bytes

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

Casos de prueba

Jörg Hülsermann
fuente
1

Pyth, 5 bytes

hS/LF

Toma la lista primero y el segundo set. Banco de pruebas.

Explicación:

    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.
fuente
1

C #, 36 bytes

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

ny hson string[]y la salida es un int.

Pruébalo en línea!

Esta respuesta está inspirada en la lógica de @ovs y @Alberto Rivera. ¡Gracias!

aloisdg se muda a codidact.com
fuente
1

Java, 135 bytes

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

Este es mi primer código de desafío y respuesta de golf, así que no estoy seguro sobre el formato. ¿Tiene que ser un programa completo de compilación? ¿Necesito definir los parámetros? Sugerencias apreciadas.

EDITAR : código envuelto en una función. Gracias @Steadybox

Hubert Grzeskowiak
fuente
Una respuesta puede ser un programa completo, una función o alguna otra construcción similar a una función . Puede tomar los parámetros, por ejemplo, como argumentos para una función o desde una entrada estándar.
Steadybox
1

05AB1E , 7 bytes

v²y¢})W

Pruébalo en línea!

v   }   # For each item in the first list...
 ²y¢    # Count the occurances in the second list.
     )W # Take the minimum occurrence count, return.
Urna de pulpo mágico
fuente
1

Java, 114 bytes

<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 próximamente

Explicación

  • crea la variable local m.

  • asigna el conjunto a una secuencia.

  • para cada elemento, si el número de ocurrencias del elemento en la lista es menor que m, m se establece en ese valor.

  • devuelve m, que es el número de versiones completas del conjunto

Targz
fuente
0

R 54 bytes

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

Explicación: crear una tabla de los recuentos de solo los valores de la lista que también aparecen en la sublista.

Luego convierto la variable en un factor para generar ceros si un valor que aparece en la sublista no aparece en la lista. Finalmente, tomo el mínimo de los recuentos.

Michal
fuente
0

R, 61 57 44 bytes

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

Función anónima. Aparentemente no tienes que definir una función para este desafío. Guardado 13 bytes gracias a contar.

Explicación:

sum(l%in%x))devuelve el número de veces que se encuentra una cadena sen l.

lapply(s,function(x)) aplica eso a cada cadena en s separado y devuelve una lista de sumas.

min() devuelve el más pequeño de esa lista.

BLT
fuente
Podría reducirse a 40 Bytes con un ciclo for:z=c();for(i in s)z[i]=sum(l%in%i);min(z)
cuenta el
O incluso más de 37 bytes con sapply:min(sapply(s,function(x)sum(l%in%x)))
cuenta el
Brillante, siempre olvido que puedes sumar booleanos. Lo editaré más tarde. Me han dicho que necesito esa impresión () si no es una función.
BLT
0

JavaScript (ES6), 59 bytes

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

Intentalo

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"])([]))

Lanudo
fuente