Số lần xuất hiện của một tập hợp trong danh sách


15

Đưa ra một bộ chuỗi không trống và một danh sách các chuỗi, tìm hiểu số lần bộ đó xảy ra trong danh sách, tức là bạn có thể tạo bộ bao nhiêu lần với các mục từ danh sách. Mỗi yếu tố từ danh sách chỉ có thể được sử dụng một lần.

Gợi ý: một bộ là một danh sách không có thứ tự các mục duy nhất.

Mặc định quy tắc đầu vào / đầu ra áp dụng.

Không cho phép thư viện bên ngoài. Trình biên dịch / trình thông dịch libs ổn. Đây là mã golf, vì vậy giải pháp ngắn nhất tính.


Các trường hợp thử nghiệm:

["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: đã xóa một câu cho biết các thông số đầu vào được xác định trong phạm vi cục bộ. Điều này mâu thuẫn với các quy tắc IO mặc định được liên kết ở trên.


Vâng, điều đó làm rõ nó. Tuy nhiên tôi hơi treo lên câu thứ ba. Bạn có ý nghĩa gì bởi "không xử lý các đối tượng"?
Đăng Rock Garf Hunter

@WheatWizard một số ngôn ngữ không hướng đối tượng và không biết khái niệm so sánh các đối tượng tùy ý.
Hubert Grzeskowiak

1
Có lẽ bạn nên thay đổi điều đó thành hướng đối tượng bởi vì mọi ngôn ngữ tôi biết đều xử lý các đối tượng thuộc loại nào đó ngay cả khi các đối tượng là một lớp đóng. Tôi cũng nên chỉ ra rằng có rất nhiều ngôn ngữ cũng không thể xử lý các chuỗi.
Đăng Rock Garf Hunter

@WheatWizard ổn, mô tả cập nhật. Đoạn đó có nghĩa là cho các ngôn ngữ như C, Trình biên dịch hoặc Maple.
Hubert Grzeskowiak

Những ngôn ngữ được hướng đối tượng? Họ nên sử dụng cái gì nếu không phải là chuỗi? Tôi nghĩ rằng điều dễ nhất sẽ là hạn chế chỉ chuỗi. Hoặc, thay vào đó, chỉ số nguyên. Xem lời khuyên này về việc sử dụng loại đơn giản nhất đủ.
xnor

Câu trả lời:


12

Python, 30 byte

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

Hãy thử trực tuyến!


Đẹp một. Không nghĩ về việc sử dụng bản đồ. Bạn có thể tiết kiệm một chút bằng cách sử dụng in thay vì xác định lambda BTW.
Hubert Grzeskowiak

1
@HubertGrzeskowiak Thay đổi lambdathành a printmang lại số byte lên tới 37 vì hai input()s bắt buộc.
Đăng Rock Garf Hunter

@WheatWizard như đã nêu trong thử thách, hãy xem xét các yếu tố đầu vào được xác định trong phạm vi địa phương. Bạn KHÔNG bắt buộc phải có các đầu vào được xác định rõ ràng, ví dụ như các tham số hàm hoặc đầu vào của người dùng.
Hubert Grzeskowiak

@HubertGrzeskowiak nếu không có lý do chính đáng cho điều đó, bạn không nên ghi đè mặc định của chúng tôi để nhận đầu vào và đầu ramặc định
codegolf

@ovs oh, tôi không biết bài đó. Cảm ơn.
Hubert Grzeskowiak

6

Thạch , 4 byte

⁼þSṂ

Hãy thử trực tuyến!

Làm sao?

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

Thạch , 6 5 4 byte

ċ@€Ṃ

Hãy thử trực tuyến!

Đối số đầu tiên của chương trình là tập hợp và đối số thứ hai là danh sách.

Giải trình

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

-1 byte một lần nữa nhờ @ETHproductions


Rất đẹp! Bạn có thể lưu một byte bằng cách kết hợp các liên kết thành một dòng: ⁹ċ$€ṂTôi có cảm giác có thể rút ngắn hơn bằng cách sử dụng đối số đúng ngầm thay cho ...
ETHproductions

Tôi nghĩ rằng ċ@€Ṃ hoạt động để lưu một byte khác ... ( @đảo ngược các đối số thành ċ)
ETHproductions

@ETHproductions Hoạt động chính xác theo như tôi đã thử nghiệm.
fireflame241

Nó không tồn tại cho đến ngày 12 tháng 5 năm ngoái, nhưng thay vào đó @€(với các đối số đảo ngược với chương trình) sẽ tiết kiệm được một byte khác: Hãy thử trực tuyến!
Chuỗi không liên quan

6

JavaScript (ES6), 56 byte

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

Dùng thử trực tuyến


1
Lưu 2 byte bằng cách sử dụng một hàm ẩn danh và một hàm khác bằng cách xáo trộn các tham số: n=>h=>Math.min(...n.map(c=>h.filter($=>$==c).length))cho 53 byte
Shaggy

5

JavaScript (ES6), 64 byte

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

Giả sử cả hai sllà mảng của các đối tượng. Sử dụng JavaScript bình đẳng nghiêm ngặt để so sánh, vì vậy, ví dụ [] === []là sai.


Giải pháp rất thú vị. Vui lòng trả lại hoặc in kết quả. AFAIK này trả về một chức năng ẩn danh.
Hubert Grzeskowiak

2
@HubertGrzeskowiak Mã như được hiển thị đánh giá một hàm ẩn danh. Khi được gọi, hàm trả về số lượng như mong muốn.
Neil

4

Haskell , 37 34 byte

Cảm ơn @Laikoni đã cạo sạch ba byte.

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

Gọi với (set::[a]) # (list::[a])nơi alà bất kỳ loại bắt nguồn Eq.


Thay vì length[y|y<-l,y==x]bạn có thể sử dụng sum[1|y<-l,y==x].
Laikoni

@Laikoni, bạn có chắc về điều đó? Tôi nghĩ rằng tôi sẽ cần phải sử dụng một cái gì đó giống như sum[1|y<-l,y==x,_<-y], nó dài hơn hai byte. Tôi chắc chắn có thể thiếu thứ gì đó ở đó
Julian Wolf

Đừng bận tâm, bạn chắc chắn đúng. Cuộc gọi tốt
Julian Wolf


3

Toán học, 24 byte

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

Hàm thuần túy lấy hai danh sách làm đối số theo thứ tự được đề xuất và trả về một số nguyên không âm. Tallyđếm có bao nhiêu lần xuất hiện của mỗi ký hiệu xảy ra trong danh sách đầu vào và #/.Rule@@@chuyển đổi từng phần tử của bộ đầu vào thành số lần xuất hiện tương ứng.


3

T-SQL, 62 59 byte

Phiên bản trước không hoạt động đối với các bộ không có kết quả khớp

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

Với s và l là các bảng và cột được đặt tên giống như bảng

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 byte

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

giải trình:

s.map{} đi qua từng từ trong s và sẽ tạo ra một mảng đếm

w in Đặt tên cho từ được ánh xạ để sử dụng trong bộ lọc tiếp theo

l.filter{} áp dụng một bộ lọc cho mảng l

$0==w là điều kiện lọc phù hợp với từ w

.count đưa ra số phần tử của l đáp ứng điều kiện

.min() trả về số lượng thấp nhất trong kết quả được ánh xạ


1
Chào mừng đến với PPCG! Tôi đã thêm định dạng mã cho giải pháp của bạn. Bạn có thể làm điều này bằng cách thêm 4 khoảng trắng vào các dòng có chứa mã.
Mego

3

APL (Dyalog) , 9 byte

⌊/+/⎕∘.≡⎕

Hãy thử trực tuyến!

 được đánh giá đầu vào (danh sách các chuỗi)

⎕∘.≡ nhận đánh giá đầu vào (bộ chuỗi không trống) và tạo bảng tương đương

+/ thêm vào

⌊/ tối thiểu trên


2

Perl 6 ,  37  18 byte

37

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

Thử nó

Mở rộng:

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

Xem Bộ, Túi và Hỗn hợp để biết thêm thông tin.


18

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

Thử nó

Giải trình:

@^b.Bagtạo Túi từ
{@^a}khóa giá trị vào Túi đó (trả về danh sách số đếm)
.minlấy giá trị tối thiểu của danh sách kết quả



Câu trả lời gọn gàng, nhưng cả hai đều không giống chức năng / chương trình hoàn chỉnh
Julian Wolf

@JulianWolf Tôi có ấn tượng rằng các đoạn được cho phép dựa trên các câu lệnh Hãy xem xét cả hai yếu tố đầu vào được định nghĩa trong phạm vi hiện tại là s và l. Và và Bạn không cần phải xác định hàm .
Brad Gilbert b2gills

Ah, bạn hoàn toàn đúng. Điều đó phải được chỉnh sửa thành câu hỏi sau khi tôi đọc nó. Trong mọi trường hợp, tôi thích tính thẩm mỹ của phiên bản này hơn cả cú pháp của Perl cuối cùng sẽ luôn là một bí ẩn đối với tôi.
Julian Wolf

@JulianWolf Đây thực sự không phải là một ví dụ hay về mã Perl 6. Tôi khuyên bạn nên xem cuộc trò chuyện 1 giờ của Ovid Perl 6 - Tại sao mọi người rất phấn khích hoặc nhìn vào tab Tài nguyên trên Perl6.org .
Brad Gilbert b2gills

Vâng, xin lỗi vì sự nhầm lẫn. Đây là chllenge đầu tiên của tôi và tôi không biết đã có quy tắc cho đầu vào và đầu ra. Tôi đã thay đổi nó vì hầu hết các câu trả lời đều sử dụng các quy tắc này ngay cả khi không bắt buộc.
Hubert Grzeskowiak

2

Tiên đề, 42 byte

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

mã kiểm tra và kết quả

(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 byte

Cảm ơn @Quentin đã lưu hai byte!

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

Hãy thử trực tuyến!


L.begin()-> begin(L)tiết kiệm một byte :)
Quentin

Ngoài ra, using T=std::vector<std::string>;tiết kiệm khác! Ai biết cú pháp đẹp hiện đại cũng có thể giúp chơi golf.
Quentin

@Quentin Lúc đầu tôi đã thử. Có lẽ có một số lỗi đánh máy đơn giản mà tôi đã không nhận thấy.
Steadybox

1

PHP, 74 byte

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

Tủ thử

PHP, 108 byte

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

Tủ thử


1

Bình thường, 5 byte

hS/LF

Đưa danh sách đầu tiên và thiết lập thứ hai. Bộ thử nghiệm.

Giải trình:

    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 byte

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

Đây là thử thách và câu trả lời về mã golf đầu tiên của tôi, vì vậy không chắc chắn về định dạng. Có cần phải là một chương trình biên dịch đầy đủ? Tôi có cần xác định các tham số không? Gợi ý đánh giá cao.

EDIT : bọc mã trong một chức năng. Cảm ơn @Steadybox


Một câu trả lời có thể là một chương trình đầy đủ, một chức năng hoặc một số cấu trúc giống như chức năng khác . Bạn có thể lấy các tham số ví dụ làm đối số cho hàm hoặc từ đầu vào tiêu chuẩn.
Steadybox


1

Java, 114 byte

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

Sắp có

Giải trình

  • tạo biến cục bộ m.

  • ánh xạ tập hợp thành một luồng.

  • đối với mỗi phần tử, nếu số lần xuất hiện của phần tử trong danh sách nhỏ hơn m, m được đặt thành giá trị đó.

  • trả về m, là số phiên bản hoàn chỉnh của bộ


0

R 54 byte

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

Giải thích: tạo bảng tổng số chỉ các giá trị trong danh sách cũng xuất hiện trong danh sách phụ.

Sau đó tôi biến biến thành một yếu tố để tạo số không nếu một giá trị xuất hiện trong danh sách con không xuất hiện trong danh sách. Cuối cùng, tôi lấy số lượng tối thiểu.


0

R, 61 57 44 byte

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

Chức năng ẩn danh. Rõ ràng bạn không phải xác định chức năng cho thử thách này. Lưu được 13 byte nhờ đếm.

Giải trình:

sum(l%in%x))trả về số lần một chuỗi trong sđược tìm thấy trong l.

lapply(s,function(x))áp dụng điều đó cho từng chuỗi sriêng biệt và trả về một danh sách các khoản tiền.

min() trả về giá trị nhỏ nhất từ ​​danh sách đó


Có thể giảm xuống 40 Byte với vòng lặp for:z=c();for(i in s)z[i]=sum(l%in%i);min(z)
đếm

Hoặc thậm chí xa hơn đến 37 byte với sapply:min(sapply(s,function(x)sum(l%in%x)))
đếm

Rực rỡ, tôi luôn quên bạn có thể tổng hợp booleans. Tôi sẽ chỉnh sửa nó sau. Tôi đã nói rằng tôi cần bản in đó () nếu nó không phải là một chức năng.
BLT

0

JavaScript (ES6), 59 byte

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

Thử nó

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.