Hitung jumlah cara memasukkan bola ke tempat sampah

9

Dalam tugas ini Anda diberi jumlah bola putih ganjil dan jumlah bola hitam yang sama. Tugasnya adalah menghitung semua cara memasukkan bola ke dalam tong sehingga di setiap nampan ada jumlah ganjil dari setiap warna.

Misalnya, kita memiliki 3 bola putih. Cara yang berbeda adalah:

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

untuk dua kemungkinan berbeda.

Jika kita memiliki 5 bola putih, caranya adalah:

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

Anda dapat mengambil input, yang merupakan bilangan bulat tunggal, dengan cara apa pun yang Anda suka. Outputnya hanya satu bilangan bulat.

Kode Anda harus cukup cepat sehingga Anda telah melihatnya lengkap untuk 11 bola putih.

Anda dapat menggunakan bahasa atau perpustakaan apa saja yang Anda suka.


sumber
Tolong jelaskan, dapatkah hasil kami hanya sejumlah cara yang berbeda? Artinya, satu nomor sebagai keluaran?
orlp
5
Saya berasumsi ini dari math.stackexchange.com/questions/2736933/... Anda harus mengutipnya @Lembik
qwr
3
Saya pikir Anda harus mengambil kriteria kecepatan atau membuatnya lebih spesifik. "Cukup cepat" terlalu kabur.
dylnan
1
Anda tahu bahwa pengguna PPCG cukup gila sehingga mereka lebih suka menghabiskan uang untuk menggunakan superkomputer untuk menghitungnya selama 11 daripada mengambil 1 byte lebih? Jadi mengapa membuang-buang uang mereka? :)
user202729
1
(komentar: Mungkin untuk menghitung fungsi P secara efisien dengan rumus yang rumit . Mungkin juga dapat menghitung fungsi ini, dengan formula yang sesuai.)
user202729

Jawaban:

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)

Untuk lebih efisien, ganti 1+dengan 1+O(x^(n+1))+O(y^(n+1))+( Oistilah pertama saja sudah banyak membantu).

Cobalah online! (versi 86 byte sebelumnya dengan sepasang parens yang tidak dibutuhkan dan tanpa p=singkatan)

Versi lama, 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)

Komputasi f(11)membutuhkan ukuran tumpukan yang lebih besar, pesan kesalahan akan memberi tahu Anda cara meningkatkannya. Ini lebih efisien (tapi kurang Golfy) untuk menggantikan dua nyang muncul sebagai argumen kedua proddengan (n-1)/2.

Sievers Kristen
sumber
Bekerja hingga 13 untuk saya!
Saya kira itu dengan versi menggunakan (n-1)/2?
Christian Sievers
Ya, poin bagus.
Karena ketertarikan, menurut Anda apakah mungkin untuk menghitung f (500)?
2
Diperlukan beberapa menit untuk menghitung 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)

Secara berulang menyebutkan semua set, memastikan untuk tidak mendapatkan duplikat dengan selalu menghasilkan set secara berurutan. Cukup cepat saat menggunakan memoized C = functoools.lru_cache(None)(C), tetapi ini tidak perlu dilakukan n = 11.

Telepon C(num_white, num_black)untuk mendapatkan hasil Anda. Pasangan pertama n:

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

Untuk menghasilkan hasil:

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

Misalnya untuk (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)]
orlp
sumber
Memang sangat bagus.
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]

Cobalah online!

Implementasi langsung dari fungsi pembangkit. Panjang tapi (agak) efisien. O (n 4 ) waktu, O (n 2 ) memori.

Array yang dihasilkan aberisi semua hasil dari semua ukuran hingga n, meskipun hanya a[n][n]dikembalikan.

pengguna202729
sumber
Apa yang dihitung kode Anda untuk genap n, tanpa minat? Seperti dalam [4] [4].
Ini adalah solusi tercepat sejauh ini juga!
2
@Lembik a [4] [4] = Jumlah cara untuk memasukkan 4 bola putih dan 4 bola hitam ke dalam nampan, setiap nampan memiliki jumlah ganjil dari bola putih dan jumlah ganjil dari bola hitam. Persis seperti dalam definisi.
user202729
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]

Cobalah online!

Sunny Patel
sumber
Ini adalah cuplikan (anggap nberisi input) Anda harus menambahkan def f(n):atau n=input()(menjadikannya fungsi / program penuh resp.)
user202729
Dan ... ini Python 2, Anda bisa menggunakan tab alih-alih dua spasi. Menghemat satu byte. Itu abisa eval(`[[0]*n]*n`)(di mana `singkatan repr).
user202729