পূর্ণসংখ্যা হিসাবে পেরেন্টেসিস এবং বন্ধনী মূল্যায়ন করা


20

()[]এই পয়েন্টগুলিকে সন্তুষ্ট করে এমন চারটি অক্ষরের একটি স্ট্রিং নিয়ে এমন একটি প্রোগ্রাম লিখুন :

  • প্রতিটি বাম বন্ধনীর (সাথে একটি ডান বন্ধনী রয়েছে )
  • প্রতিটি বাম বন্ধনী [একটি মানানসই ডান বন্ধনী হয়েছে ]
  • জোড়া বন্ধনী এবং বন্ধনী মিলছে না ওভারল্যাপ হবে। উদাহরণস্বরূপ [(])অবৈধ কারণ ম্যাচিং বন্ধনী পুরোপুরি ম্যাচিং বন্ধনীগুলিতে নেই এবং তদ্বিপরীত।
  • প্রথম এবং শেষের অক্ষরগুলি হ'ল বন্ধনী বা বন্ধনীর সাথে একত্রে মিলছে। সুতরাং ([]([]))এবং [[]([])]বৈধ কিন্তু []([])না।

( ইনপুট ফর্ম্যাটটির একটি ব্যাকরণ<input> ::= [<input>*] | (<input>*) )

মিলে যাওয়া প্রথম বন্ধনী এবং বন্ধনীগুলির প্রতিটি জুটি একটি অ-নেতিবাচক পূর্ণসংখ্যার সাথে মূল্যায়ন করে:

  • ম্যাচিং বন্ধনীর ভিতরে জোড়ার মানগুলি সমস্ত সংক্ষিপ্ত করে । খালি ম্যাচের ()মান রয়েছে 0
  • ম্যাচিং বন্ধনীগুলির মধ্যে জোড়াগুলির মানগুলি সমস্ত গুণিত হয় । খালি ম্যাচের []মান রয়েছে 1

(একটি সংখ্যার যোগফল বা পণ্যটি একই সংখ্যা))

উদাহরণস্বরূপ, ([](())([][])[()][([[][]][][])([][])])এটি ভেঙে এবং মূল্যায়ন করা যেতে পারে 9:

([](())([][])[()][([[][]][][])([][])])    <input>
(1 (0 )(1 1 )[0 ][([1 1 ]1 1 )(1 1 )])    <handle empty matches>
(1 0   2     0   [(1     1 1 )2     ])    <next level of matches>
(1 0   2     0   [3           2     ])    <and the next>
(1 0   2     0   6                   )    <and the next>
9                                         <final value to output>

আরেকটি উদাহরণ:

[([][][][][])([][][])([][][])(((((([][]))))))]    <input>
[(1 1 1 1 1 )(1 1 1 )(1 1 1 )((((((1 1 ))))))]
[5           3       3       (((((2     )))))]
[5           3       3       ((((2       ))))]
[5           3       3       (((2         )))]
[5           3       3       ((2           ))]
[5           3       3       (2             )]
[5           3       3       2               ]
90                                                <output>

আপনার প্রোগ্রামটির পুরো ইনপুট স্ট্রিং দ্বারা প্রতিনিধিত্ব করে পূর্ণসংখ্যাটি মূল্যায়ন এবং মুদ্রণ করা দরকার। আপনি ইনপুটটি বৈধ বলে ধরে নিতে পারেন। বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

কোনও প্রোগ্রামের পরিবর্তে, আপনি কোনও ফাংশন লিখতে পারেন যা স্ট্রিংয়ের মধ্যে লাগে এবং পূর্ণসংখ্যা মুদ্রণ করে বা ফেরত দেয়।


স্পষ্টতার জন্য পাইথন জমা দেওয়ার পক্ষে জিজ্ঞাসা: কেবল প্রোগ্রাম, বা ফাংশন / রিটার্ন মান ঠিক আছে?
Sp3000

প্রশ্নটি সম্পাদনা করতে ভাল হতে পারে। পূর্ববর্তী একটি প্রশ্নে, আমাকে বলা হয়েছিল যে প্রশ্নগুলিতে "একটি প্রোগ্রাম লিখুন" বললে ফাংশনগুলি বৈধ নয়।
রেটো কোরাাদি

উত্তর:


11

