Policz wystąpienia zestawu na liście

15

Biorąc pod uwagę niepusty zestaw ciągów i listę ciągów, dowiedz się, ile razy zestaw występuje na liście, tj. Ile razy możesz utworzyć zestaw z elementami z listy. Każdy element z listy może być użyty tylko raz.

Wskazówka: zestaw to nieuporządkowana lista unikalnych przedmiotów.

Obowiązują domyślne reguły wejścia / wyjścia .

Niedozwolone są biblioteki zewnętrzne. Standardowe biblioteki kompilatora / interpretera są w porządku. To jest golf golfowy, więc liczy się najkrótsze rozwiązanie.


Przypadki testowe:

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

EDYCJA: usunięto zdanie stwierdzające, że parametry wejściowe są zdefiniowane w zasięgu lokalnym. Jest to sprzeczne z domyślnymi regułami IO powiązanymi powyżej.

Hubert Grzeskowiak
źródło
Tak, to wyjaśnia. Jestem jednak trochę rozłączony przy trzecim zdaniu. Co rozumiesz przez „nie obsługuje przedmiotów”?
Post Rock Garf Hunter,
@WheatWizard niektóre języki nie są obiektowe i nie znają koncepcji porównywania dowolnych obiektów.
Hubert Grzeskowiak,
1
Prawdopodobnie powinieneś zmienić to na obiektowe, ponieważ każdy język, który znam, obsługuje obiekty jakiegoś typu, nawet jeśli obiekty są klasą zamkniętą. Powinienem również zauważyć, że istnieje wiele języków, które również nie radzą sobie z łańcuchami.
Post Rock Garf Hunter
@WheatWizard w porządku, zaktualizowano opis. Ten akapit był przeznaczony dla języków takich jak C, asembler lub klon.
Hubert Grzeskowiak,
Jakie języki są obiektowe? Czego powinni używać, jeśli nie łańcuchy? Myślę, że najłatwiej byłoby ograniczyć się do samych łańcuchów. Lub alternatywnie tylko liczby całkowite. Zobacz tę poradę na temat używania najprostszego rodzaju, który wystarcza.
xnor

Odpowiedzi:

12

Python, 30 bajtów

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

Wypróbuj online!

ovs
źródło
Niezłe. Nie myślałem o użyciu mapy. Możesz trochę zaoszczędzić, używając print zamiast definiować lambda BTW.
Hubert Grzeskowiak,
1
@HubertGrzeskowiak Zmiana na lambdaa printpowoduje zwiększenie liczby bajtów do 37 ze względu na input()wymagane dwa s.
Post Rock Garf Hunter,
@WheatWizard, jak podano w wyzwaniu, rozważ dane wejściowe zdefiniowane w zasięgu lokalnym. NIE jest wymagane, aby wejścia były wyraźnie zdefiniowane, np. Jako parametry funkcji lub dane wejściowe użytkownika.
Hubert Grzeskowiak
@HubertGrzeskowiak, jeśli nie ma ku temu dobrego powodu, nie należy nadpisywać naszych wartości domyślnych dotyczących pobierania danych wejściowych i wyjściowych oraz naszych wartości domyślnych dotyczących przesyłania kodu z kodu
ows
@ovs oh, nie wiedziałem o tym poście. Dzięki.
Hubert Grzeskowiak
6

Galaretka , 4 bajty

⁼þSṂ

Wypróbuj online!

W jaki sposób?

⁼þ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
źródło
6

Galaretka , 6 5 4 bajtów

ċ@€Ṃ

Wypróbuj online!

Pierwszym argumentem programu jest zestaw, a drugim argumentem jest lista.

Wyjaśnienie

ċ@€Ṃ
ċ@   -- 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 bajt dzięki @ETHproductions

-1 bajt ponownie dzięki @ETHproductions

fireflame241
źródło
Bardzo dobrze! Możesz zapisać bajt, łącząc linki w jedną linię: ⁹ċ$€ṂMam wrażenie, że można go skrócić, używając niejawnego właściwego argumentu zamiast ...
ETHproductions
Myślę, że ċ@€Ṃ działa, aby zapisać kolejny bajt ... ( @odwraca argumenty ċ)
ETHproductions
@ETHproductions Działa poprawnie, o ile przetestowałem.
fireflame241
Nie istniał do 12 maja zeszłego roku, ale zamiast @€(z odwróconymi argumentami do programu) zapisuje kolejny bajt: Wypróbuj online!
Niepowiązany ciąg
6

JavaScript (ES6), 56 bajtów

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

Wypróbuj online

