Contare le occorrenze di un set in un elenco


15

Dato un set di stringhe non vuoto e un elenco di stringhe, scopri quante volte il set si presenta nell'elenco, ovvero quante volte è possibile creare il set con elementi dall'elenco. Ogni elemento dell'elenco può essere utilizzato una sola volta.

Suggerimento: un set è un elenco non ordinato di elementi unici.

Si applicano le regole di input / output predefinite .

Non sono consentite librerie esterne. Le librerie standard del compilatore / interprete sono a posto. Questo è il golf del codice, quindi la soluzione più breve conta.


Casi 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: rimossa una frase in cui si afferma che i parametri di input sono definiti nell'ambito locale. Ciò contraddice le regole IO predefinite collegate sopra.


Sì, questo lo chiarisce. Tuttavia sono un po 'appeso alla terza frase. Cosa intendi con "non gestisce gli oggetti"?
Post Rock Garf Hunter,

@WheatWizard alcune lingue non sono orientate agli oggetti e non conoscono il concetto di confronto di oggetti arbitrari.
Hubert Grzeskowiak,

1
Probabilmente dovresti cambiarlo in orientato agli oggetti perché ogni linguaggio che conosco gestisce oggetti di qualche tipo anche se gli oggetti sono una classe chiusa. Vorrei anche sottolineare che ci sono molte lingue che non sono in grado di gestire le stringhe.
Post Rock Garf Hunter,

@WheatWizard ok, descrizione aggiornata. Quel paragrafo era destinato a linguaggi come C, Assembler o Maple.
Hubert Grzeskowiak,

Quali lingue sono orientate agli oggetti? Cosa dovrebbero usare se non le stringhe? Penso che la cosa più semplice sarebbe limitare solo alle stringhe. O, in alternativa, solo numeri interi. Leggi questo consiglio sull'uso del tipo più semplice che è sufficiente.
xnor

Risposte:


12

Python, 30 byte

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

Provalo online!


Ben fatto. Non ho pensato di usare la mappa. Puoi risparmiare un po 'usando print invece di definire una lambda BTW.
Hubert Grzeskowiak,

1
@HubertGrzeskowiak La modifica di lambdain a printporta il conteggio dei byte fino a 37 a causa dei due input()secondi richiesti.
Post Rock Garf Hunter,

@WheatWizard come indicato nella sfida, considera gli input definiti nell'ambito locale. NON è necessario che gli ingressi siano definiti in modo esplicito, ad esempio come parametri di funzione o ingressi utente.
Hubert Grzeskowiak,

@HubertGrzeskowiak se non c'è una buona ragione per questo, non dovresti sovrascrivere i nostri valori predefiniti per prendere input e output e i nostri valori predefiniti per l'invio di codegolf
ovs

@ovs oh, non ero a conoscenza di quel post. Grazie.
Hubert Grzeskowiak,

6

Gelatina , 4 byte

⁼þSṂ

Provalo online!

Come?

⁼þ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)

6

Gelatina , 6 5 4 byte

ċ@€Ṃ

Provalo online!

Il primo argomento del programma è l'insieme e il secondo argomento è l'elenco.

Spiegazione

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

-1 byte di nuovo grazie a @ETHproductions


Molto bella! Puoi salvare un byte combinando i collegamenti in una riga: ⁹ċ$€Ṃho la sensazione che può essere accorciata usando l'argomento implicito giusto al posto di ...
ETHproductions

