นับจำนวนการปรากฏของชุดในรายการ


15

ให้ชุดของสตริงที่ไม่ว่างเปล่าและรายการของสตริงหาจำนวนครั้งที่ชุดเกิดขึ้นในรายการเช่นกี่ครั้งที่คุณสามารถสร้างชุดที่มีรายการจากรายการ ทุกองค์ประกอบจากรายการสามารถใช้ได้เพียงครั้งเดียว

คำแนะนำ: ชุดเป็นรายการที่ไม่ซ้ำของรายการที่ไม่ซ้ำกัน

ใช้กฎอินพุต / เอาต์พุตเริ่มต้น

ไม่อนุญาตให้ใช้ไลบรารีภายนอก libs มาตรฐานของคอมไพเลอร์ / ล่ามก็โอเค นี่คือรหัสกอล์ฟดังนั้นจึงนับเป็นการแก้ปัญหาที่สั้นที่สุด


กรณีทดสอบ:

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

แก้ไข:ลบประโยคที่ระบุว่าอินพุต params ถูกกำหนดในขอบเขตโลคัล สิ่งนี้ขัดแย้งกับกฎ IO เริ่มต้นที่ลิงก์ด้านบน


ใช่ว่ามันชัดเจน อย่างไรก็ตามฉันก็วางสายประโยคที่สามเล็กน้อย คุณหมายถึงอะไรโดย "ไม่จัดการกับวัตถุ"
โพสต์ Rock Garf Hunter

@WheatWizard บางภาษาไม่ได้เป็นเชิงวัตถุและไม่ทราบแนวคิดในการเปรียบเทียบวัตถุโดยพลการ
Hubert Grzeskowiak

1
คุณควรเปลี่ยนไปเป็นแบบเชิงวัตถุเพราะทุกภาษาที่ฉันรู้จะจัดการกับวัตถุบางชนิดแม้ว่าวัตถุจะเป็นคลาสปิด ฉันควรชี้ให้เห็นว่ามีภาษาจำนวนมากที่ไม่สามารถจัดการสายอักขระได้ทั้งหมด
โพสต์ Rock Garf Hunter

@WheatWizard ตกลงรายละเอียดที่อัปเดตแล้ว ย่อหน้านั้นมีไว้สำหรับภาษาเช่น C, Assembler หรือ Maple
Hubert Grzeskowiak

ภาษาเชิงวัตถุคืออะไร สิ่งที่พวกเขาควรใช้ถ้าไม่ใช่สตริง? ฉันคิดว่าสิ่งที่ง่ายที่สุดคือ จำกัด เฉพาะสาย หรือจำนวนเต็มเท่านั้น ดูคำแนะนำนี้ในการใช้ประเภทที่ง่ายที่สุดที่พอเพียง
xnor

คำตอบ:


12

Python ขนาด 30 ไบต์

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

ลองออนไลน์!


ทำได้ดีนี่. ไม่ได้คิดถึงการใช้แผนที่ คุณสามารถประหยัดได้เพียงเล็กน้อยโดยใช้การพิมพ์แทนการกำหนดแลมบ์ดา BTW
Hubert Grzeskowiak

1
@HubertGrzeskowiak การเปลี่ยนlambdaเป็น a printนำจำนวนไบต์สูงสุดถึง 37 เนื่องจากinput()จำเป็นต้องใช้ทั้งสอง
โพสต์ Rock Garf Hunter

@WheatWizard ตามที่ระบุไว้ในความท้าทายพิจารณาปัจจัยการผลิตที่กำหนดไว้ในขอบเขตท้องถิ่น คุณไม่จำเป็นต้องมีอินพุตที่กำหนดไว้อย่างชัดเจนเช่นฟังก์ชัน params หรืออินพุตของผู้ใช้
Hubert Grzeskowiak

@HubertGrzeskowiak ถ้าไม่มีเหตุผลที่ดีสำหรับมันที่คุณไม่ควรเขียนทับของเราค่าเริ่มต้นสำหรับการป้อนข้อมูลและการส่งออกของเราและค่าเริ่มต้นสำหรับการส่ง codegolf
OVS

@ovs โอ้ฉันไม่ทราบว่าโพสต์นั้น ขอบคุณ
Hubert Grzeskowiak


6

เยลลี่ , 6 5 4 ไบต์

ċ@€Ṃ

ลองออนไลน์!

อาร์กิวเมนต์แรกของโปรแกรมคือชุดและอาร์กิวเมนต์ที่สองคือรายการ

คำอธิบาย

ċ@€Ṃ
ċ@   -- 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 ไบต์ขอบคุณ @ETHproductions

-1 ไบต์อีกครั้งด้วย @ETHproductions


