Đếm số cách đặt bóng vào thùng


9

Trong nhiệm vụ này, bạn được cung cấp một số lượng lẻ các quả bóng trắng và cùng số lượng các quả bóng đen. Nhiệm vụ là đếm tất cả các cách đặt các quả bóng vào thùng để trong mỗi thùng có một số lẻ của mỗi màu.

Ví dụ, giả sử chúng ta có 3 quả bóng trắng. Các cách khác nhau là:

(wwwbbb)
(wb)(wb)(wb)

cho hai khả năng khác nhau.

Nếu chúng ta có 5 quả bóng trắng, các cách khác nhau là:

(wwwwwbbbbb)
(wwwbbb)(wb)(wb)
(wwwb)(wbbb)(wb)
(wb)(wb)(wb)(wb)(wb)

Bạn có thể lấy đầu vào, là một số nguyên duy nhất, theo bất kỳ cách nào bạn muốn. Đầu ra chỉ là một số nguyên duy nhất.

Mã của bạn phải đủ nhanh để bạn đã thấy nó hoàn thành cho 11 quả bóng trắng.

Bạn có thể sử dụng bất kỳ ngôn ngữ hoặc thư viện mà bạn thích.


Xin làm rõ, đầu ra của chúng tôi có thể chỉ là số lượng các cách khác nhau? Đó là, một số duy nhất là đầu ra?
orlp

5
Tôi giả sử đây là từ math.stackexchange.com/questions/2736933/NH Bạn nên trích dẫn nó @Lembik
qwr

3
Tôi nghĩ bạn nên đưa ra tiêu chí tốc độ hoặc làm cho nó cụ thể hơn. "Đủ nhanh" là quá mơ hồ.
dylnan

1
Bạn có biết rằng người dùng PPCG đủ điên rồ rằng họ thà chi tiền cho việc sử dụng siêu máy tính để tính toán nó cho 11 hơn là lấy thêm 1 byte? Vậy tại sao lại lãng phí tiền của họ? :)
dùng202729

1
(nhận xét: Có thể tính toán hàm P một cách hiệu quả với một công thức phức tạp . Cũng có thể tính toán hàm này với một công thức phù hợp.)
user202729

Câu trả lời:


5

Pari / GP, 81 byte

p=polcoeff;f(n)=p(p(prod(i=1,n,prod(j=1,n,1+(valuation(i/j,2)==0)*x^i*y^j)),n),n)

Để hiệu quả hơn, thay thế 1+bằng 1+O(x^(n+1))+O(y^(n+1))+( Othuật ngữ đầu tiên đã giúp rất nhiều).

Hãy thử trực tuyến! (phiên bản 86 byte trước đó với một cặp parens không cần thiết và không có p=chữ viết tắt)

Phiên bản cũ, 90 byte

f(n)=polcoeff(polcoeff(taylor(1/prod(i=0,n,prod(j=0,n,1-x^(2*i+1)*y^(2*j+1))),x,n+1),n),n)

Máy tính f(11)cần kích thước ngăn xếp lớn hơn, thông báo lỗi sẽ cho bạn biết cách tăng nó. Nó hiệu quả hơn (nhưng ít chơi gôn hơn) để thay thế hai ncái xuất hiện như là đối số thứ hai prodvới (n-1)/2.


Làm việc tới 13 cho tôi!

Tôi đoán đó là với phiên bản sử dụng (n-1)/2?
Christian Sievers

Vâng, điểm tốt.

Không quan tâm, bạn có nghĩ rằng có thể tính f (500) không?

2
Phải mất vài phút để tính f (500) = 214621724504756565823588442604868476223315183681404
Christian Sievers

7

Python 3, 108 byte

C=lambda l,r,o=():((l,r)>=o)*l*r%2+sum(C(l-x,r-y,(x,y))for x in range(1,l,2)for y in range(1,r,2)if(x,y)>=o)

Liệt kê đệ quy tất cả các bộ, đảm bảo không bị trùng lặp bằng cách luôn tạo các bộ theo thứ tự. Hợp lý nhanh khi ghi nhớ bằng cách sử dụng C = functoools.lru_cache(None)(C), nhưng điều này là không cần thiết cho n = 11.

Gọi C(num_white, num_black)để nhận kết quả của bạn. Cặp đôi đầu tiên của n:

1: 1
3: 2
5: 4
7: 12
9: 32
11: 85
13: 217
15: 539
17: 1316
19: 3146
21: 7374

Để tạo kết quả:

def odd_parts(l, r, o=()):
    if l % 2 == r % 2 == 1 and (l, r) >= o:
        yield [(l, r)]

    for nl in range(1, l, 2):
        for nr in range(1, r, 2):
            if (nl, nr) < o: continue
            for t in odd_parts(l - nl, r - nr, (nl, nr)):
                yield [(nl, nr)] + t

Ví dụ: (7, 7):

[(7, 7)]
[(1, 1), (1, 1), (5, 5)]
[(1, 1), (1, 1), (1, 1), (1, 1), (3, 3)]
[(1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1)]
[(1, 1), (1, 1), (1, 1), (1, 3), (3, 1)]
[(1, 1), (1, 3), (5, 3)]
[(1, 1), (1, 5), (5, 1)]
[(1, 1), (3, 1), (3, 5)]
[(1, 1), (3, 3), (3, 3)]
[(1, 3), (1, 3), (5, 1)]
[(1, 3), (3, 1), (3, 3)]
[(1, 5), (3, 1), (3, 1)]

Thực sự rất tốt đẹp.

2

Python 3 , 180 172 byte

def f(n):
 r=range;N=n+1;a=[N*[0]for _ in r(N)];R=r(1,N,2);a[0][0]=1
 for i in R:
  for j in R:
   for k in r(N-i):
    for l in r(N-j):a[k+i][l+j]+=a[k][l]
 return a[n][n]

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

Thực hiện đơn giản các chức năng tạo. Dài nhưng (phần nào) hiệu quả. O (n 4 ) thời gian, bộ nhớ O (n 2 ).

Mảng kết quả achứa tất cả các kết quả của tất cả các kích thước tối đa n, mặc dù chỉ a[n][n]được trả về.


Mã của bạn tính gì cho n, không quan tâm? Như trong một [4] [4].

Đây là giải pháp nhanh nhất cho đến nay quá!

2
@Lembik a [4] [4] = Số cách đặt 4 quả bóng trắng và 4 quả bóng đen vào thùng, mỗi thùng có số lượng bóng trắng lẻ và số lượng bóng đen lẻ. Exacly như trong defintion.
dùng202729

1

Python 2 ,168 181 byte

from itertools import*
r,p=range,product
def f(n):
 a,R=eval(`[[0]*n]*n`),r(1,n,2);a[0][0]=1
 for i,j in p(R,R):
  for k,l in p(r(n-i),r(n-j)):a[k+i][l+j]+=a[k][l]
 return a[-1][-1]

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


Đây là một đoạn mã (giả sử ncó chứa đầu vào) Bạn nên thêm def f(n):hoặc n=input()(để biến nó thành chức năng / toàn bộ chương trình.)
user202729

Và ... đây là Python 2, bạn có thể sử dụng một tab thay vì hai khoảng trắng. Lưu một byte. Có athể eval(`[[0]*n]*n`)(nơi `viết tắt của repr).
dùng202729
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.