Listedeki bir kümenin oluşumlarını sayma


15

Boş olmayan bir dizeler kümesi ve dizelerin bir listesi verildiğinde, kümenin listede kaç kez gerçekleştiğini, yani listeden öğelerle kümeyi kaç kez oluşturabileceğinizi öğrenin. Listedeki her öğe yalnızca bir kez kullanılabilir.

İpucu: Bir küme, benzersiz öğelerin sırasız bir listesidir.

Varsayılan giriş / çıkış kuralları geçerlidir.

Harici kütüphaneye izin verilmez. Derleyici / Tercüman standart kütüphaneleri uygundur. Bu kod golf, bu yüzden en kısa çözüm önemlidir.


Test senaryoları:

["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: giriş parametrelerinin yerel kapsamda tanımlandığını belirten bir cümle kaldırıldı. Bu, yukarıda bağlantılı olan varsayılan IO kurallarıyla çelişir.


Evet bu açıklığa kavuştu Ancak ben üçüncü cümlede biraz asıldım. Ne demek "nesneleri işlemez"?
Rock Garf Hunter Post

@WheatWizard bazı diller nesne yönelimli değildir ve keyfi nesneleri karşılaştırma kavramını bilmez.
Hubert Grzeskowiak

1
Bunu muhtemelen nesne yönelimli olarak değiştirmelisiniz çünkü farkında olduğum her dil, nesneler kapalı bir sınıf olsa bile bazı türdeki nesneleri işliyor. Ayrıca, dizeleri de işleyemeyen çok sayıda dil olduğunu belirtmeliyim.
Rock Garf Hunter Post

@WeatWizard tamam, güncellenmiş açıklama. Bu paragraf C, Assembler veya Maple gibi diller içindir.
Hubert Grzeskowiak

Hangi diller nesneye yöneliktir? Dizeler değilse ne kullanmalılar? Bence en kolay şey sadece dizelerle kısıtlamak olacaktır. Veya alternatif olarak yalnızca tamsayılar. Yeterli olan en basit türü kullanma hakkındaki bu tavsiyeye bakın .
xnor

Yanıtlar:


12

Python, 30 bayt

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

Çevrimiçi deneyin!


Güzel. Harita kullanmayı düşünmedim. Lambda BTW tanımlamak yerine yazdırmayı kullanarak biraz tasarruf edebilirsiniz.
Hubert Grzeskowiak

1
@HubertGrzeskowiak Değişen lambdabir karşı printbayt çünkü iki 37'sinde kadar saymak getiriyor input()gerekli s.
Post Rock Garf Hunter

@WheatWizard sorguda belirtildiği gibi, yerel kapsamda tanımlanan girdileri göz önünde bulundurun. Girişlerin, örneğin işlev parametreleri veya kullanıcı girişleri gibi açıkça tanımlanması GEREKMEZ.
Hubert Grzeskowiak

Bu alanda iyi bir neden varsa @HubertGrzeskowiak, bizim üzerine olmamalı girdi ve çıktı almak için varsayılan ve bizim codegolf gönderimler için varsayılan
ovs

@ovs oh, bu yazının farkında değildim. Teşekkürler.
Hubert Grzeskowiak

6

Jöle , 4 bayt

⁼þSṂ

Çevrimiçi deneyin!

Nasıl?

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

Jöle , 6 5 4 bayt

ċ@€Ṃ

Çevrimiçi deneyin!

Programın ilk argümanı kümedir ve ikinci argüman listedir.

açıklama

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

@ETHproductions sayesinde -1 bayt

@ETHproductions sayesinde -1 bayt tekrar


Çok hoş! Bağlantıları tek bir satırda birleştirerek bir bayt kaydedebilirsiniz: ⁹ċ$€ṂBunun yerine kapalı doğru argümanı kullanarak daha kısa yapılabilecek bir his var ...
ETHproductions 20:17

Ben düşünüyorum ċ@€Ṃ (... eserler başka byte kaydetmek @için argümanlar tersine ċ)
ETHproductions

@ETHproductions Test ettiğim kadar doğru çalışıyor.
fireflame241

Geçen yılın Mayıs 12 kadar var ama vermedi yerine @€(programa ters argümanlar) henüz başka bayt kaydeder: çevrimiçi deneyin!
İlişkisiz String

6

JavaScript (ES6), 56 bayt

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

Çevrimiçi deneyin


1
Anonim bir işlev kullanarak 2 bayt ve parametreleri kısaltarak başka bir tasarruf edin: n=>h=>Math.min(...n.map(c=>h.filter($=>$==c).length))53 byte için
Shaggy

5

JavaScript (ES6), 64 bayt

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

Her ikisini de varsayar sve lnesnelerin dizisidir . Karşılaştırmalar için JavaScript katı eşitliği kullanır, bu nedenle örneğin [] === []yanlıştır.


Çok ilginç bir çözüm. Lütfen sonucu iade edin veya yazdırın. AFAIK, anonim bir işlev döndürür.
Hubert Grzeskowiak

2
@HubertGrzeskowiak Gösterildiği gibi kod anonim bir işlevi değerlendirir. Çağrıldığında, işlev sayımı istendiği gibi döndürür.
Neil

4

Haskell , 37 34 bayt

@Laikoni'ye üç bayt tıraş ettiği için teşekkürler.

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

Herhangi bir tür türetme (set::[a]) # (list::[a])nerede ile arayın .aEq


Bunun yerine length[y|y<-l,y==x]kullanabilirsiniz sum[1|y<-l,y==x].
Laikoni

@Laikoni, bundan emin misin? Sanırım sum[1|y<-l,y==x,_<-y]iki bayta daha uzun süren gibi bir şey kullanmam gerekeceğini düşünüyorum
Julian Wolf

Boş ver, kesinlikle haklısın. İyi karar.
Julian Wolf

3

CJam , 11 bayt

q~f{\e=}:e<

Çevrimiçi deneyin!

açıklama

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 bayt

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

Saf sırayla iki listeyi önerilen sırada argümanlar olarak alır ve negatif olmayan bir tamsayı döndürür. Tallygiriş listesinde her sembolün kaç kez meydana geldiğini sayar #/.Rule@@@ve girdi kümesinin her öğesini karşılık gelen tekrar sayısına dönüştürür.


3

T-SQL, 62 59 bayt

Önceki sürüm, eşleşmesi olmayan setler için çalışmadı

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

Tablo olarak s ve l ve tablo ile aynı adlı sütunlar

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

Swift, 39 bayt

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

açıklama:

s.map{} s içindeki her kelimeden geçer ve bir dizi sayım üretir

w in eşlenen kelimeyi sonraki filtrede kullanmak için adlandırır

l.filter{} l dizisine filtre uygular

$0==w filtre koşulu eşleşen sözcük w

.count koşulu karşılayan l öğelerinin sayısını verir

.min() eşlenen sonuçtaki en düşük sayıyı döndürür


1
PPCG'ye Hoşgeldiniz! Çözümünüz için kod biçimlendirmesi ekledim. Bunu, kod içeren satırlara 4 boşluk bırakarak yapabilirsiniz.
Mego

3

APL (Dyalog) , 9 bayt

⌊/+/⎕∘.≡⎕

Çevrimiçi deneyin!

 değerlendirilmiş girdi al (karakter dizisi listesi)

⎕∘.≡ değerlendirilmiş girdiyi alın (boş olmayan dizeler kümesi) ve denklik tablosu oluşturun

+/ genelinde ekle

⌊/ en az


2

Perl 6 ,  37  18 bayt

37

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

Dene

Expanded:

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

Daha fazla bilgi için Setler, Torbalar ve Karışımlar bölümüne bakınız .


18

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

Dene

Açıklama:

@^b.BagBir oluşturmak Bag değerleri elde
{@^a}o Çanta içine tuşu (getiri sayıları listesini)
.minçıkan listenin minimum değeri olsun



Düzgün cevaplar, ama bunların hiçbiri fonksiyonlara / komple programlara benzemiyor
Julian Wolf

@JulianWolf Snippet'lerin “Her iki girdinin de mevcut kapsamda s ve l olarak tanımlandığını düşünün” ifadelerine dayanarak izlenmesine maruz kaldım. ve “Bir işlev tanımlamanız gerekmez.” Zaten gittim ve düzenledim.
Brad Gilbert b2gills

Ah, tamamen haklısın. Bunu okuduktan sonra soruda düzeltilmiş olmalı. Her durumda, bu versiyonun estetiğini sondan daha fazla seviyorum - Perl'in sözdizimi benim için her zaman bir gizem olacak.
Julian Wolf

@JulianWolf Bu gerçekten Perl 6 kodunun iyi bir örneği değil. Ovid'in 1 saatlik konuşma Perl 6 - İnsanların Neden Bu Kadar Heyecanlandığını görmenizi veya Perl6.org'daki Kaynaklar sekmesine bakmanızı tavsiye ederim .
Brad Gilbert b2gills

Evet, karışıklık için özür dilerim. Bu benim ilk görevim ve girdi ve çıktı için kurallar olduğunu zaten bilmiyordum. Ben değiştirdim çünkü çoğu cevap gerekli olmasa bile bu kuralları kullanıyordu.
Hubert Grzeskowiak

2

Aksiyom, 42 bayt

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

test kodu ve sonuçları

(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 ++, 203201 bayt

@Quentin'e iki bayt kaydettiği için teşekkürler!

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

Çevrimiçi deneyin!


L.begin()-> begin(L)bir bayt kaydeder :)
Quentin

Ayrıca, using T=std::vector<std::string>;başka kaydeder! Modern güzel sözdizimini bilenler golf oynamaya da yardımcı olabilir.
Quentin

@Quentin İlk başta denedim. Muhtemelen fark etmediğim basit bir yazım hatası vardı.
Steadybox

1

PHP, 74 Bayt

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

testcases

PHP, 108 Bayt

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

testcases


1

Pyth, 5 bayt

hS/LF

Önce listeyi, sonra ikinci listeyi alır. Test odası.

Açıklama:

    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 bayt

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

Bu benim ilk kod golf meydan okuma ve cevap, yani biçimi hakkında emin değilim. Tam bir derleme programı olması gerekiyor mu? Parametreleri tanımlamam gerekir mi? Öneriler takdir edildi.

EDIT : bir işlevde sarılmış kod. Teşekkürler @Steadybox


Yanıt, tam bir program, bir işlev veya başka bir işlev benzeri yapı olabilir . Parametreleri , örneğin bir işleve veya standart girdiden bağımsız değişken olarak alabilirsiniz .
Steadybox


1

Java, 114 Bayt

<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 yakında

açıklama

  • yerel değişken m oluşturur.

  • seti bir akışla eşler.

  • her eleman için, listedeki elemanın meydana gelme sayısı m'den azsa, m bu değere ayarlanır.

  • kümenin tam sürümlerinin sayısı olan m değerini döndürür


0

R 54 Bayt

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

Açıklama: yalnızca listede alt listede de görünen değerlerin bir tablosunu oluşturmak.

Daha sonra alt listede görüntülenen bir değer listede görünmüyorsa, değişkeni sıfırlamak için değişkeni bir faktöre dönüştürürüm. Son olarak, minimum sayıları alıyorum.


0

R, 61 57 44 bayt

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

Anonim işlev. Görünüşe göre bu meydan okuma için bir fonksiyon tanımlamanız gerekmiyor. Sayım sayesinde 13 bayt tasarruf edildi.

Açıklama:

sum(l%in%x))bir dize içinde kaç kez döner sbulunur l.

lapply(s,function(x)) applies that to each string in s separately and returns a list of sums.

min() returns the smallest from that list.


40 Bayt aşağı getirilebilir Could bir for döngüsü:z=c();for(i in s)z[i]=sum(l%in%i);min(z)
saymak

Veya aptalca 37 bayt daha da:min(sapply(s,function(x)sum(l%in%x)))
sayın

Parlak, her zaman boolean'ları toplayabileceğini unutuyorum. Bunu daha sonra düzenleyeceğim. Eğer bir işlev değilse o print () 'ye ihtiyacım olduğu söylendi.
BLT

0

JavaScript (ES6), 59 bayt

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

Dene

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.