সিজেম, 23

q"])(""1]:*0]:+["4/ers~

ডেনিসকে বিআইজি জমা দিয়ে! এটি অনলাইনে চেষ্টা করুন

ব্যাখ্যা:

প্রোগ্রামটি ইনপুটটিকে সিজেএম এক্সপ্রেশনে রূপান্তর করে তারপরে এটি মূল্যায়ন করে।
[…]হয়ে যায় […1]:*(সংযোজন 1 এবং গুণিত)
(…)হয়ে যায় […0]:+(0 যোগ করুন এবং যোগ করুন)

q              read input
"])("          characters we want to replace
"1]:*0]:+["    replacement strings, concatenated
4/             split into strings of length 4: ["1]:*" "0]:+" "["]
er             replace (transliterate) the 3 characters with the 3 strings
s              convert the result (mixed characters and strings) to string
~              evaluate

1
লিপ্যন্তর 4 টি বাইট সংরক্ষণ করে:q"])(""1]:*0]:+["4/ers~
ডেনিস

2
@ ডানিস! এটা পাগল, আপনি কি এটা করতে পারেন ??
অদিতসু

3
আপনি জিজ্ঞাসা করা হয় আমাকে ? : পি
ডেনিস

4
@ ডেনিস এই জাতীয় বৈশিষ্ট্যটির অস্তিত্ব সম্পর্কে সিজেএমের নির্মাতা কীভাবে জানতে পারবেন ??
অপটিমাইজার

8

কমন লিস্প - 98