ดีมาก! คุณสามารถบันทึก byte โดยรวมลิงค์เป็นหนึ่งบรรทัด: ⁹ċ$€Ṃฉันมีความรู้สึกที่สามารถทำให้สั้นลงโดยใช้อาร์กิวเมนต์ขวา implicit แทนที่...
ETHproductions

ผมคิดว่า ċ@€Ṃผลงานที่จะบันทึกไบต์อื่น ... (คน@ฝืนข้อโต้แย้งไปċ)
ETHproductions

@ETHproductions ทำงานอย่างถูกต้องเท่าที่ฉันได้ทดสอบ
fireflame241

มันไม่ได้มีอยู่จนถึงวันที่ 12 พฤษภาคมของปีที่แล้ว แต่แทนที่@€(ด้วยอาร์กิวเมนต์ที่กลับรายการ) จะบันทึกอีกหนึ่งไบต์: ลองออนไลน์!
สตริงที่ไม่เกี่ยวข้อง

6

JavaScript (ES6), 56 ไบต์

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

ลองออนไลน์


1
บันทึก 2 ไบต์โดยใช้ฟังก์ชั่นที่ไม่ระบุชื่อและอีกรายการหนึ่งโดยการปิดพารามิเตอร์: n=>h=>Math.min(...n.map(c=>h.filter($=>$==c).length))สำหรับ 53 ไบต์
Shaggy

5

JavaScript (ES6), 64 ไบต์

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

ถือว่าทั้งสองsและlเป็นอาร์เรย์ของวัตถุ ใช้ความเท่าเทียมกันที่เข้มงวดของ JavaScript สำหรับการเปรียบเทียบดังนั้นตัวอย่างเช่น[] === []เป็นเท็จ


ทางออกที่น่าสนใจมาก โปรดย้อนกลับหรือพิมพ์ผลลัพธ์ AFAIK จะส่งคืนฟังก์ชันที่ไม่ระบุชื่อ
Hubert Grzeskowiak

2
@HubertGrzeskowiak รหัสตามที่แสดงประเมินให้กับฟังก์ชั่นที่ไม่ระบุชื่อ เมื่อเรียกใช้ฟังก์ชันจะส่งคืนจำนวนที่ต้องการ
Neil

4

Haskell , 37 34 ไบต์

ขอบคุณ @Laikoni สำหรับการตัดสามไบต์

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

โทรกับ(set::[a]) # (list::[a])ที่อยู่ในประเภทใดที่ได้รับaEq


แทนการ ที่คุณสามารถใช้length[y|y<-l,y==x] sum[1|y<-l,y==x]
Laikoni

@Laikoni คุณแน่ใจหรือไม่ ฉันคิดว่าฉันจะต้องใช้บางสิ่งบางอย่างเช่นsum[1|y<-l,y==x,_<-y]นี้ซึ่งยาวกว่าสองไบต์ - ฉันอาจพลาดบางสิ่งที่นั่นได้
Julian Wolf

ไม่เป็นไรคุณพูดถูก โทรดีมาก
Julian Wolf


3

Mathematica ขนาด 24 ไบต์

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

ฟังก์ชันบริสุทธิ์รับสองรายการเป็นอาร์กิวเมนต์ตามลำดับที่แนะนำและส่งคืนจำนวนเต็มที่ไม่ใช่ค่าลบ Tallyนับจำนวนการเกิดขึ้นของทุกสัญลักษณ์ที่เกิดขึ้นในรายการอินพุตและ#/.Rule@@@แปลงแต่ละองค์ประกอบของอินพุตที่ตั้งเป็นจำนวนครั้งที่สอดคล้องกัน


3

T-SQL, 62 59ไบต์

รุ่นก่อนหน้าไม่สามารถใช้กับชุดที่ไม่มีการแข่งขัน

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

ด้วย s และ l เป็นตารางและคอลัมน์ที่มีชื่อเหมือนกับตาราง

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 ไบต์

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

คำอธิบาย:

s.map{} ผ่านแต่ละคำใน s และจะทำให้เกิดการนับ

w in ตั้งชื่อคำที่แมปไว้สำหรับใช้ในตัวกรองถัดไป

l.filter{} ใช้ตัวกรองกับอาร์เรย์ l

$0==w เป็นเงื่อนไขการกรองการจับคู่คำ w

.count ให้จำนวนองค์ประกอบของ l ที่ตรงตามเงื่อนไข

.min() ส่งคืนการนับต่ำสุดในผลลัพธ์ที่แม็พ


1
ยินดีต้อนรับสู่ PPCG! ฉันได้เพิ่มการจัดรูปแบบรหัสสำหรับโซลูชันของคุณ คุณสามารถทำได้โดยการเพิ่มช่องว่าง 4 บรรทัดไปยังบรรทัดที่มีรหัส
Mego

3

