হাডনিয়ান কোডগল্ফ


22

চ্যালেঞ্জটি হ'ল ম্যাট্রিক্সের হাফনিয়ানের জন্য কোডগল্ফ লিখুন । একটি- 2nদ্বারা- 2nপ্রতিসাম্য ম্যাট্রিক্সের হাফনিয়ান Aহিসাবে সংজ্ঞায়িত করা হয়:

এখানে চিত্র বর্ণনা লিখুন

এখানে S 2n থেকে পূর্ণসংখ্যার সব একাধিক বিন্যাসন সেট প্রতিনিধিত্ব করে 1করতে 2nহলো, [1, 2n]

উইকিপিডিয়া লিঙ্কটি সংলগ্ন ম্যাট্রিক্স সম্পর্কে কথা বলে তবে আপনার কোডটি কোনও বাস্তব মূল্যবান প্রতিসাম্য ইনপুট ম্যাট্রিক্সের জন্য কাজ করা উচিত।

হাফনিয়ার অ্যাপ্লিকেশনগুলিতে আগ্রহী তাদের জন্য, ম্যাথওভারফ্লো লিঙ্কটি আরও কিছু আলোচনা করে।

আপনার কোডটি চাইলে ইনপুট নিতে পারে এবং যে কোনও সংবেদনশীল ফর্ম্যাটে আউটপুট দিতে পারে তবে দয়া করে আপনার উত্তরটিতে কীভাবে আপনার কোডটিতে ইনপুট সরবরাহ করবেন সে সম্পর্কে পরিষ্কার নির্দেশাবলী সহ একটি সম্পূর্ণ কাজের উদাহরণ অন্তর্ভুক্ত করুন।

ইনপুট ম্যাট্রিক্স সর্বদা বর্গক্ষেত্র এবং 16 এর 16 সর্বাধিক হবে There খালি ম্যাট্রিক্স বা বিজোড় মাত্রার ম্যাট্রিক্স পরিচালনা করতে সক্ষম হওয়ার দরকার নেই।

রেফারেন্স বাস্তবায়ন

মিঃ এক্সকোডারের কাছ থেকে পাইথন কোডের কয়েকটি উদাহরণ এখানে।

from itertools import permutations
from math import factorial

def hafnian(matrix):
    my_sum = 0
    n = len(matrix) // 2
    for sigma in permutations(range(n*2)):
        prod = 1
        for j in range(n):
            prod *= matrix[sigma[2*j]][sigma[2*j+1]]
        my_sum += prod
    return my_sum / (factorial(n) * 2 ** n)


