Zähle Vorkommen einer Menge in einer Liste

15

Finden Sie bei einer nicht leeren Menge von Zeichenfolgen und einer Liste von Zeichenfolgen heraus, wie oft die Menge in der Liste vorkommt, dh wie oft Sie die Menge mit Elementen aus der Liste erstellen könnten. Jedes Element aus der Liste kann nur einmal verwendet werden.

Hinweis: Ein Set ist eine ungeordnete Liste einzigartiger Gegenstände.

Es gelten die Standard- Ein- / Ausgaberegeln .

Keine externen Bibliotheken erlaubt. Compiler / Interpreter-Standardbibliotheken sind in Ordnung. Dies ist Codegolf, daher zählt die kürzeste Lösung.


Testfälle:

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

BEARBEITEN: Ein Satz wurde entfernt, der besagt, dass die Eingabeparameter im lokalen Bereich definiert sind. Dies widerspricht den oben verknüpften Standard-E / A-Regeln.

Hubert Grzeskowiak
quelle
Ja, das klärt es. Ich bin jedoch ein wenig auf den dritten Satz aufgehängt. Was meinst du mit "behandelt keine Objekte"?
Weizen-Assistent
@ WheatWizard Einige Sprachen sind nicht objektorientiert und kennen das Konzept des Vergleichs beliebiger Objekte nicht.
Hubert Grzeskowiak
1
Sie sollten dies wahrscheinlich in objektorientiert ändern, da jede mir bekannte Sprache Objekte eines bestimmten Typs verarbeitet, auch wenn es sich bei Objekten um eine geschlossene Klasse handelt. Ich möchte auch darauf hinweisen, dass es eine ganze Reihe von Sprachen gibt, die auch überhaupt keine Zeichenfolgen verarbeiten können.
Weizen-Assistent
@ WheatWizard OK, aktualisierte Beschreibung. Dieser Absatz war für Sprachen wie C, Assembler oder Maple gedacht.
Hubert Grzeskowiak
Welche Sprachen sind objektorientiert? Was sollen sie verwenden, wenn nicht Zeichenfolgen? Ich denke, am einfachsten wäre es, sich auf Saiten zu beschränken. Oder alternativ nur ganze Zahlen. Lesen Sie diesen Rat , um den einfachsten Typ zu verwenden, der ausreicht.
xnor

Antworten:

12

Python, 30 Bytes

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

Probieren Sie es online!

ovs
quelle
Schön. Ich habe nicht darüber nachgedacht, eine Karte zu verwenden. Sie können ein wenig sparen, indem Sie "Drucken" verwenden, anstatt ein Lambda BTW zu definieren.
Hubert Grzeskowiak
1
@HubertGrzeskowiak Durch Ändern von lambdaauf a wird printdie Byteanzahl aufgrund der zwei input()erforderlichen Werte auf 37 erhöht .
Weizen-Assistent
@WheatWizard Berücksichtigen Sie, wie in der Abfrage angegeben, die im lokalen Bereich definierten Eingaben. Sie müssen die Eingaben NICHT explizit definieren, z. B. als Funktionsparameter oder Benutzereingaben.
Hubert Grzeskowiak
@HubertGrzeskowiak Wenn es keinen guten Grund dafür gibt, sollten Sie unsere Standardeinstellungen für Eingabe und Ausgabe und unsere Standardeinstellungen für Codegolf-Einreichungen
Ovs
@ovs oh, mir war dieser Beitrag nicht bekannt. Vielen Dank.
Hubert Grzeskowiak
6

Gelee , 4 Bytes

⁼þSṂ

Probieren Sie es online!

Wie?

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

Jelly , 6 5 4 Bytes

ċ@€Ṃ

Probieren Sie es online!

Das erste Argument des Programms ist die Menge, und das zweite Argument ist die Liste.

Erläuterung

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

Nochmals -1 Byte dank @ETHproductions

fireflame241
quelle
Sehr schön! Sie können ein Byte speichern, indem Sie die Links in einer Zeile zusammenfassen: ⁹ċ$€ṂIch habe das Gefühl, dass Sie es mit dem implizit richtigen Argument anstelle von ...
ETHproductions 20.04.17
Ich denke, es ċ@€Ṃ funktioniert, um ein weiteres Byte zu speichern ... (das @kehrt die Argumente um ċ)
ETHproductions
@ETHproductions Funktioniert soweit ich getestet habe korrekt.
fireflame241
Es gab es erst am 12. Mai des letzten Jahres, aber anstelle von @€(mit umgekehrten Argumenten zum Programm) spart ein weiteres Byte: Probieren Sie es online!
Nicht verwandte String
6

JavaScript (ES6), 56 Byte

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

Probieren Sie es online aus