APL (Dyalog)ขนาด 9 ไบต์

⌊/+/⎕∘.≡⎕

ลองออนไลน์!

 รับอินพุตที่ประเมิน (รายการของสตริง)

⎕∘.≡ รับอินพุตที่ประเมิน (ชุดสตริงที่ไม่ว่าง) และสร้างตารางที่เทียบเท่า

+/ เพิ่มข้าม

⌊/ ข้ามขั้นต่ำ


2

Perl 6 ,  37  18 ไบต์

37

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

ลองมัน

ขยาย:

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

ดูที่ชุดกระเป๋าและมิกซ์สำหรับข้อมูลเพิ่มเติม


18

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

ลองมัน

คำอธิบาย:

@^b.Bagสร้างกระเป๋าจาก
{@^a}คีย์ค่าลงในกระเป๋า (ส่งคืนรายการการนับ)
.minรับค่าต่ำสุดของรายการผลลัพธ์



คำตอบที่เรียบร้อย แต่ดูเหมือนว่าทั้งฟังก์ชั่น / โปรแกรมที่สมบูรณ์
Julian Wolf

@JulianWolf ฉันอยู่ภายใต้การแสดงผลที่อนุญาตให้ใช้ตัวอย่างตามข้อความ“ พิจารณาทั้งอินพุตที่กำหนดไว้ในขอบเขตปัจจุบันเป็น s และ l” และ“ คุณไม่จำเป็นต้องกำหนดฟังก์ชั่น” ฉันไปและแก้ไขมันต่อไป .
แบรดกิลเบิร์ต b2gills

อ่าคุณพูดถูก ต้องมีการแก้ไขในคำถามหลังจากที่ฉันอ่าน ไม่ว่าในกรณีใดฉันชอบความสวยงามของรุ่นนี้ยิ่งกว่าครั้งสุดท้าย - ไวยากรณ์ของ Perl จะเป็นปริศนาให้ฉันเสมอ
Julian Wolf

@JulianWolf นี่ไม่ใช่ตัวอย่างที่ดีของรหัส Perl 6 ฉันจะขอแนะนำให้เห็นโอวิด 1 ชั่วโมงพูดคุยPerl 6 - ทำไมผู้คนมีความตื่นเต้นมากหรือกำลังมองหาที่ทรัพยากรแท็บPerl6.org
แบรดกิลเบิร์ต b2gills

ใช่ขอโทษด้วยความสับสน นี่เป็น chllenge แรกของฉันและฉันไม่รู้ว่ามีกฎสำหรับอินพุตและเอาต์พุตอยู่แล้ว ฉันเปลี่ยนเพราะคำตอบส่วนใหญ่ใช้กฎเหล่านี้แม้ว่ามันจะไม่จำเป็นก็ตาม
Hubert Grzeskowiak

2

ความจริง 42 ไบต์

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

รหัสทดสอบและผลลัพธ์

(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

Thanks to @Quentin for saving two 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;}}

Try it online!


L.begin() -> begin(L) saves one byte :)
Quentin

Also, using T=std::vector<std::string>; saves another! Who knew modern pretty syntax could also help golfing.
Quentin

@Quentin I tried that at first. Probably there was some simple typo I didn't notice.
Steadybox


1

Pyth, 5 bytes

hS/LF

Takes the list first and the set second. Test suite.

Explanation:

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

This is my first code golf challenge and answer, so not sure about the format. Does it need to be a full compiling program? Do I need to define the parameters? Suggestions appreciated.

EDIT: wrapped code in a function. Thanks @Steadybox


An answer can be a full program, a function or some other function-like construct. You can take the parameters for example as arguments to a function or from standard input.
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 coming soon

Explanation

  • creates local variable m.

  • maps the set to a stream.

  • for each element, if the number of occurances of the element in the list is less than m, m is set to that value.

  • returns m, which is the number of complete versions of the set


0

R 54 Bytes

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

Explanation: creating a table of the counts of only the values in the list that also appear in the sublist.

I then turn the variable into a factor in order to generate zeros if a value that appears in the sublist does not appear in the list. Finally, I take the minimum of the counts.


0

R, 61 57 44 bytes

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

Anonymous function. Apparently you don't have to define a function for this challenge. Saved 13 bytes thanks to count.

Explanation:

sum(l%in%x)) returns the number of times a string in s is found in 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.


Could be brought down to 40 Bytes with a for-loop: z=c();for(i in s)z[i]=sum(l%in%i);min(z)
count

Or even further to 37 bytes with sapply: min(sapply(s,function(x)sum(l%in%x)))
count

Brilliant, I always forget you can sum booleans. I'll edit that in later. I've been told I need that print() if it's not a function.
BLT

0

JavaScript (ES6), 59 bytes

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

Try it

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.