Topları çöp kutularına koymanın yollarını sayın


9

Bu görevde size tek sayıda beyaz top ve aynı sayıda siyah top verilir. Görev, topları çöp kutularına koymanın tüm yollarını saymaktır, böylece her kutuda her rengin tek bir sayısı vardır.

Örneğin, 3 beyaz topumuz olduğunu varsayalım. Farklı yollar:

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

iki farklı olasılık için.

5 beyaz topumuz varsa, farklı yollar:

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

Tek bir tam sayı olan girdiyi istediğiniz şekilde alabilirsiniz. Çıktı sadece tek bir tamsayıdır.

Kodunuz 11 beyaz top için tamamlanmış olarak görülebilecek kadar hızlı olmalıdır.

İstediğiniz herhangi bir dili veya kütüphaneyi kullanabilirsiniz.


Lütfen açıklığa kavuşturun, çıktımız sadece farklı yolların sayısı olabilir mi? Yani, çıktı olarak tek bir sayı?
orlp

5
Bunun math.stackexchange.com/questions/2736933/… olduğunu varsayıyorum @Lembik
qwr 14:18

3
Bence hız kriterini çıkarmalı ya da daha spesifik hale getirmelisiniz. "Yeterince hızlı" çok belirsiz.
dylnan

1
PPCG kullanıcılarının 11 için hesaplamak için bir süper bilgisayar kullanmaya para harcamak isteyecek kadar çılgın olduklarını biliyor musunuz? Öyleyse neden paralarını boşa harcıyorsun? :)
user202729

1
(açıklama: P işlevini karmaşık bir formülle verimli bir şekilde hesaplamak mümkündür. Bu işlevi uygun bir formülle de hesaplamak mümkün olabilir.)
user202729

Yanıtlar:


5

Pari / GP, 81 bayt

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)

Daha fazla verim için değiştirin 1+ile 1+O(x^(n+1))+O(y^(n+1))+(ilk Oyalnız terim zaten çok yardımcı olur).

Çevrimiçi deneyin! (bir çift gereksiz parens ile ve p=kısaltma olmadan 86 bayt sürümü )

Eski sürüm, 90 bayt

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)

Hesaplamanın f(11)daha büyük bir yığın boyutuna ihtiyacı vardır, hata mesajı size onu nasıl artıracağınızı söyleyecektir. Bu iki yerine daha verimli (ama daha az Golfy) var nikinci argüman olarak görünür prodile (n-1)/2.


Benim için 13'e kadar çalışıyor!

Sanırım sürümü kullanarak (n-1)/2?
Christian Sievers

Evet, iyi bir noktaya değindiniz.

İlgilenmiyorum, f (500) 'ü hesaplamanın mümkün olduğunu düşünüyor musunuz?

2
F (500) = 214621724504756565823588442604868476223315183681404
Christian Sievers

7

Python 3, 108 bayt

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)

Tüm setleri yinelemeli olarak numaralandırır, her zaman siparişleri sırayla oluşturarak kopyaların alınmadığından emin olun. Kullanarak C = functoools.lru_cache(None)(C)not edildiğinde oldukça hızlı , ancak bu gerekli değildir n = 11.

C(num_white, num_black)Sonuç almak için arayın . İlk çift n:

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

Sonuçları oluşturmak için:

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

Örneğin (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)]

Gerçekten çok iyi.

2

Piton 3 , 180 172 bayt

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]

Çevrimiçi deneyin!

Üretme fonksiyonunun doğrudan uygulanması. Uzun ama (biraz) verimli. O (n 4 ) süresi, O (n 2 ) bellek.

Sonuçta elde edilen dizi a, nyalnızca a[n][n]döndürülmesine rağmen , tüm boyutlardaki tüm sonuçları içerir .


Kodunuz ilgisiz n için bile neyi hesaplar? [4] [4] 'te olduğu gibi.

Bu şimdiye kadarki en hızlı çözüm!

2
@Lembik a [4] [4] = Kutulara 4 beyaz ve 4 siyah top koymanın yol sayısı, her kutuda tek sayıda beyaz top ve tek sayıda siyah top vardır. Tam olarak tanımında olduğu gibi.
user202729

1

Python 2 ,168 181 bayt

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]

Çevrimiçi deneyin!


Bu bir ndef f(n):n=input()
kod pasajıdır

Ve ... bu Python 2, iki boşluk yerine bir sekme kullanabilirsiniz. Bir bayt kaydeder. aOlabilir eval(`[[0]*n]*n`)(burada `açılımı repr).
user202729
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.