Penso che ċ@€Ṃ funzioni per salvare un altro byte ... (il@ċ
funzioni

@ETHproductions Funziona correttamente per quanto ho testato.
fireflame241

Non esisteva fino al 12 maggio dell'anno scorso, ma al posto di @€(con argomenti invertiti per il programma) salva ancora un altro byte: provalo online!
Stringa non correlata

6

JavaScript (ES6), 56 byte

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

Provalo online


1
Salva 2 byte utilizzando una funzione anonima e un'altra valutando i parametri: n=>h=>Math.min(...n.map(c=>h.filter($=>$==c).length))per 53 byte
Shaggy

5

JavaScript (ES6), 64 byte

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

Presuppone entrambi se lsono matrici di oggetti. Utilizza l'uguaglianza rigorosa di JavaScript per i confronti, quindi ad esempio [] === []è falso.


Soluzione molto interessante Si prega di restituire o stampare il risultato. AFAIK questo restituisce una funzione anonima.
Hubert Grzeskowiak,

2
@HubertGrzeskowiak Il codice mostrato mostra una funzione anonima. Quando viene chiamata, la funzione restituisce il conteggio come desiderato.
Neil,

4

Haskell , 37 34 byte

Grazie a @Laikoni per la rasatura di tre byte.

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

Chiama da (set::[a]) # (list::[a])dove aderiva qualsiasi tipo Eq.


Invece di length[y|y<-l,y==x]te puoi usare sum[1|y<-l,y==x].
Laikoni,

@Laikoni, ne sei sicuro? Penso che avrei bisogno di usare qualcosa di simile sum[1|y<-l,y==x,_<-y], che esce a due byte più a lungo - potrei sicuramente mancare qualcosa lì, però
Julian Wolf

Non importa, hai decisamente ragione. Ottima scelta.
Julian Wolf,

3

CJam , 11 byte

q~f{\e=}:e<

Provalo online!

Spiegazione

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

3

Mathematica, 24 byte

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

Funzione pura che prende due liste come argomenti nell'ordine suggerito e restituisce un numero intero non negativo. Tallyconta quante occorrenze di ciascun simbolo si verificano nell'elenco di input e #/.Rule@@@converte ogni elemento dell'insieme di input nel numero di occorrenze corrispondente.


3

T-SQL, 62 59 byte

La versione precedente non funzionava per i set senza corrispondenze

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

Con s come tabelle e colonne denominate uguali alla tabella

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

3

Rapido, 39 byte

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

spiegazione:

s.map{} passa attraverso ogni parola in se produce una serie di conteggi

w in nomina la parola mappata da utilizzare nel filtro successivo

l.filter{} applica un filtro all'array l

$0==w è la parola di corrispondenza del filtro condizione w

.count fornisce il numero di elementi di l che soddisfano la condizione

.min() restituisce il conteggio più basso nel risultato mappato


1
Benvenuti in PPCG! Ho aggiunto la formattazione del codice per la tua soluzione. Puoi farlo anteponendo 4 spazi alle righe che contengono codice.
Mego

3

APL (Dyalog) , 9 byte

⌊/+/⎕∘.≡⎕

Provalo online!

 ottenere input valutati (elenco di stringhe)

⎕∘.≡ ottenere input valutati (set di stringhe non vuoto) e creare una tabella di equivalenza

+/ aggiungere attraverso

⌊/ minimo attraverso


2

Perl 6 ,  37  18 byte

37

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

Provalo

Allargato:

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

Vedi Set, Borse e Mix per ulteriori informazioni.


18

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

Provalo

Spiegazione:

@^b.Bagcreare un Bag dalla
{@^a}chiave dei valori in quel Bag (restituisce un elenco di conteggi)
.minottenere il valore minimo dell'elenco risultante



Risposte precise, ma nessuna di queste sembra funzioni / programmi completi
Julian Wolf,

@JulianWolf Avevo l'impressione che gli snippet fossero consentiti in base alle istruzioni "Considera entrambi gli input definiti nell'ambito attuale come s e l" e "Non è necessario definire una funzione". Sono andato e l'ho modificato comunque .
Brad Gilbert b2gills

Ah, hai perfettamente ragione. Deve essere stato modificato nella domanda dopo averlo letto. In ogni caso, mi piace l'estetica di questa versione anche più dell'ultima: la sintassi di Perl sarà sempre un mistero per me.
Julian Wolf,

@JulianWolf Questo non è davvero un buon esempio di codice Perl 6. Consiglierei di vedere il discorso di 1 ora di Ovidio Perl 6 - Perché le persone sono così eccitate , o guardare la scheda Risorse su Perl6.org .
Brad Gilbert b2gills

Sì, scusa per la confusione. Questa è la mia prima chllenge e non sapevo che esistessero già delle regole per l'input e l'output. L'ho cambiato perché la maggior parte delle risposte utilizzava queste regole anche se non era necessario.
Hubert Grzeskowiak,

2

Assioma, 42 byte

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

codice di prova e risultati

(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

2

C ++, 203 201 byte

Grazie a @Quentin per aver salvato due byte!

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

Provalo online!


L.begin()-> begin(L)salva un byte :)
Quentin il

Inoltre, ne using T=std::vector<std::string>;salva un altro! Chi sapeva che la sintassi piuttosto moderna poteva anche aiutare il golf.
Quentin,

@Quentin L'ho provato all'inizio. Probabilmente c'era un semplice errore di battitura che non avevo notato.
Steadybox,

1

PHP, 74 byte

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

Casi test

PHP, 108 byte

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

Casi test


1

Pyth, 5 byte

hS/LF

Prende l'elenco per primo e il secondo impostato. Suite di test.

Spiegazione:

    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


1

Java, 135 byte

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

Questa è la mia prima sfida e risposta per il golf del codice, quindi non sono sicuro del formato. Deve essere un programma di compilazione completo? Devo definire i parametri? Suggerimenti apprezzati.

EDIT : codice avvolto in una funzione. Grazie @Steadybox


Una risposta può essere un programma completo, una funzione o qualche altro costrutto simile a una funzione . È possibile prendere i parametri, ad esempio, come argomenti per una funzione o da input standard.
Steadybox,


1

Java, 114 byte

<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 in arrivo

Spiegazione

  • crea la variabile locale m.

  • mappa il set su uno stream.

  • per ogni elemento, se il numero di occorrenze dell'elemento nell'elenco è inferiore a m, m è impostato su quel valore.

  • ritorna m, che è il numero di versioni complete dell'insieme


0

R 54 byte

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

Spiegazione: creazione di una tabella dei conteggi dei soli valori nell'elenco che appaiono anche nell'elenco secondario.

Trasformo quindi la variabile in un fattore per generare zeri se un valore che appare nell'elenco secondario non compare nell'elenco. Infine, prendo il minimo dei conteggi.


0

R, 61 57 44 byte

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

Funzione anonima. Apparentemente non devi definire una funzione per questa sfida. Risparmiato 13 byte grazie al conteggio.

Spiegazione:

sum(l%in%x))restituisce il numero di volte in cui sviene trovata una stringa l.

lapply(s,function(x))applica questo a ciascuna stringa sseparatamente e restituisce un elenco di somme.

min() restituisce il più piccolo da quell'elenco.


Potrebbe essere ridotto a 40 byte con un ciclo for:z=c();for(i in s)z[i]=sum(l%in%i);min(z)
conta il

O anche oltre a 37 byte con sapply:min(sapply(s,function(x)sum(l%in%x)))
conta il

Fantastico, dimentico sempre che puoi sommare i booleani. Lo modificherò più avanti. Mi è stato detto che ho bisogno di print () se non è una funzione.
BLT,

0

JavaScript (ES6), 59 byte

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

Provalo

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.