চকোলেট নম্বর


17

চকোলেট বারের mদ্বারা প্রদত্ত n, m,nধনাত্মক, বারটি ভাঙ্গার বিভিন্ন উপায়গুলিকে mn1 দ্বারা 1 টুকরো করে আউটপুট করুন যেখানে প্রতিটি বিরতি গ্রিডলাইনে ঘটে।

অর্ডার গুরুত্বপূর্ণ। টুকরোগুলিও আলাদা আলাদা, সুতরাং 1 বাই 3 চকোলেট বারের উভয় প্রান্তে দুটি টুকরা সমতুল্য নয়।

উদাহরণস্বরূপ, 2 বাই 2 ব্লকের জন্য আমাদের কাছে রয়েছে:

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


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


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


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

সুতরাং 2 বাই 2 চকোলেট বারটি ভাঙ্গার 4 উপায় রয়েছে।

বিধি

  • ফাংশন ইনপুট, এসটিডিআইএন, কমান্ড লাইন বা অনুরূপ মাধ্যমে ইনপুট দুটি পূর্ণসংখ্যা হবে। একক সংখ্যার আউটপুট, চকোলেট বারটি ভাঙ্গার বিভিন্ন উপায় ways

  • যেহেতু সংখ্যাগুলি বেশ দ্রুত চলে যায়, তাই চিন্তা করবেন না যদি আউটপুটটি আপনার ভাষার পূর্ণসংখ্যার সীমা অতিক্রম করে - আপনার জমা দেওয়া ততক্ষণ বৈধ হবে যতক্ষণ না অ্যালগোরিদম তাত্ত্বিকভাবে সমস্ত সম্ভাব্য ইনপুটগুলির জন্য কাজ করে।

পরীক্ষার মামলা

আউটপুট ক্রমের উপর নির্ভর করে না 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

তত্ত্ব অনুসারে, কেউ সিএর একটি সংক্ষিপ্ত পুনরাবৃত্ত সংস্করণ লিখতে পারে 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

ES6, 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

@ ক্যামেরনআভিকের সূত্রের ভিত্তিতে। 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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.