(lambda(s)(eval(read-from-string(#1=ppcre:regex-replace-all"\\["(#1#"]"(#1#"\\("s"(+")")")"(*"))))
  1. (দ্বারা প্রতিস্থাপন(+
  2. [দ্বারা প্রতিস্থাপন(*
  3. ]দ্বারা প্রতিস্থাপন)
  4. স্ট্রিং থেকে পড়ুন
  5. Eval

এটির cl-ppcreবর্তমান লাইপ চিত্রটিতে লাইব্রেরি লোড করা দরকার requires

ব্যাখ্যা

ফাংশনগুলি *এবং +বৈকল্পিক এবং কোনও যুক্তি না দেওয়া হলে তাদের নিরপেক্ষ মানটি ফিরিয়ে দেয়। আপনার উদাহরণগুলির জন্য, মূল্যবান লিস্প ফর্মটি নিম্নলিখিতগুলি:

(+ (*) (+ (+)) (+ (*) (*)) (* (+)) (* (+ (* (*) (*)) (*) (*)) (+ (*) (*))))
=> 9

এবং

(* (+ (*) (*) (*) (*) (*)) (+ (*) (*) (*)) (+ (*) (*) (*))
   (+ (+ (+ (+ (+ (+ (*) (*))))))))
=> 90

রেজিক্স ছাড়াই - 183 বাইট

(lambda(s)(do(r(x(coerce s'list))c)((not x)(eval(read-from-string(coerce(reverse r)'string))))(setq c(pop x))(push(case c(#\[ (push #\* r)#\()(#\] #\))(#\( (push #\+ r) #\()(t c))r)))

সিমন, লিস্প - 16 বাইট (পরীক্ষামূলক)

+((<r*([<r)]<rRE

অন্যান্য ভাষাগুলি এত সংক্ষিপ্ত যে আমি সংক্ষিপ্ত স্ট্রিং ম্যানিপুলেশনের জন্য কমন লিস্পের উপর ভিত্তি করে আমার নিজস্ব গল্ফ ভাষা তৈরি করতে প্ররোচিত হই। বর্তমানে কোনও অনুমান নেই, এবং এভাল ফাংশনটি নিম্নলিখিতটি:

(defun cmon-lisp (expr &rest args)
  (apply
   (lambda (s)
     (let (p q)
       (loop for c across expr
             do (case c
                  (#\< (push (pop p) q))
                  (#\r
                   (let ((a1 (coerce q 'string)) (a2 (coerce p 'string)))
                     (setf p nil
                           q nil
                           s
                             (cl-ppcre:regex-replace-all
                              (cl-ppcre:quote-meta-chars a1) s a2))))
                  (#\R
                   (setf s
                           (if (string= s "")
                               nil
                               (read-from-string s))))
                  (#\E (setf s (eval s)))
                  (t (push c p))))
       s))
   args))

পরীক্ষা:

(cmon-lisp "+((<r*([<r)]<rRE" "([] [] ([] []))")
=> 4
  • একটি অন্তর্নিহিত যুক্তি বলা হয় sএবং দুটি স্ট্যাক, pএবং q
  • উত্স কোড অক্ষরের দিকে ঠেলাঠেলি করা হয় p
  • <: থেকে পপ pএবং ধাক্কা q
  • r: এ প্রতিস্থাপিত s(একটি স্ট্রিং হতে হবে) অক্ষর থেকে qএ charactes করতে p; ফলাফল সংরক্ষণ করা হয় s; pএবং qখালি করা হয়।
  • R: স্ট্রিং থেকে পড়া s, ভেরিয়েবলের স্টোরের ফলাফল s
  • E: eval ফর্ম s, স্টোর ফলাফল s

1
ফান্যি এখানে বন্ধনী দিয়ে কিছু করার জন্য কীভাবে লিসপ ব্যবহার করা হয়।
সিড কের্কোভ

@ সিডকের্কহোভ আপনি মন্তব্য করুন আমাকে একটি উপযুক্ত ক্লোজার উত্তর সম্পর্কে ভাবতে বাধ্য করুন। অনেক ধন্যবাদ!
coredump

6

পাইথ, 35 34 33 বাইট

L?*F+1yMbqb+YbsyMbyvsXzJ"])"+R\,J

প্রদর্শন.

1 জ্যাকেট @ জাকুবকে ধন্যবাদ

আমরা ইনপুট বিশ্লেষণ করে শুরু করি। ইনপুট ফর্ম্যাটটি পাইথনের কাছাকাছি, তবে বেশ নয়। আমাদের প্রতিটি প্রথম বন্ধনীযুক্ত বা বন্ধনীযুক্ত গোষ্ঠীর পরে কমা দরকার। একটি বন্ধনী গোষ্ঠীর শেষে কমাটি অপ্রয়োজনীয় তবে ক্ষতিহীন। এটি সম্পাদন করার জন্য, আমরা এই কোডটি ব্যবহার করি:

vsXzJ"])"+R\,J
  X               Translate
   z              in the input
     "])"         the characters "])"
    J             which we will save to J to
             J    J
         +R\,     with each character mapped to itself plus a ",".
 s                Combine the list to a string.
v                  Evaluate as a Python literal.

এটি ,স্ট্রিংয়ের শেষে একটি অতিরিক্ত ছেড়ে যাবে , যা পুরো বস্তুকে একটি টিপলে মুড়ে ফেলবে, তবে এটি ক্ষতিকারক নয়, কারণ টিপলটি সংক্ষিপ্ত হবে এবং তাই এর উপাদানটির সমান মান রয়েছে।

এখন যে স্ট্রিংটি পার্স করা হয়েছে, আমাদের অবশ্যই এর মানটি খুঁজে বের করতে হবে। এটি কোনও ব্যবহারকারীর সংজ্ঞায়িত ফাংশন ব্যবহার করে করা হয় y, যা পার্সড অবজেক্টকে ডাকা হয়। ফাংশন নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:

L?*F+1yMbqb+YbsyMb
L                     Define a function, y(b), which returns the following:
 ?       qb+Yb        We form a ternary whose condition is whether the input, b,
                      equals the inputplus the empty list, Y. This is true if
                      and only if b is a list.
      yMb             If so, we start by mapping y over every element of b.
  *F+1                We then take the product of these values. The +1 ensures
                      that the empty list will return 1.
                yMb   Otherwise, we start by mapping y over every element of b.
               s      Then, we sum the results.

@ জাকুব রাইট, অ্যানারি মিলনের কোনও প্রভাব নেই।
isaacg

3

ইমাস লিসপ, 94

ফর্ম্যাটটি দেখতে খুব সুন্দর লাগছে, তাই আমি ভেবেছিলাম একটি সাধারণ রূপান্তরটি কার্যকর হতে পারে:

(defun e()(format-replace-strings'(("("."(+")("["."(*")("]".")")))(eval(read(buffer-string))))

মধ্যবর্তী ফর্ম্যাটটি দেখতে এমন কিছু দেখায় (প্রশ্নের উদাহরণের জন্য):

(+(*)(+(+))(+(*)(*))(*(+))(*(+(*(*)(*))(*)(*))(+(*)(*))))

আমরা খালি যুক্তি তালিকার সাথে আমরা যা চাই তা যোগ এবং গুণটি ইতিমধ্যে তা দ্বারা আমরা সহায়তা করি।

আপনার আনন্দ খেলার জন্য ডিগল্ফড এবং ইন্টারেক্টিভ:

(defun paren_eval()
  (interactive "*")
  (format-replace-strings '(("(" . "(+")
                            ("[" . "(*")
                            ("]" . ")")))
  (eval (read (buffer-string)))
)

আমার আরও ঘনিষ্ঠভাবে পড়া উচিত ছিল - কমন লিস্প সমাধান ঠিক একই পদ্ধতির গ্রহণ করে!
টবি স্পাইট

1
আমাদের আরও ইমাস লিস্প উত্তর দরকার! বিটিডব্লু, আমি গণনা করি নি তবে আপনি ল্যাম্বডা ব্যবহার করে প্যারামিটার হিসাবে একটি স্ট্রিং নিয়ে এবং মুছে ফেলা interactive (বাফার-স্ট্রিংয়ের পরিবর্তে, পঠন-থেকে-স্ট্রিং ব্যবহার করে) আরও কিছুটা গল্ফ করতে পারেন।
কর্ডাম্প

2

রেটিনা , 111 বাইট

[\([](1+x)[]\)]
$1
\[]
1x
\(\)
x
(\[a*)1(?=1*x1*x)
$1a
a(?=a*x(1*)x)
$1
(\[1*x)1*x
$1
)`(\(1*)x(?=1*x)
$1
[^1]
<empty line>

আনারি আউটপুট দেয়।

প্রতিটি লাইনের নিজস্ব ফাইলে যাওয়া উচিত তবে আপনি -sপতাকা সহ একটি ফাইল হিসাবে কোড চালাতে পারেন । উদাহরণ:

> retina -s brackets <input_1
111111111

ব্যাখ্যা পরে আসে।


2

জাভা, 349 টি অক্ষর

একটি সহজ পুনরাবৃত্তি পদ্ধতির। প্রোগ্রামটি কল করার জন্য স্ট্রিংটি প্রথম আর্গুমেন্ট হিসাবে প্রত্যাশা করে।

import java.util.*;class K{int a=0,b;String c;public static void main(String[]a){K b=new K();b.c=a[0];System.out.print(b.a());}int a(){switch(c.charAt(a++)){case'(':b=0;for(int a:b())b+=a;break;case'[':b=1;for(int a:b())b*=a;}a++;return b;}List<Integer>b(){List d=new ArrayList();char c;while((c=this.c.charAt(a))!=']'&&c!=')')d.add(a());return d;}}

সম্প্রসারিত:

import java.util.*;

class K {
    int a =0, b;
    String c;
    public static void main(String[] a){
        K b = new K();
        b.c = a[0];
        System.out.print(b.a());
    }
    int a(){
        switch (c.charAt(a++)){
            case '(':
                b =0;
                for (int a : b())
                    b += a;
                break;
            case '[':
                b =1;
                for (int a : b())
                    b *= a;
        }
        a++;
        return b;
    }
    List<Integer> b(){
        List d = new ArrayList();
        char c;
        while ((c= this.c.charAt(a)) != ']' && c != ')')
            d.add(a());
        return d;
    }
}

2

পার্ল 5, 108

পুনর্লিখন এবং-ইভাল না করে দোভাষী হিসাবে সম্পন্ন হয়েছে। দুর্দান্ত প্রদর্শন নয়, তবে যাইহোক লিখতে মজা।

push@s,/[[(]/?[(ord$_&1)x2]:do{($x,$y,$z,$t)=(@{pop@s},@{pop@s});
[$t?$x*$z:$x+$z,$t]}for<>=~/./g;say$s[0][0]

আন golfed:

# For each character in the first line of stdin
for (<> =~ /./g) {
    if ($_ eq '[' or $_ eq '(') {
        # If it's an opening...
        # ord('[') = 91 is odd, ord('(') = 40 is even
        push @stack, [ ( ord($_) & 1) x 2 ];
        # so we will push [1, 1] on the stack for brackets and [0, 0] for parens.
        # one of these is used as the flag for which operator the context is, and
        # the other is used as the initial (identity) value.
    } else {
        # otherwise, assume it's a closing
        ($top_value, $top_oper) = @{ pop @stack };
        ($next_value, $next_oper) = @{ pop @stack };
        # merge the top value with the next-to-top value according to the
        # next-to-top operator. The top operator is no longer used.
        $new_value = $next_oper
            ? $top_value * $next_value
            : $top_value + $next_value
        push @stack, [ $new_value, $next_oper ];
    }
}

say $stack[0][0]; # print the value remaining on the stack.

2

পাইথন, 99

আমি বিভিন্ন পদ্ধতির চেষ্টা করেছিলাম তবে আমি যে সংক্ষিপ্ততমটি পেতে পারি তা মূলত কেবল একটি প্রতিস্থাপন এবং কার্যকর ছিল al ,পাইথনকে যেভাবে পার্স করতে পারে [1,2,]এবং চূড়ান্ত ট্রেলিং কমা কেবল পুরো বিষয়টিকে একটি টিপলে ফেলেছে তা জানতে পেরে আমি আনন্দিত অবাক হয়েছি all শুধুমাত্র অন্যান্য অ সহজবোধ্য অংশ হবে ord(c)%31%7বিভিন্ন অক্ষর আউট পৃথক করার (এটা মূল্যায়ন করতে 2, 3, 1, 0জন্য (, ), [, ]যথাক্রমে)

F=lambda s:eval(''.join(["],1),","reduce(int.__mul__,[","sum([","]),"][ord(c)%31%7]for c in s))[0]

1
এটি প্রোগ্রাম হিসাবে কাজ করে না, তাই না? প্রশ্নটি একটি প্রোগ্রামের জন্য জিজ্ঞাসা করে, তাই আমি মনে করি না যে কোনও ক্রিয়াকলাপ সরবরাহ করা প্রয়োজনীয়তার সাথে মিলিত হয়। প্রশ্নটিতে "প্রোগ্রাম" বলার সময় লোকেরা আমাকে শেষ বার কোনও ফাংশন জমা দেওয়ার সময় বলেছিল। :)
রেটো কোরাডি

1

জাভা, 301

TheNumberOne এর উত্তরের চেয়ে কিছুটা ভিন্ন পন্থা, যদিও খনিটিও প্রকৃতিতে পুনরাবৃত্ত। কমান্ড লাইন থেকে ইনপুট নেওয়া হয়। প্রয়োজন নেই এমন অক্ষরগুলি সরানোর সময় শূন্য পদ্ধতিটি কয়েকটি বাইট সংরক্ষণ করে।

enum E{I;String n;public static void main(String[]r){I.n=r[0];System.out.print(I.e());}int e(){int v=0;if(n.charAt(0)=='('){for(s("(");n.charAt(0)!=')';)v+=e();s(")");}else if(n.charAt(0)=='['){v=1;for(s("[");n.charAt(0)!=']';)v*=e();s("]");}return v;}void s(String c){n=n.substring(1+n.indexOf(c));}}

সম্প্রসারিত:

enum EvaluatingParenthesesAndBrackets{
    AsIntegers;
    String input;
    public static void main(String[]args){
        AsIntegers.input=args[0];
        System.out.print(AsIntegers.evaluate());
    }
    int evaluate(){
        int value=0;
        if(input.charAt(0)=='('){
            for(substringAfterChar("(");input.charAt(0)!=')';)
                value+=evaluate();
            substringAfterChar(")");
        }
        else if(input.charAt(0)=='['){
            value=1;
            for(substringAfterChar("[");input.charAt(0)!=']';)
                value*=evaluate();
            substringAfterChar("]");
        }
        return value;
    }
    void substringAfterChar(String character){
        input=input.substring(1+input.indexOf(character));
    }
}

1

পাইথন, 117 110 109 বাইট

def C(s,p=[0]):
 m=r=s[p[0]]=='[';p[0]+=1
 while s[p[0]]in'[(':t=C(s,p);r=r*t*m+(r+t)*(1-m)
 p[0]+=1;return r

একটি দিক যার সাথে আমি লড়াই করে যাচ্ছিলাম তা হ'ল ফাংশনটির মূলত দুটি রিটার্ন মান থাকে: পণ্য / যোগফল এবং স্ট্রিংয়ের নতুন অবস্থান। তবে আমার একটি ফাংশন দরকার যা কেবল ফলাফলটি দেয়, তাই একটি টুপলে ফেরা কাজ করে না। এই সংস্করণটি "রেফারেন্স" যুক্তি (একটি উপাদান সহ তালিকা) ব্যবহার করে, অবস্থানটি ফাংশন থেকে ফিরে যেতে।

আমার কাছে একটি সংক্ষিপ্ত সংস্করণ (103 বাইট) রয়েছে যা অবস্থানের জন্য একটি বৈশ্বিক পরিবর্তনশীল ব্যবহার করে। তবে এটি কেবল প্রথম কলটিতে কাজ করবে। এবং একটি ফাংশন যা কেবল একবারে কাজ করে তা কিছুটা মজাদার মনে হয়। এটি কোড গল্ফের জন্য গ্রহণযোগ্য হবে কিনা তা নিশ্চিত নয়।

অ্যালগরিদম সোজা পুনরাবৃত্তি। আমি এক্সপ্রেশনটির জন্য অনেকগুলি প্রকারের চেষ্টা করেছি যা পণ্য / যোগফলকে আপডেট করে। আমি কয়েকটি সংস্করণ নিয়ে এসেছি যা হুবহু একই দৈর্ঘ্যের ছিল, তবে এর মধ্যে কোনওটিই সংক্ষিপ্ত নয়।

আমি সাজানোর প্রত্যাশা করেছিলাম যে পদ্ধতির মূল্যায়ন হয়ে যায় এমন অভিব্যক্তিতে এটি সম্ভবত জিতবে। তবে যেমন তারা বলে: "পুনরাবৃত্তি করা মানুষের, divineশিক পুনরাবৃত্তি করা।"


কার্যাবলী এখন স্পষ্টভাবে অনুমতি :)
ক্যালভিন এর সখ

@ ক্যালভিনের শখগুলি এমন একটি নিয়ম প্রশ্ন পেয়েছে যা সম্পর্কে আমি সাধারণত ভাবছিলাম, তবে এটি এখানে কার্যকর হতে পারে: যদি কোনও সমাধান একটি ফাংশন হিসাবে প্রয়োগ করা হয়, তবে এটি কি বোঝায় যে ফাংশনটি একবারে একাধিকবার বলা যেতে পারে? উদাহরণস্বরূপ, যদি এটি একটি বিশ্বব্যাপী পরিবর্তনশীল ব্যবহার করে যা কেবলমাত্র প্রথম কলটিতে সঠিকভাবে আরম্ভ করা হয়, তা কি ভুল হবে?
রেটো কোরাাদি

@ রেট্রো আমি হ্যাঁ বলব, এটি ভুল। ফাংশনটির পুনরায় ব্যাখ্যা না করে যেকোন বার কাজ করা উচিত।
ক্যালভিনের শখ

1

ক্লোজার - 66 বাইট

লক্ষ্য করুন যে ([] (()) ([] []) [()] [([[] []] [] []) ([] [])])এটি একটি বৈধ ক্লোজার ফর্ম। তাই:

#(letfn[(g[x](apply(if(list? x)+ *)(map g x)))](g(read-string %)))
  • এটি একটি বেনাম ফাংশন একটি স্ট্রিং গ্রহণ করছে, এটি পড়ে এবং প্রদান করে g
  • স্থানীয় gফাংশন প্রয়োগ +বা *অনুরোধের ফলাফলg তার যুক্তিগুলির উপ-উপাদানগুলিতে ।
  • পুনরাবৃত্তির বেস কেসটি কিছুটা সূক্ষ্ম: xখালি ক্রমে যখন পৌঁছায় ; (map g x)ফিরে আসে nilএবং applyঅপারেশনের জন্য নিরপেক্ষ মান প্রদান করে।

0

জাভাস্ক্রিপ্ট (ES6), 116 বাইট

s=>+[...s].reduce((t,c)=>((x=c==']')||c==')'?t[1].push(t.shift().reduce((a,b)=>x?a*b:a+b,+x)):t.unshift([]),t),[[]])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.