Alberto Rivera
źródło
1
Zaoszczędź 2 bajty, używając anonimowej funkcji, a drugą curry parametrów: n=>h=>Math.min(...n.map(c=>h.filter($=>$==c).length))dla 53 bajtów
Kudłaty
5

JavaScript (ES6), 64 bajty

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

Zakłada oba si lsą tablicami obiektów. Używa ścisłej równości JavaScript do porównań, więc na przykład [] === []jest fałszem.

Neil
źródło
Bardzo interesujące rozwiązanie. Zwróć lub wydrukuj wynik. AFAIK zwraca anonimową funkcję.
Hubert Grzeskowiak,
2
@HubertGrzeskowiak Przedstawiony kod przekształca się w anonimową funkcję. Po wywołaniu funkcja zwraca liczbę zgodnie z potrzebami.
Neil,
4

Haskell , 37 34 bajtów

Dzięki @Laikoni za golenie trzech bajtów.

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

Zadzwoń, (set::[a]) # (list::[a])skąd apochodzi dowolny typ Eq.

Julian Wolf
źródło
Zamiast length[y|y<-l,y==x]ciebie możesz użyć sum[1|y<-l,y==x].
Laikoni
@Laikoni, jesteś tego pewien? Myślę, że musiałbym użyć czegoś takiego sum[1|y<-l,y==x,_<-y], co wydłuża się o dwa bajty dłużej - ale na pewno coś tam brakowało
Julian Wolf
Nieważne, zdecydowanie masz rację. Dobra decyzja.
Julian Wolf
3

CJam , 11 bajtów

q~f{\e=}:e<

Wypróbuj online!

Wyjaśnienie

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
Business Cat
źródło
3

Mathematica, 24 bajty

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

Czysta funkcja przyjmująca dwie listy jako argumenty w sugerowanej kolejności i zwracająca nieujemną liczbę całkowitą. Tallyzlicza liczbę wystąpień każdego symbolu na liście wejściowej i #/.Rule@@@konwertuje każdy element zestawu wejściowego na odpowiednią liczbę wystąpień.

Greg Martin
źródło
3

T-SQL, 62 59 bajtów

Poprzednia wersja nie działała dla zestawów bez dopasowań

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

Zs i l jako tabele i kolumny o takich samych nazwach jak tabela

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
źródło
3

Szybki, 39 bajtów

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

wyjaśnienie:

s.map{} przechodzi przez każde słowo ws i tworzy tablicę zliczeń

w in nazywa odwzorowane słowo do użycia w następnym filtrze

l.filter{} stosuje filtr do tablicy L.

$0==w to słowo filtrujące pasujące do słowa w

.count podaje liczbę elementów l spełniających warunek

.min() zwraca najniższą liczbę w zmapowanym wyniku

użytkownik68380
źródło
1
Witamy w PPCG! Dodałem formatowanie kodu dla twojego rozwiązania. Możesz to zrobić, wstawiając 4 spacje do wierszy zawierających kod.
Mego
3

APL (Dyalog) , 9 bajtów

⌊/+/⎕∘.≡⎕

Wypróbuj online!

 uzyskać sprawdzone dane wejściowe (lista ciągów)

⎕∘.≡ uzyskać sprawdzone dane wejściowe (niepusty zestaw ciągów) i utworzyć tabelę równoważności

+/ dodaj w poprzek

⌊/ minimum w poprzek

Adám
źródło
2

Perl 6 ,  37  18 bajtów

37

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

Spróbuj

Rozszerzony:

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

Aby uzyskać więcej informacji, zobacz Zestawy, torby i miksy .


18

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

Spróbuj

Wyjaśnienie:

@^b.Bagutwórz torbę z
{@^a}klucza wartości do tej torby (zwraca listę zliczeń),
.minuzyskaj minimalną wartość wynikowej listy


Brad Gilbert b2gills
źródło
Zgrabne odpowiedzi, ale żaden z nich nie wygląda jak funkcje / pełne programy
Julian Wolf
@JulianWolf Miałem wrażenie, że fragmenty są dozwolone na podstawie stwierdzeń „Rozważ oba dane wejściowe są zdefiniowane w bieżącym zakresie jako s i l.” I „Nie musisz definiować funkcji”. I tak ją edytowałem. .
Brad Gilbert b2gills 21.04.17
Ach, masz całkowitą rację. To musiało zostać zredagowane w pytaniu po przeczytaniu. W każdym razie bardziej podoba mi się estetyka tej wersji niż poprzednia - składnia Perla zawsze będzie dla mnie tajemnicą.
Julian Wolf
@JulianWolf To nie jest tak naprawdę dobry przykład kodu Perla 6. Poleciłbym obejrzenie 1- godzinnego wykładu Owidiusza Perl 6 - Dlaczego ludzie są tacy podekscytowani lub zajrzenie do karty Zasoby na Perl6.org .
Brad Gilbert b2gills 21.04.17
Tak, przepraszam za zamieszanie. To jest moje pierwsze wyzwanie i nie wiedziałem, że istnieją już zasady wprowadzania i wyprowadzania. Zmieniłem to, ponieważ większość odpowiedzi używała tych zasad, nawet jeśli nie było to wymagane.
Hubert Grzeskowiak
2

