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.


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!


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)

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


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


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.


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.


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

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.


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

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


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


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



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

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!


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


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


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


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

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


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.


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.