चॉकलेट नंबर


17

चॉकलेट बार mद्वारा n, m,nसकारात्मक को देखते हुए , बार को mn1 टुकड़ों में तोड़ने के तरीकों की संख्या को आउटपुट करें जहां प्रत्येक ब्रेक एक ग्रिडलाइन पर होता है।

आदेश महत्वपूर्ण है। टुकड़े भी अलग-अलग होते हैं, इसलिए 1 बाय 3 चॉकलेट बार के दोनों छोर बराबर नहीं होते हैं।

उदाहरण के लिए, 2 बाय 2 ब्लॉक हमारे पास है:

 _ _            _   _            _   _            _   _
|_‖_|    ->    |‗| |_|    ->    |_| |‗|    ->    |_| |_|
|_‖_|          |_| |_|           _  |_|           _   _
                                |_|              |_| |_|


 _ _            _   _            _   _            _   _
|_‖_|    ->    |_| |‗|    ->    |‗| |_|    ->    |_| |_|
|_‖_|          |_| |_|          |_|  _            _   _
                                    |_|          |_| |_|


 _ _            _ _              _   _            _   _
|‗|‗|    ->    |_‖_|      ->    |_| |_|    ->    |_| |_|
|_|_|           _ _               _ _             _   _
               |_|_|             |_‖_|           |_| |_|


 _ _            _ _               _ _             _   _
|‗|‗|    ->    |_|_|      ->     |_‖_|    ->     |_| |_|
|_|_|           _ _              _   _            _   _
               |_‖_|            |_| |_|          |_| |_|

इसलिए 2 बाय 2 चॉकलेट बार को तोड़ने के 4 तरीके हैं।

नियम

  • इनपुट फंक्शन इनपुट, एसटीडीआईएन, कमांड लाइन या इसी तरह के दो पूर्णांक होंगे। एक ही नंबर आउटपुट, चॉकलेट बार को तोड़ने के तरीकों की संख्या।

  • चूंकि संख्याएं बहुत तेज़ी से बढ़ती हैं, इसलिए चिंता न करें कि क्या आउटपुट आपकी भाषा की पूर्णांक सीमा से अधिक है - आपका सबमिशन तब तक मान्य होगा जब तक एल्गोरिथम सैद्धांतिक रूप से सभी संभावित इनपुट के लिए काम करता है।

परीक्षण के मामलों

आउटपुट के आदेश पर निर्भर नहीं करता है m,n, इसलिए परीक्षण मामलों को ऐसे सूचीबद्ध किया जाता है m <= n

1 1 -> 1
1 2 -> 1
1 3 -> 2
1 4 -> 6
1 5 -> 24
1 10 -> 362880

2 2 -> 4
2 3 -> 56
2 4 -> 1712
2 5 -> 92800
2 10 -> 11106033743298560

3 3 -> 9408
3 4 -> 4948992
3 5 -> 6085088256
3 10 -> 76209753666310470268511846400

4 4 -> 63352393728

A261964 एक त्रिकोण में व्यवस्थित चॉकलेट नंबर है जैसे कि प्रत्येक पंक्ति योग से मेल खाती है m+n

जवाबों:


7

गणितज्ञ, 85 बाइट्स