Aksjomat, 42 bajty

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

kod testowy i wyniki

(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
źródło
2

C ++, 203 201 bajtów

Dzięki @Quentin za zapisanie dwóch bajtów!

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

Wypróbuj online!

Steadybox
źródło
L.begin()-> begin(L)zapisuje jeden bajt :)
Quentin
Ponadto using T=std::vector<std::string>;oszczędza inny! Kto znał nowoczesną ładną składnię, może również pomóc w grze w golfa.
Quentin
@Quentin Na początku tego próbowałem. Prawdopodobnie była jakaś prosta literówka, której nie zauważyłem.
Steadybox
1

PHP, 74 bajty

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

Przypadki testowe

PHP, 108 bajtów

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

Przypadki testowe

Jörg Hülsermann
źródło
1

Pyth, 5 bajtów

hS/LF

Najpierw ustawia listę, a drugą ustawia. Zestaw testowy.

Wyjaśnienie:

    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.
źródło
1

C #, 36 bajtów

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

ni hsą, string[]a wynikiem jest anint .

Wypróbuj online!

Ta odpowiedź jest inspirowana logiką @ovs i @Alberto Rivera. Dziękuję Ci!

aloisdg przechodzi na codidact.com
źródło
1

Java, 135 bajtów

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

To jest moje pierwsze wyzwanie i odpowiedź na golfa, więc nie jestem pewien co do formatu. Czy to musi być pełny program kompilujący? Czy muszę zdefiniować parametry? Sugestie docenione.

EDYCJA : zawinięty kod w funkcji. Dzięki @Steadybox

Hubert Grzeskowiak
źródło
Odpowiedź może być pełnym programem, funkcją lub inną konstrukcją podobną do funkcji . Możesz wziąć parametry na przykład jako argumenty do funkcji lub ze standardowego wejścia.
Steadybox
1

05AB1E , 7 bajtów

v²y¢})W

Wypróbuj online!

v   }   # For each item in the first list...
 ²y¢    # Count the occurances in the second list.
     )W # Take the minimum occurrence count, return.
Urna Magicznej Ośmiornicy
źródło
1

Java, 114 bajtów

<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 już wkrótce

Wyjaśnienie

  • tworzy zmienną lokalną m.

  • mapuje zestaw do strumienia.

  • dla każdego elementu, jeśli liczba wystąpień elementu na liście jest mniejsza niż m, m jest ustawiane na tę wartość.

  • zwraca m, czyli liczbę pełnych wersji zestawu

Targz
źródło
0

R 54 bajtów

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

Objaśnienie: tworzenie tabeli liczeń tylko wartości z listy, które również pojawiają się na liście podrzędnej.

Następnie przekształcam zmienną w czynnik w celu generowania zer, jeśli wartość pojawiająca się na liście podrzędnej nie pojawia się na liście. Wreszcie, biorę minimum zliczeń.

Michał
źródło
0

R, 61 57 44 bajtów

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

Funkcja anonimowa. Najwyraźniej nie musisz definiować funkcji dla tego wyzwania. Oszczędność 13 bajtów dzięki liczeniu.

Wyjaśnienie:

sum(l%in%x))zwraca liczbę przypadków, w których sznaleziono ciąg znaków l.

lapply(s,function(x))stosuje to do każdego łańcucha sosobno i zwraca listę sum.

min() zwraca najmniejszą z tej listy.

BLT
źródło
Można obniżyć do 40 bajtów za pomocą pętli for:z=c();for(i in s)z[i]=sum(l%in%i);min(z)
policz
Lub nawet do 37 bajtów z sapply:min(sapply(s,function(x)sum(l%in%x)))
policz
Genialnie, zawsze zapominam, że można sumować booleany. Zmienię to później. Powiedziano mi, że potrzebuję tego print (), jeśli nie jest to funkcja.
BLT
0

JavaScript (ES6), 59 bajtów

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

Spróbuj

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

Kudłaty
źródło