print(hafnian([[0, 4.5], [4.5, 0]]))
4.5
print(hafnian([[0, 4.7, 4.6, 4.5], [4.7, 0, 2.1, 0.4], [4.6, 2.1, 0, 1.2], [4.5, 0.4, 1.2, 0]])
16.93
print(hafnian([[1.3, 4.1, 1.2, 0.0, 0.9, 4.4], [4.1, 4.2, 2.7, 1.2, 0.4, 1.7], [1.2, 2.7, 4.9, 4.7, 4.0, 3.7], [0.0, 1.2, 4.7, 2.2, 3.3, 1.8], [0.9, 0.4, 4.0, 3.3, 0.5, 4.4], [4.4, 1.7, 3.7, 1.8, 4.4, 3.2]])
262.458

হাফনিয়ার গণনার ভিন্ন উপায় অন্তর্ভুক্ত করার জন্য উইকির পৃষ্ঠাটি এখন (মার্চ 2 2018) শ্রীভাতসার দ্বারা আপডেট করা হয়েছে। এই গল্ফটি দেখতে খুব আকর্ষণীয় হবে।


5
আমি মনে করি হাফানিয়ানের একটি অনানুষ্ঠানিক ব্যাখ্যা দিয়ে হজম করা সহজ হবে। এর মতো কিছু, এন ম্যাট্রিক্স এন্ট্রিগুলির সমস্ত সাবসেট নিন যেখানে তাদের এন সারির সূচকগুলি এবং এন কলাম সূচকগুলি ১.২n এর একটি পার্টিশন গঠন করে, প্রতিটিের পণ্য গ্রহণ করুন, সেগুলি যুক্ত করুন এবং যোগফলটি স্কেল করুন।
xnor

উত্তর:


9

আর , 150 142 127 119 বাইট

function(A,N=nrow(A),k=1:(N/2)*2)sum(apply(gtools::permutations(N,N),1,function(r)prod(A[cbind(r[k-1],r[k])])))/prod(k)

এটি অনলাইন চেষ্টা করুন!

আমি ম্যাট্রিক্সের সূচকটিতে এই উত্তরটি গল্ফ করে আবিষ্কার করেছি একই কৌশলটি ব্যবহার করে Pএবং @ ভ্লোfor -6 বাইটের জন্য লুপটি সম্পূর্ণরূপে অপসারণের জন্য একটি পদ্ধতির পরামর্শ দিয়েছিলেন !

একটি নতুন পরীক্ষার কেস তৈরি করতে, আপনি এটি করতে পারেন matrix(c(values,separated,by,commas,going,across,rows),nrow=2n,ncol=2n,byrow=T)

ব্যাখ্যা: (কোডটি একই; এটি লুপের applyপরিবর্তে একটি ব্যবহার করে forতবে যুক্তি অন্যথায় অভিন্ন)।

function(A){
N <- nrow(A)                   #N = 2*n
k <- 1:(N/2) * 2               #k = c(2,4,...,N) -- aka 2*j in the formula
P <- gtools::permutations(N,N) #all N-length permutations of 1:N
for(i in 1:nrow(P))
 F <- F + prod(A[cbind(P[i,k-1],P[i,k])]) # takes the product of all A_sigma(2j-1)sigma(2j) for fixed i and adds it to F (initialized to 0)
F / prod(k)                    #return value; prod(k) == n! * 2^n
}


প্রয়োগ 2 বাইট দ্বারা কম সস্তা, যা অন্য 4 টি লাইন একসাথে ক্র্যাম করে অতিরিক্ত 4 বাইট সংরক্ষণের অনুমতি দেয়। tio.run/##PY6xDoIwEIZ3nsLxzpxiS4ymkYEXYHIJDFDEEKBtSokS47PX4sDw5/… এটাও খুব আকর্ষণীয় যে বেসে কীভাবে একটি পরিসংখ্যানগত প্রোগ্রামিং ভাষার জন্য অনুমানের ফাংশন নেই
Vlo

@ খুব ভাল! আমরা এটিকে একটি বিবৃতিতে পেতে, ফাংশন যুক্তিগুলিতে স্থানান্তরিত করতে Nএবং অন্য দুটি বাইটগুলি kসরিয়ে {}এবং সংরক্ষণ করতে পারি।
জিউসেপ্পে

@ জিউসেপ্প ডারন ভুলে যেতে থাকেন যে আপনি ফাংশন আরগগুলিতে এগুলি সংজ্ঞায়িত করতে পারেন। এই ভেরিয়েবলগুলি এমবার করার জন্য কয়েক মিনিট সময় ব্যয় করুন ...
Vlo

8

পাইথ , 24 বাইট

sm*Fmc@@Qhkek2d{mScd2.pU

এখানে চেষ্টা করুন!


পুরানো সংস্করণ, 35 বাইট

*c1**FK/lQ2^2Ksm*Fm@@Q@dtyk@dykK.pU

এখানে চেষ্টা করুন!


3
বর্তমানে নেতৃত্ব দিচ্ছেন তবে আপনাকে জেলি উত্তর আসতে ভয় করতে হবে .... :)

এহ জেলি অবশ্যই আমার প্রায় 10 বাইট দ্বারা পরাজিত করবে।
পাইথ

05 এ বি 1 ই দেখতে পেল যে এটি পাইথকেও বেঁধে ফেলতে পারে (এটি বিশ্বাস করুন বা না করুন, শেষ পর্যন্ত ম্যাট্রিক্স চ্যালেঞ্জ কোথায় where a[b] প্রতিযোগিতা করার পক্ষে যথেষ্ট)।
ম্যাজিক অক্টোপাস আরন

@ ম্যাজিক অ্যাক্টপাস ইউরান আমার কাছে ইতিমধ্যে একটি 05AB1E সমাধান রয়েছে যা পাইথকে মারধর করে :-) এটি পোস্ট করা যাচ্ছে না (আপাতত, কমপক্ষে)
মিঃ এক্সকোডার

এটি কি xÍysè<¹sès·<ysè<èলামাওয়ের লাইনে কিছু আছে ? পিএস মাইন 40 বাইট এবং এতো ভাল কাজ করছে না হ্যাঁ, তাই এটি পোস্ট করতে নির্দ্বিধায়, বাড়িতে যাওয়ার আগে আমি শেষ করতে পারব না অনিশ্চিত।
ম্যাজিক অক্টোপাস উরান

6

স্ট্যাক্স , 23 22 19 17 বাইট

ü;Y╙◘▌Φq↓ê²╧▐å↑┌C

এটি চালান এবং অনলাইনে ডিবাগ করুন

একই প্রোগ্রামটির সংশ্লিষ্ট আসকি উপস্থাপনাটি এটি।

%r|TF2/{xsE@i^H/m:*+

প্রোগ্রামটি কিছু ভাসমান পয়েন্ট গোলাকার ত্রুটিতে ভুগছে। বিশেষত, এটি 33673.5000000011পরিবর্তে রিপোর্ট করে 33673.5। তবে আমি মনে করি যে এই প্রোগ্রামটি ভাসমান পয়েন্টের মানগুলিতে পরিচালিত হয়ে যথার্থতা গ্রহণযোগ্য। এটি খুব ধীর, এই মেশিনে উদাহরণস্বরূপ ইনপুটগুলির জন্য প্রায় এক মিনিট সময় নেয়।

%                             get size of matrix
 r|T                          get all permutations of [0 ... size-1]
    F                         for each, execute the rest of the program
     2/                       get consecutive pairs
       {        m             map each pair... 
        xsE@                      the matrix element at that location
            i^H/                  divided by 2*(i+1) where i=iteration index
                 :*           product of array
                   +          add to running total

1
খুব চিত্তাকর্ষক!

5

05AB1E , 21 বাইট

ā<œε2ô{}Ùεε`Isèsè;]PO

এটি অনলাইন চেষ্টা করুন!


পুরানো সংস্করণ, 32 বাইট

āœvIg;©Lε·UIyX<èèyXèè}P}Oθ®!/®o/

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে?

āœvIg;©Lε·UIyX<èèyXèè}P}Oθ®!/®o/ – Full program. Argument: A matrix M.
ā                                – The range [1 ... len(M)].
 œ                               – Permutations.
  v                    }         – Iterate over the above with a variable y.
   Ig;©                          – Push len(M) / 2 and also store it in register c.
       Lε            }           – For each integer in the range [1 ... ^]:
         ·U                      – Double it and store it in a variable X.
            yX<                  – Push the element of y at index X-1.
           I   è                 – And index with the result into M.
                yXè              – Push the element of y at index X.
                   è             – And index with the result into ^^.
                      P          – Take the product of the resulting list.
                        O        – Sum the result of the mapping.
                         θ       – And take the last element*.
                          ®!     – Take the factorial of the last item in register c.
                             ®o  – Raise 2 to the power of the last item in register c.
                            /  / – And divide the sum of the mapping accordingly.

* – Yeah, this is needed because I mess up the stack when pushing so many values in the loop and not popping correctly ;P

1
মজা করছে না èsè, হাহ ... হাহাহা ... আমি পেনি।
ম্যাজিক অক্টোপাস আরন

@ ম্যাজিক অ্যাক্টপাস ইউরন ফিক্সড ... আমি ভুলে গেছি 05 এএফ 1 ই 0-সূচিযুক্ত> _ <
মিঃ এক্সকোডার

3

জেলি , 19 বাইট

LŒ!s€2Ṣ€QḅL_LịFHP€S

এটি অনলাইন চেষ্টা করুন!

বিকল্প সংস্করণ, 15 বাইট, চ্যালেঞ্জ পোস্টডেটস

LŒ!s€2Ṣ€QœịHP€S

জেলি শেষ পর্যন্ত এন-ডাইমেনশনাল অ্যারে ইনডেক্সিং পেয়েছে।

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

LŒ!s€2Ṣ€QœiHP€S  Main link. Argument: M (matrix / 2D array)

L                Take the length, yielding 2n.
 Œ!              Generate all permutations of [1, ..., 2n].
   s€2           Split each permutation into pairs.
      Ṣ€         Sort the pair arrays.
        Q        Unique; deduplicate the array of pair arrays.
                 This avoids dividing by n! at the end.
           H     Halve; yield M, with all of its elements divided by 2.
                 This avoids dividing by 2**n at the end.
         œị      At-index (n-dimensional); take each pair of indices [i, j] and
                 yield M[i][j].
            P€   Take the product the results corresponding the same permutation.
              S  Take the sum of the products.

19-বাইট সংস্করণ একই ধরণের ফ্যাশনে কাজ করে; এটি কেবল œịনিজেকে বাস্তবায়ন করতে হবে।

...ḅL_LịFH...    Return value: Array of arrays of index pairs. Argument: M

    L            Length; yield 2n.
   ḅ             Convert each pair of indices [i, j] from base 2n to integer,
                 yielding ((2n)i + j).
     _L          Subtract 2n, yielding ((2n)(i - 1) + j).
                 This is necessary because indexing is 1-based in Jelly, so the
                 index pair [1, 1] must map to index 1.
        F        Yield M, flattened.
       ị         Take the indices to the left and get the element at these indices
                 from the array to the right.
         H       Halve; divide all retrieved elements by 2.

3

সি (জিসিসি) , 288 285 282 293 292 272 271 বাইট

  • দুটি পোস্ট ইনক্রিমেন্টের সাথে এবং লুপ প্লেসমেন্টের জন্য ফিডলিং করে তিনটি বাইট সংরক্ষণ করা হয়েছে।
  • , Anothter পোস্ট বৃদ্ধি পরিবর্তন ঘটানোর শাখা সামনে উভয় পরিবর্তনশীল initializations সরিয়ে তিন বাইট সংরক্ষণ করা হয়েছে - golfed if(...)...k=0...else...,j=0...করতেif(k=j=0,...)...else... - এবং একটি সূচক স্থানান্তর সঞ্চালিত।
  • সমর্থন করে এগারো বাইট প্রয়োজন floatম্যাট্রিক্স ।
  • মিঃ এক্সকোডারকে একটি বাইট ধন্যবাদ সংরক্ষণ করা ; golfing 2*j+++1করতেj-~j++
  • একটি অতিরিক্ত অতিরিক্ত অপসারণ করে বিশ বাইট সংরক্ষণ করা int পরিবর্তনশীল প্রকারের ঘোষণা এবং একটি ফ্যাক্টরিয়াল ফাংশন ব্যবহার না করে বরং ইতিমধ্যে বিদ্যমান লুপের জন্য বিদ্যমান ব্যবহার করে গুণগত মান গণনা করে ।
  • Golfing দ্বারা একটি বাইট সংরক্ষিত S=S/F/(1<<n);করার S/=F*(1<<n);
float S,p,F;j,i;s(A,n,P,l,o,k)float*A;int*P;{if(k=j=0,o-l)for(;k<l;s(A,n,P,l,o+1))P[o]=k++;else{for(p=-l;j<l;j++)for(i=0;i<l;)p+=P[j]==P[i++];if(!p){for(F=p=1,j=0;j<n;F*=j)p*=A[P[2*j]*2*n+P[j-~j++]];S+=p;}}}float h(A,n)float*A;{int P[j=2*n];S=0;s(A,n,P,j,0);S/=F*(1<<n);}

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

float S,p,F;                    // global float variables: total sum, temporary, factorial
j,i;                            // global integer variables: indices
s(A,n,P,l,o,k)float*A;int*P;{   // recursively look at every permutation in S_n
 if(k=j=0,o-l)                  // initialize k and j, check if o != l (possible  permutation not yet fully generated)
  for(;k<l;s(A,n,P,l,o+1))      // loop through possible values for current possible  permuation position
   P[o]=k++;                    // set possible  permutation, recursively call (golfed into the for loop)
 else{for(p=-l;j<l;j++)         // there exists a possible permutation fully generated
  for(i=0;i<l;)                 // test if the possible permutation is a bijection
   p+=P[j]==P[i++];             // check for unique elements
  if(!p){                       // indeed, it is a permutation
   for(F=p=1,j=0;j<n;F*=j)      // Hafnian product loop and calculate the factorial (over and over to save bytes)
    p*=A[P[2*j]*2*n+P[j-~j++]]; // Hafnian product
   S+=p;}}}                     // add to sum
float h(A,n)float*A;{           // Hafnian function
 int P[j=2*n];S=0;              // allocate permutation memory, initialize sum
 s(A,n,P,j,0);                  // calculate Hafnian sum
 S/=F*(1<<n);}                  // calculate Hafnian

এটি অনলাইন চেষ্টা করুন!

প্রোগ্রামের মূলটিতে নিম্নলিখিত ক্রিয়াকলাপ জেনারেটর যা লুপ করে S_n। সমস্ত হাফনিয়ার গণনা কেবল এটির উপরে নির্মিত - এবং আরও গল্ফ করা হয়।

j,i,p;Sn(A,l,o,k)int*A;{          // compute every element in S_n
 if(o-l)                          // o!=l, the permutation has not fully been generated
  for(k=0;k<l;k++)                // loop through the integers [0, n)
   A[o]=k,Sn(A,l,o+1);            // modify permutation, call recursively
 else{                            // possible permutation has been generated
  for(p=-l,j=0;j<l;j++)           // look at the entire possible permutation
   for(i=0;i<l;i++)p+=A[j]==A[i]; // check that all elements appear uniquely
  if(!p)                          // no duplicat elements, it is indeed a permutation
   for(printf("["),j=0;j<l        // print
   ||printf("]\n")*0;)            //  the
    printf("%d, ",A[j++]);}}      //   permutation
main(){int l=4,A[l];Sn(A,l,0);}   // all permutations in S_4

এটি অনলাইন চেষ্টা করুন!


1
একটি সি উত্তর পেয়ে দুর্দান্ত তবে আপনার পরামর্শ অনুসারে এটি বর্তমানে অনুপযুক্ত।

@ ল্যাম্বিক ফিক্সড এখন floatম্যাট্রিকগুলি সমর্থন করে ।
জোনাথন ফ্রেচ

2*j+++1এর সমান j+j+++1, যা সমান j-(-j++-1), তাই আমরা বাইট বাঁচানোর জন্য বিটওয়াইস j-~j++
পরিপূরককে

3

আর , 84 78 বাইট

h=function(m)"if"(n<-nrow(m),{for(j in 2:n)F=F+m[1,j]*h(m[v<--c(1,j),v]);F},1)

এটি অনলাইন চেষ্টা করুন!

সম্পাদনা: ভলো -6 বাইট জন্য ধন্যবাদ।

দেখে মনে হচ্ছে যে এখানে প্রত্যেকে অনুমতি ছাড়াই স্ট্যান্ডার্ড রেফারেন্স অ্যালগরিদম বাস্তবায়ন করছে, তবে আমি সম্পর্কিত চ্যালেঞ্জের মধ্যে অর্জিত সম্প্রদায়ের জ্ঞানের সুবিধা নেওয়ার চেষ্টা করেছি , যা মূলত গল্ফের পরিবর্তে দ্রুততম কোডের জন্য লক্ষ্যযুক্ত একই কাজ।

দেখা যাচ্ছে যে ম্যাট্রিকেস (আর এর মতো) hafnian(m) = sum(m[i,j] * hafnian(m[-rows and columns at i,j])কেটে ফেলার ক্ষেত্রে যে ভাষা ভাল, তার জন্য পুনরাবৃত্তিমূলক অ্যালগরিদম: কেবল দ্রুত নয়, তবে বেশ গোলাপীও। নিখরচায় কোডটি এখানে:

hafnian<-function(m)
{
    n=nrow(m)
    #Exits one step earlier than golfed version
    if(n == 2) return(m[1,2])
    h = 0
    for(j in 2:n) {
        if(m[1,j] == 0) next
        h = h + m[1,j] * hafnian(m[c(-1,-j),c(-1,-j)])
    }
    h
}

খুব সুন্দর উত্তর। - প্রথম বন্ধকের Ifসাথে কল করার জন্য -১ , আরম্ভিত Fভেরিয়েবল হিসাবে ব্যবহারের জন্য -4 , -র nমধ্যে নির্ধারণের জন্য -১ iftio.run/##XU/LCsIwELz7FcFTVtOQl1pf1/...
Vlo

ঝরঝরে! আমি এটিকে গতি চ্যালেঞ্জে পোস্ট করার কথা বলব, তবে সম্ভবত আরও কিছু অপ্টিমাইজেশন রয়েছে (থ্রেডিংয়ের মতো) যা তৈরি করা যেতে পারে, এবং আর যখন এটির গতির জন্য যথাযথভাবে জানা যায় না, তবে রেফারেন্সের জন্য এটি সেখানে রাখা ভাল ' ।
জিউসেপে

মানদণ্ডের উদ্দেশ্যে এটি করুন!
Vlo

আমি আসলে এটির গতির জন্য পরীক্ষা করার চেষ্টা করেছি, তবে ফলাফলগুলি দ্বারা নিরুৎসাহিত হয়ে পড়েছি। একই সঠিক অ্যালগরিদম ব্যবহার করে গতি চ্যালেঞ্জের মধ্যে ধীরতম পাইথন জমাটি টিআইওতে কয়েক সেকেন্ডের মধ্যে 24x24 ম্যাট্রিক্স কেটে যায়, তবে আর সময় বেরিয়ে যায়। আমার স্থানীয় মেশিনে এটি কোনও যুক্তিসঙ্গত সময়ে প্রতিক্রিয়া জানায় না, এমনকি প্যাকেজ 'মেমো' থেকে স্মৃতিচারণের সহায়তায়ও ...
কিরিল এল

2

জেলি , 29 বাইট

LHµ2*×!
LŒ!s€2;@€€Wị@/€€P€S÷Ç

এটি অনলাইন চেষ্টা করুন!

আমি মনে করি যে ;@€€Wị@/€€P€অংশটি সম্ভবত গল্ফ হতে পারে। একটি ব্যাখ্যা যাচাই করতে এবং যুক্ত করতে পরে ফিরে আসতে হবে।


গল্ফড হওয়ার আগে আমার সমাধানের মতো (ব্যতীত J) অভিন্ন । জেলির মন কি একরকম ভাবছে ? উত্স
ব্যবহারকারী 202729

আপনি যে অংশটি উল্লেখ করেছিলেন সেই অংশটি পুনরায় সংশোধন করে 2 এবং ঘটনামূলক দ্বারা এটি আরও কিছুটা কমাতে সক্ষম হয়েছি। LḶŒ!s€2ḅL‘ịFZµPS÷JḤ$P$ টিআইও
মাইল

@ ব্যবহারকারী 202729 হাহা দুর্দান্ত
ডাইলানান

@ মাইলস ওয়াও এটি অনেক সঞ্চয়। আমি আমার উত্তরে এটি সম্পাদনা করব তবে এটি অন্যরকম তাই আপনি চাইলে নিজের উত্তর জমা দিতে
নির্দ্বিধায়


2

এমএটিএল , 29 24 22 বাইট

Zy:Y@!"G@2eZ{)tn:E/pvs

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন: 1 , 2 , 3

কিভাবে এটা কাজ করে

Zy       % Size of (implicit) input: pushes [2*n 2*n], where the
         % input is a 2*n × 2*n matrix. 
:        % Range: gives row vector [1 2 ... 2*n]
Y@       % All permutation of that vector as rows of a matrix
!"       % For each permutation 
  G      %   Push input matrix
  @      %   Push current permutation
  2e     %   Reshape as a 2-row array
  Z{     %   Split rows into a cell array of size 2
  )      %   Reference indexing. With a cell array as index this
         %   applies element-wise indexing (similar to sub2ind).
         %   Gives a row vector with the n matrix entries selected
         %   by the current permutation
  t      %   Duplicate
  n:     %   Number of elements, range: this gives [1 2 ... n]
  E      %   Double, element-wise: gives [2 4 ... 2*n]
  /      %   Divide, element-wise
  p      %   Product
  vs     %   Vertically concatenate and sum
         % End (implicit). Display (implicit)



1

পার্ল 6, 86 বাইট

{my \n=$^m/2;^$m .permutations.map({[*] .map(->\a,\b{$m[a][b]})}).sum/(2**n*[*] 1..n)}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.