f=If[##==1,1,Tr[Sum[Binomial[1##-2,i#-1]f[i,#]f[#2-i,#],{i,#2-1}]&@@@{{##},{#2,#}}]]&

परीक्षण का मामला

f[4,4]
(* 63352393728 *)

3

पायथन 3, 168 , 156 , 147 बाइट्स

चैट में सुधार के लिए धन्यवाद

f=lambda n:n<1or n*f(n-1);a=lambda m,n,c=lambda m,n:sum(f(m*n-2)/f(i*n-1)/f((m-i)*n-1)*a(i,n)*a(m-i,n)for i in range(1,m)):+(m+n<4)or c(m,n)+c(n,m)

Ungolfed:

f=lambda n:n<1or n*f(n-1) # Factorial
def a(m, n):
    if m+n < 4:
        return 1
    first = 0
    for i in range(1,m):
        first += f(m*n-2) * 1/f(i*n-1) * 1/f((m-i)*n-1) * a(i,n) * a(m-i,n)
    second = 0
    for i in range(1,n):
        second += f(m*n-2) * 1/f(i*m-1) * 1/f((n-i)*m-1) * a(i,m) * a(n-i,m)
    return first + second

एल्गोरिदम इस पेपर पर आधारित था ।

मैं शायद इसे बहुत अधिक काट सकता हूं, मुझे यकीन नहीं है कि कहां है


3

आर, 208 198 बाइट्स

f=function(m,n){g=function(i,j){a=0;if(j>1)for(x in 2:j-1)a=a+choose(j*i-2,x*i-1)*M[x,i]*M[j-x,i];a};s=max(m,n);M=matrix(1,s,s);for(i in 1:s)for(j in 1:s)if(i*j>2)M[i,j]=M[j,i]=g(i,j)+g(j,i);M[m,n]}

नई कहानियों के साथ प्रस्तुत:

f = function(m,n){
    g=function(i,j){
        a = 0
        if(j>1) for(x in 2:j-1) a = a + choose(j*i-2,x*i-1) * M[x,i] * M[j-x,i]
        a
    }
    s = max(m,n)
    M = matrix(1,s,s)
    for(i in 1:s) for(j in 1:s) if(i*j>2) M[i,j] = M[j,i] = g(i,j) + g(j,i)
    M[m,n]
}

उपयोग:

> f(3,1)
[1] 2
> f(3,2)
[1] 56
> f(3,3)
[1] 9408
> f(4,3)
[1] 4948992
> f(5,3)
[1] 6085088256

सिद्धांत रूप में, कोई ca का छोटा पुनरावर्ती संस्करण लिख सकता है। 160 बाइट्स लेकिन यह जल्दी से डिफ़ॉल्ट पुनरावर्तन सीमा और डिफ़ॉल्ट सुरक्षा स्टैक आकार तक पहुंच जाता है और इन चूक (क्रमशः उपयोग options(expressions=...)और तर्क --max-ppsize=) को संशोधित करने से इस एक से अधिक लंबा कोड होगा।
प्लेनैपस

आप दो बाइट्स को छोड़ कर बचा सकते हैं f=
एलेक्स ए।

2

पायथन 2, 135 बाइट्स

C=lambda A:sum(C(A[:i]+A[i+1:]+[(c,H),(W-c,H)])for i,Q in enumerate(A)for W,H in(Q,Q[::-1])for c in range(1,W))or 1
print C([input()])

यहाँ मैं क्या लेकर आया हूँ। यह वास्तव में धीमा है, लेकिन यहाँ एक तेज़ संस्करण है ( repoze.lru की आवश्यकता है ):

from repoze.lru import lru_cache
C=lru_cache(maxsize=9999)(lambda A:sum(C(tuple(sorted(A[:i]+A[i+1:]+((c,H),(W-c,H)))))for i,Q in enumerate(A)for W,H in(Q,Q[::-1])for c in range(1,W))or 1)
print C((input(),))

उदाहरण

$ time python2 chocolate.py <<< 2,5
92800

real    0m2.954s
user    0m0.000s
sys     0m0.015s

$ time python2 chocolate-fast.py <<< 3,5
6085088256

real    0m0.106s
user    0m0.000s
sys     0m0.015s

व्याख्या

कोड एक फ़ंक्शन को परिभाषित करता है Cजो टुकड़ों की एक सरणी लेता है। एल्गोरिथ्म इस प्रकार है:

  1. for i,Q in enumerate(A): टुकड़ों की सरणी के माध्यम से लूप।
  2. for W,H in(Q,Q[::-1]): 90 डिग्री घूमते हुए दो बार तरीके की गणना करें।
  3. for c in range(1,W): पर विभाजित करने के लिए संभावित पदों के माध्यम से लूप।
  4. A[:i]+A[i+1:]+[(c,H),(W-c,H)]: स्प्लिट पीस के बिना और दो नए टुकड़ों के साथ एक सूची प्राप्त करें।
  5. C(…): उस सूची पर फिर से फ़ंक्शन को कॉल करें।
  6. sum(…): प्रत्येक संभावित विभाजन के लिए परिणाम लिखें।
  7. or 1: यदि कोई विभाजन संभव नहीं है, तो चॉकलेट को विभाजित करने का एक तरीका है।

अंत में, कोड को इनपुट युक्त एक सरणी के साथ कहा जाता है।


1

ईएस 6, 141 बाइट्स

c=(m,n)=>(f=n=>n<2||n*f(n-1),h=(m,n)=>[...Array(m-1)].reduce((t,_,i)=>t+f(m*n-2)/f(++i*n-1)/f((m-i)*n-1)*c(i,n)*c(m-i,n),0),h(m,n)+h(n,m))||1

@CameronAavik द्वारा पाए गए सूत्र के आधार पर। Ungolfed:

function fact(n) {
    return n < 2 ? 1 : n * f(n - 1);
}
function half(m, n) {
    total = 0;
    for (i = 1; i < m; i++)
        total += fact(m * n - 2) / fact(i * n - 1) / fact((m - i) * n - 1) * choc(i, n) * choc(m - i, n)
    return total;
}
function choc(m, n) {
    total = half(m, n) + half(n, m);
    if (!total) total = 1;
    return total;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.