Alberto Rivera
quelle
1
Sparen Sie 2 Bytes mit einer anonymen Funktion und eine weitere mit den Parametern: n=>h=>Math.min(...n.map(c=>h.filter($=>$==c).length))für 53 Bytes
Shaggy
5

JavaScript (ES6), 64 Byte

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

Nimmt beides an sund list ein Array von Objekten. Verwendet JavaScript für Vergleiche mit strikter Gleichheit, ist also beispielsweise [] === []falsch.

Neil
quelle
Sehr interessante Lösung. Bitte senden oder drucken Sie das Ergebnis. AFAIK dies gibt eine anonyme Funktion zurück.
Hubert Grzeskowiak
2
@HubertGrzeskowiak Der angezeigte Code wird zu einer anonymen Funktion ausgewertet. Beim Aufruf gibt die Funktion den gewünschten Zählerstand zurück.
Neil
4

Haskell , 37 34 Bytes

Vielen Dank an @Laikoni für das Abschneiden von drei Bytes.

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

Rufen Sie mit (set::[a]) # (list::[a])woher akommt irgendein Typ Eq.

Julian Wolf
quelle
Anstelle von length[y|y<-l,y==x]Ihnen können verwenden sum[1|y<-l,y==x].
Laikoni
@Laikoni, bist du dir da sicher? Ich glaube, ich müsste so etwas verwenden sum[1|y<-l,y==x,_<-y], das zwei Bytes länger ist - ich könnte dort aber definitiv etwas vermissen
Julian Wolf
Egal, du hast definitiv recht. Guter Anruf.
Julian Wolf
3

CJam , 11 Bytes

q~f{\e=}:e<

Probieren Sie es online!

Erläuterung

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
Geschäfts-Katze
quelle
3

Mathematica, 24 Bytes

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

Reine Funktion, die zwei Listen als Argumente in der vorgeschlagenen Reihenfolge verwendet und eine nicht negative Ganzzahl zurückgibt. Tallyzählt, wie viele Vorkommen jedes Symbols in der Eingabeliste vorkommen, und #/.Rule@@@konvertiert jedes Element der Eingabemenge in die entsprechende Anzahl von Vorkommen.

Greg Martin
quelle
3

T-SQL, 62-59 Bytes

Die vorherige Version funktionierte nicht für Sets ohne Übereinstimmungen

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

Mit s und l als Tabellen und Spalten mit demselben Namen wie die Tabelle

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

Schnell, 39 Bytes

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

Erläuterung:

s.map{} Durchläuft jedes Wort in s und erzeugt eine Reihe von Zählungen

w in Benennt das zugeordnete Wort zur Verwendung im nächsten Filter

l.filter{} Wendet einen Filter auf das Array l an

$0==w ist das Filterbedingungs-Übereinstimmungswort w

.count gibt die Anzahl der Elemente von l an, die die Bedingung erfüllen

.min() Gibt die niedrigste Anzahl im zugeordneten Ergebnis zurück

user68380
quelle
1
Willkommen bei PPCG! Ich habe die Code-Formatierung für Ihre Lösung hinzugefügt. Sie können dies tun, indem Sie den Zeilen, die Code enthalten, 4 Leerzeichen voranstellen.
Mego
3

APL (Dyalog) , 9 Bytes

⌊/+/⎕∘.≡⎕

Probieren Sie es online!

 ausgewertete Eingabe abrufen (Liste der Zeichenfolgen)

⎕∘.≡ ausgewertete Eingabe abrufen (nicht leerer Satz von Zeichenfolgen) und Äquivalenztabelle erstellen

+/ hinzufügen über

⌊/ Minimum über

Adam
quelle
2

Perl 6 ,  37  18 Bytes

37

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

Versuch es

Erweitert:

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

Siehe Sets, Beutel und MischungenWeitere Informationen finden .


18

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

Versuch es

Erläuterung:

@^b.BagErstellen Sie einen Beutel aus dem Werteschlüssel
{@^a}in diesem Beutel (gibt eine Liste mit Zählwerten zurück),
.minum den Mindestwert der resultierenden Liste zu erhalten


Brad Gilbert b2gills
quelle
Ordentliche Antworten, aber keine davon sehen aus wie Funktionen / vollständige Programme
Julian Wolf
@JulianWolf Ich hatte den Eindruck, dass Snippets zulässig sind, basierend auf den Anweisungen "Betrachten Sie beide Eingaben als s und l im aktuellen Bereich definiert." Und "Sie müssen keine Funktion definieren." Ich ging und bearbeitete es trotzdem .
Brad Gilbert b2gills
Ah, du hast vollkommen recht. Das muss in der Frage bearbeitet worden sein, nachdem ich es gelesen habe. In jedem Fall gefällt mir die Ästhetik dieser Version noch besser als die der letzten - Perls Syntax wird mir immer ein Rätsel sein.
Julian Wolf
@JulianWolf Dies ist kein wirklich gutes Beispiel für Perl 6-Code. Ich würde empfehlen, Ovids einstündigen Vortrag über Perl 6 - Warum die Leute so aufgeregt sind , oder die Registerkarte Ressourcen auf Perl6.org zu besuchen .
Brad Gilbert b2gills
Entschuldigung für die Verwirrung. Dies ist meine erste Herausforderung und ich wusste nicht, dass es bereits Regeln für die Eingabe und Ausgabe gibt. Ich habe es geändert, weil die meisten Antworten diese Regeln verwendeten, obwohl dies nicht erforderlich war.
Hubert Grzeskowiak
2

Axiom, 42 Bytes

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

Testcode und Ergebnisse

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

C ++ 203 201 Bytes

Vielen Dank an @Quentin für das Speichern von zwei 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;}}

Probieren Sie es online!

Steadybox
quelle
L.begin()-> begin(L)spart ein Byte :)
Quentin
Auch using T=std::vector<std::string>;spart ein anderer! Wer moderne, hübsche Syntax kennt, kann auch beim Golfen helfen.
Quentin
@Quentin Ich habe das zuerst versucht. Wahrscheinlich gab es einen einfachen Tippfehler, den ich nicht bemerkte.
Steadybox
1

PHP, 74 Bytes

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

Testfälle

PHP, 108 Bytes

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

Testfälle

Jörg Hülsermann
quelle
1

Pyth, 5 Bytes

hS/LF

Nimmt die Liste zuerst und den Satz an zweiter Stelle. Testsuite.

Erläuterung:

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

C #, 36 Bytes

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

nund hsind string[]und der Ausgang ist ein int.

Probieren Sie es online!

Diese Antwort ist inspiriert von @ovs und @Alberto Riveras Logik. Vielen Dank!

aloisdg sagt Reinstate Monica
quelle
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;}

Dies ist meine erste Code Golf Herausforderung und Antwort, also nicht sicher über das Format. Muss es ein vollständiges Kompilierungsprogramm sein? Muss ich die Parameter definieren? Vorschläge geschätzt.

EDIT : Code in eine Funktion eingebunden . Vielen Dank @Steadybox

Hubert Grzeskowiak
quelle
Eine Antwort kann ein vollständiges Programm, eine Funktion oder ein anderes funktionsähnliches Konstrukt sein . Sie können die Parameter beispielsweise als Argumente für eine Funktion oder aus der Standardeingabe übernehmen.
Steadybox
1

05AB1E , 7 Bytes

v²y¢})W

Probieren Sie es online!

v   }   # For each item in the first list...
 ²y¢    # Count the occurances in the second list.
     )W # Take the minimum occurrence count, return.
Magische Kraken-Urne
quelle
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 kommt bald

Erläuterung

  • Erzeugt die lokale Variable m.

  • ordnet das Set einem Stream zu.

  • Wenn für jedes Element die Anzahl der Vorkommen des Elements in der Liste kleiner als m ist, wird m auf diesen Wert gesetzt.

  • gibt m zurück, das ist die Anzahl der vollständigen Versionen der Menge

Targz
quelle
0

R 54 Bytes

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

Erläuterung: Es wird eine Tabelle mit den Zählwerten nur der Werte in der Liste erstellt, die auch in der Unterliste enthalten sind.

Ich wandle die Variable dann in einen Faktor um, um Nullen zu erzeugen, wenn ein Wert, der in der Unterliste erscheint, nicht in der Liste erscheint. Schließlich nehme ich das Minimum der Zählungen.

Michal
quelle
0

R 61 57 44 Bytes

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

Anonyme Funktion. Anscheinend müssen Sie für diese Herausforderung keine Funktion definieren. 13 Bytes gespart dank count.

Erläuterung:

sum(l%in%x))Gibt zurück, wie oft ein String in sgefunden wurde l.

lapply(s,function(x))Wendet dies auf jede Zeichenfolge sseparat an und gibt eine Liste der Summen zurück.

min() gibt den kleinsten Wert aus dieser Liste zurück.

BLT
quelle
Könnte sein , um 40 Bytes mit einem for-Schleife gebracht:z=c();for(i in s)z[i]=sum(l%in%i);min(z)
zählen
Oder noch weiter auf 37 Bytes mit sapply:min(sapply(s,function(x)sum(l%in%x)))
Zählen Sie am
Genial, ich vergesse immer, dass man Boolesche Werte addieren kann. Ich werde das später bearbeiten. Mir wurde gesagt, ich brauche dieses print (), wenn es keine Funktion ist.
BLT
0

JavaScript (ES6), 59 Byte

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

Versuch es

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

Zottelig
quelle