ব্রেসগুলি ডান হাতের বন্ধনীতে রূপান্তর করুন (স্যাড ব্রেস)


26

ডান হাতের ব্রেস হ'ল কোড বন্ধনগুলির একটি স্টাইল যেখানে কোঁকড়ানো ধনুর্বন্ধনী এবং অর্ধিকলগুলি সমস্ত এএ ফাইলের ডানদিকে একক বিন্দুতে সংযুক্ত থাকে।

উদাহরণ চিত্র এখানে যান

সাধারণত, এটি বেশ কয়েকটি কারণে খারাপ অভ্যাস হিসাবে বিবেচিত হয়।

চ্যালেঞ্জ

যে কোনও পদ্ধতির মাধ্যমে একাধিক স্ট্রিং নিন এবং এর ব্রেস স্টাইলটি ডান হাতের ব্রেসে রূপান্তর করুন।

এই চ্যালেঞ্জের জন্য আপনার কেবল জাভা কোডে কাজ করা দরকার, তবে এটি তাত্ত্বিকভাবে এমন কোনও কোডে কাজ করা উচিত যা ব্রেস এবং সেমিকোলন ব্যবহার করে।

আপনার অবশ্যই {};তাদের মধ্যে যে পরিমাণ পরিমাণ শ্বেত স্পেস রয়েছে তা একত্রিত করে সমস্ত অক্ষর দখল করতে হবে । যেমন। }}, ; } }\n\t\t}এবং হোয়াইটস্পেস ব্যবহারের মাধ্যমে সেগুলি ফাইলের ডানদিকে সারি করুন।

উদাহরণ স্বরূপ:

a {
b;
{c

হয়ে উঠতে হবে

a {
b ;{
c

বা আরও বিমূর্তভাবে, সমস্ত {};অক্ষরের বাম থেকে ডানদিকে যে কোনও এবং সমস্ত শ্বেত স্পেসে চাপ দিন ।

লাইনের ইন্ডেন্টেশন অন্যথায় সংরক্ষণ করা উচিত। {};অক্ষরের চলাফেরার পরে কেবল সাদা স্পেসযুক্ত রেখাগুলি optionচ্ছিকভাবে সরানো যেতে পারে।

উদাহরণ স্বরূপ:

a{
    b{
        c;
    }
}
d;

হয় হয়ে যেতে পারে

a        {
    b    {
        c;}}
d        ;

অথবা

a        {
    b    {
        c;}}


d        ;

ডানদিকে ঠেলাঠেলি সমস্ত {};অক্ষরকে বিন্দুতে দীর্ঘতম রেখার চেয়ে সংক্ষিপ্ত বিন্দুতে বিন্যস্ত করা বোঝায় । তার পরে যে কোনও পরিমাণ স্থান গ্রহণযোগ্য।

সুতরাং নীচের সমস্ত গ্রহণযোগ্য:

a {
bc;

a  {
bc ;

a   {
bc  ;

ইত্যাদি ...

যে কোনও কোডের লাইনে {};অন্যান্য অ-শ্বেতস্পেস অক্ষরগুলির মধ্যে অক্ষর থাকতে পারে , এই মামলার হ্যান্ডলিংটি প্রয়োজনীয় নয়, যদিও আপনি ঝুঁকে থাকেন তবে আপনাকে সেগুলি যথাযথভাবে ছেড়ে দেওয়া উচিত। লাইনে কোনও {};অক্ষর নাও থাকতে পারে এবং এটি সঠিকভাবে পরিচালনা করা উচিত। যেমন নীচে দেখানো হয়েছে।

a {
b ;
c
d }

যেহেতু আমরা কোডটি পর্যালোচনা করতে চাই না আমরা যে ভয়াবহ কাজগুলি করছি তা দেখতে, আপনাকে আপনার কোডটি যতটা সম্ভব ছোট করা দরকার।

উদাহরণ / টেস্টকেস

জেনেরিক জাভা

public class HelloWorld{
       public static void main(String[] args){
           System.out.println("Hello, World!");
       }
}

হয়ে ...

public class HelloWorld                        {
    public static void main(String[] args)     {
        System.out.println("Hello, World!")    ;}}

ছবিটি নিজেই

public class Permuter{
    private static void permute(int n, char[] a){
        if (n == 0){
            System.out.println(String.valueOf(a));
        }else{
            for (int i=0; i<= n; i++){
                permute(n-1, a);
                swap(a, n % 2 == 0 ? i : 0, n);
            }
        }
    }
    private static void swap(char[] a, int i, int j){
        char saved = a[i];
        a[i] = a[j];
        a[j] = saved;
    }
}

হয়ে ...

public class Permuter                                {
    private static void permute(int n, char[] a)     {
        if (n == 0)                                  {
            System.out.println(String.valueOf(a))    ;}
        else                                         {
            for (int i=0; i<= n; i++)                {
                permute(n-1, a)                      ;
                swap(a, n % 2 == 0 ? i : 0, n)       ;}}}
    private static void swap(char[] a, int i, int j) {
        char saved = a[i]                            ;
        a[i] = a[j]                                  ;
        a[j] = saved                                 ;}}

নিখুঁত জেনেরিক পাইথন নয়

বিপরীতে

def Main():
    print("Hello, World!");

Main();

হয়ে ...

def Main():
    print("Hello, World!")    ;
Main()                        ;

নোট

নোট সম্পাদনা করুন

আমি চ্যালেঞ্জের বিশদটি উচ্চারণ করেছি, আশা করি নিয়ম সম্পর্কে কারও দৃষ্টিভঙ্গি আমি ভাঙ্গেনি, আমি আপনাকে আশ্বাস দিচ্ছি যে এটি অনিচ্ছাকৃত ছিল। এটি অনেক বেশি স্পষ্ট এবং স্ব স্ববিরোধী বিশেষ হওয়া উচিত।


একাধিক সেমিকোলন রেখার রায় কী? এর মতো কিছুint a=0;System.out.println(a);
মূল্য কালি

2
যদি আমাদের নমুনা চিত্রের মতো লুপগুলি পরিচালনা করার প্রয়োজন না হয় তবে এটি চ্যালেঞ্জের জন্য সেরা চিত্র হতে পারে না?
ডেনিস

1
মনে হচ্ছে প্রশ্নের মধ্যে চিত্রটি এই উদাহরণ থেকে এসেছে , যা এই ফলোআপটি অনুসরণ করেছে , যার আরও জটিল উদাহরণ রয়েছে
রায় তোয়াল

2
এটি আরও পরিষ্কার করা যেতে পারে যে আপনি ;{}পৃথক লাইনে থাকলে অক্ষরগুলি একত্রিত করতে চান (এটি উদাহরণ থেকে কেবল স্পষ্ট নয়, বিধিগুলি নয়, এবং বাস্তবে যদি কোনও লাইন \t}ইন্ডেন্টেশন সংরক্ষণের সমন্বয়ে গঠিত হয় তবে শেষ পর্যন্ত না এগিয়ে যাওয়া }হবে) পূর্ববর্তী লাইনের)
ক্রিস এইচ

2
ভাল ,শ্বর, দয়া করে আমাকে বলুন কেউ আসলে জাভা মত ভার্ভোজ ভাষার জন্য অনুশীলন করে এটি করেন না ._।
যাদু অক্টোপাস উরন

উত্তর:


5

ভি + বাশ ইউটিলিটিস, 64 62 61 60 62 বাইট

প্রাক্তন কমান্ডগুলি একসাথে রাখার জন্য 1 ডি বাইট @ ডিজেএমসিমেহেমকে ধন্যবাদ রক্ষা করেছে

:se ve=all|%!wc -L
y$uò/^ *<93>[{};]
xk$pòò/<84> {};][{};]«$
lDî^R0|p

^R<C-r>( 0x12) এর জন্য আক্ষরিক চরিত্র এবং <84>এটি হয় 0x84এবং <94>হয় 0x94

wc -Lবেশিরভাগ * নিক্স ভিত্তিক সিস্টেমে কাজ করে তবে ম্যাকোস নয়। ম্যাকোসের জন্য, আপনার gwc -L যদি ইতিমধ্যে না করে থাকে, তবে ব্রু ব্যবহার করে কোর্টিলগুলি পাওয়ার পরে আপনাকে করতে হবে ।

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

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

এটি অনলাইন চেষ্টা করুন! (জাভা আবার)

এটি সমস্ত ফাঁকা লাইন সংরক্ষণ করে এবং ট্যাবগুলি হ্যান্ডেল করে না, কেবলমাত্র স্থান।

Hexdump:

00000000: 3a73 6520 7665 3d61 6c6c 7c25 2177 6320  :se ve=all|%!wc 
00000010: 2d4c 0a79 2475 f22f 5e20 2a93 5b7b 7d3b  -L.y$u./^ *.[{};
00000020: 5d0a 786b 2470 f2f2 2f84 207b 7d3b 5d5b  ].xk$p../. {};][
00000030: 7b7d 3b5d ab24 0a6c 44ee 1230 7c70       {};].$.lD..0|p

ব্যাখ্যা

প্রথমে আমাদের বাফারের যে কোনও জায়গায় কার্সারটি স্থানান্তর করতে সক্ষম হওয়া দরকার, তাই আমরা ব্যবহার করি

:se ve=all|...

এবং আমরা এটি ব্যবহার করে অন্য একটি প্রাক্তন কমান্ড দিয়ে চেইন করি |

আমাদের ইনপুটটিতে দীর্ঘতম লাইনের দৈর্ঘ্য পেতে হবে। এটি শেল কমান্ড দিয়ে করা যেতে পারে wc -L

       ...|%!wc -L

এটি ফলাফলের সাথে বর্তমান বাফারটিকে (ইনপুটযুক্ত) ওভাররাইট করে wc -L। এটি এমন কিছুর আউটপুট দেয়:

            42

এবং কার্সারটি 4ভিতরে প্রবেশ করে 42। তারপরে আমরা ব্যবহার করে এই নম্বরটি অনুলিপি করবো y$: ইয়াঙ্ক পাঠ্যটি কার্সারের অবস্থান থেকে রেখার শেষ পর্যন্ত। এটি সুবিধামত এই নম্বরটি রেজিস্টারে সংরক্ষণ করে 0। তবে আরও পরে। ইনপুটটি এই সংখ্যার সাথে প্রতিস্থাপন করা হয়েছে, সুতরাং ফিরে যেতে আমরা uএনডো করি।

এখন বলুন ইনপুটটি কিছুটা এরকম দেখাচ্ছে:

public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello, World!");
    }
}

আমাদের ধনুর্বন্ধনী }বাফার এর শেষ থেকে printlnবিবৃতি ঠিক পরে সরানো প্রয়োজন ।

ò                  " recursively do this until a breaking error:
 /^ *<93>[{};]     "   this compressed regex becomes /^ *\zs[{};]
                   "   this finds any character from `{};` after leading spaces
                   "   the cursor then goes to the `{};`

x                  "   delete character
 k$                "   go to the end of the line above
   p               "   and paste
    ò

যদি রেজেক্সটি খুঁজে পাওয়া যায় না, একটি ব্রেকিং ত্রুটি ঘটে এবং এর ফলে ঘটে যাওয়া পুনরাবৃত্তিটি ভেঙে যায় ò

এখন এই প্রোগ্রামের মূল অংশটি আসবে, সমস্ত ধনুর্বন্ধনী এবং আধা-কলোন সরান এবং প্রশ্নে বর্ণিত হিসাবে সেগুলি সারিবদ্ধ করুন।

ò                  " starts recursion
 /<84> {};][{};]«$ "   compressed form of [^ {};][{};]\+$
                   "   finds a sequence of `{};`s at the end of the line with a non-`{};` char to preceding it
 l                 "   move the cursor 1 to the right (since we were on the non-`{};` char now)
  D                "   delete everything from this position to the end of line
                   "   the deleted text contains `{};`
   î               "   execute as normal commands:
    ^R0            "   contains what's in register `0`, ie the length of the longest line
       |           "   now go to the column specified by that number
        p          "   and paste the contents 
                   " implicit ending `ò`

আবার, যখন রিফেক্সটি বাফারে খুঁজে পাওয়া যায় নি তখন একটি বিরতিজনিত ত্রুটির দ্বারা এই পুনরাবৃত্তিটি বন্ধ হবে।

সম্পাদনাগুলি

  • Dপরিবর্তে ব্যবহৃত d$(আমি কেন জানি না যে আমি এটি প্রথম স্থানেই মিস করেছি)
  • সংকুচিত [^(রেজেক্সে) থেকে<84>
  • ব্যবহার করে \zs(এটিকে সংকুচিত করে <93>) এবং $ইন সরিয়ে ফিক্সড বাগ$xk$pò
  • অপ্রয়োজনীয় নিউলাইন সরানো হয়েছে
  • নতুন নিয়ম মেনে চলার জন্য রেজেক্স পরিবর্তন করা হয়েছে এবং 2 বাইট অর্জন করেছে

আপনি যদি আপনার প্রাক্তন কমান্ডগুলি একসাথে যোগ দেন তবে আপনি একটি বাইট সংরক্ষণ করতে পারেন:se ve=all|%!wc -L
ডিজেএমসিএমহেম

@ ডিজেএমসিএমহেম ধন্যবাদ, টিআইএল
ক্রিটিক্সী লিথোস

4

রুবি, 100 114 108 বাইট

কমান্ড লাইন আর্গুমেন্ট হিসাবে ফাইলের নাম পড়ে। যদি কোনও ফাইলের নাম সরবরাহ না করা হয় তবে এটি এসটিডিএন থেকে পড়বে। ট্যাবগুলি পরিচালনা করে না।

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

f=$<.read.gsub(/[\s;{}]*$/){$&.tr"
 ",''}
$><<f.gsub(/(.*?)([;{}]+)$/){$1.ljust(f.lines.map(&:size).max)+$2}



সাথে কাজ করে না এই
পাভেল

@ পাভেল আমাকে জানানোর জন্য ধন্যবাদ ফাইলটি পাইপ করার পরে আমি যে দুটি বিষয় দেখেছি catchতা হ'ল এ। একটি ইন্ডেন্টেড স্টেটমেন্ট, এবং বি একটি সেমিকোলন যা কোডের দীর্ঘতম লাইনে খুব বেশি ইন্টেন্টেড ছিল। আমি মনে করি এটি ঠিক করার জন্য আমার প্রয়োজনীয় জিনিসটি আমি জানি, আমাকে একটি সেকেন্ড দিন। (এছাড়াও, আমি ট্যাবগুলি পরিচালনা করতে পারে না এবং আপনার ফাইলে ট্যাব রয়েছে তা উল্লেখ করার জন্য আমি অনুমিতিটি আপডেট করেছি))
মূল্য কালি

এটিতে কি ট্যাব রয়েছে? আমি এটিতে সন্ধান এবং প্রতিস্থাপন করেছি এবং এটি 0 টি পরিবর্তন করেছে।
পাভেল

3

পার্ল , 90 বাইট

88 বাইট কোড + -p0পতাকা।

\@a[y///c]for/.*/g;s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme;1while s/ *
 *([{};]+)$/$1/m

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

সংক্ষিপ্ত ব্যাখ্যা:
\@a[y///c]for/.*/g; দীর্ঘতম রেখার দৈর্ঘ্য গণনা করে: প্রতিটি লাইনের y///cজন্য এটি অ্যারের সূচকে (যেমন রেখার আকার) এ উপাদানটি সংজ্ঞায়িত করে @a। শেষে, সর্বোচ্চ সূচী @a(অর্থাত্ আকার @a) দীর্ঘতম লাইনের আকার।
s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gmeস্থাপন {};লাইনের শেষে অক্ষর।
1while s/ *\n *([{};]+)$/$1/mখালি লাইনে ধনুর্বন্ধনী তৈরি করে উপরের লাইনে on

@ প্রিমোকে ধন্যবাদ যার কাছ থেকে আমি দীর্ঘতম লাইনের দৈর্ঘ্য গণনা করতে এখান থেকে আমার কোডের শুরুটি আংশিকভাবে "চুরি" করেছি ।


ধনুর্বন্ধনী অবশ্যই উপরের লাইনে ফিরে যেতে হবে যদি তাদের সামনে কেবল সাদা জায়গা থাকে, এই উত্তরটি তা করে না
ক্রিটিক্সী লিথোস

ক্রিটিক্সিলিথোস আসলেই, চ্যালেঞ্জটি পুনর্বারিত হওয়ার আগে (চ্যালেঞ্জগুলি এবং মন্তব্যগুলি উভয় থেকেই আমি যা বুঝতে পেরেছিলাম) তা দেখে মনে হয়েছিল ঠিক। যাইহোক, এখনই এটি ঠিক করা হয়েছে (আপনি খেয়াল না করলে ক্ষেত্রে আমার উত্তরটিতে ইতিমধ্যে কোড লেখা ছিল)।
দাদা

1

পাইথন 2: 228 বাইট

import re
g=re.search
def b(a):
    s,l="",a.split('\n')
    r=max([len(k)for k in l]) 
    for k in l:
        n,m=g('[;}{]',k),g('[\w]',k)
        if n:n=n.start()
        if m:m=m.start()
        if n>m and m!=None:s+="\n"+k[:n]+" "*(r-n)
        s+=k[n:]
    print s

ভয়াবহভাবে দীর্ঘ। ;{}পূর্ববর্তী লাইনের শেষের দিকে যেতে যখন একাকী প্রয়োজন বুঝতে পেরেছিলাম তখন আমার সম্ভবত স্ক্র্যাচ থেকে শুরু করা উচিত ছিল।
ক্রিস এইচ

1

স্ট্যাকড , 133 বাইট

'\s+([;{}])' '$1'repl lines{!n'[\s;{}]+$'match''join:n\'$'+del\,}"!tr:$size"!$MAXmap@k{e i:e[' 'k i#rpad]"!}map tr[' 'join]map'
'join

এটি অনলাইন চেষ্টা করুন! আমি এটিকে ভারী করে তুলতে পারি ... তবে whetvs। আমি আগামীকাল আবার এটি তাকান। কিছু সুন্দর টিপস:

  1. "!mapপরবর্তী টোকেনটি কোনও শব্দের সাথে শুরু হয় কিনা তার উপর নির্ভর করে প্রায়শই একটি বা দুটি সংরক্ষণ করে বাইট সংরক্ষণ করা যায়। তবে এটি কেবল তখনই ব্যবহার করা যেতে পারে যখন অ্যারের প্রতিটি পরমাণু ম্যাপ করতে চায়। এটি একটি গভীর মানচিত্রের অনুরূপ।
  2. উদ্ধৃত ক্রিয়াকলাপের পরে কোনও স্থানের প্রয়োজন হয় না, সুতরাং $MAXmapএটি সমান $MAX map, যা ঘুরে ফিরে সমান হয় [MAX] map। (প্রতিটি অ্যারে এর সর্বাধিক উপাদানটিতে মানচিত্র তৈরি করে))

1

জাভাস্ক্রিপ্ট (ইএস প্রস্তাব), 139 121 বাইট

f=
s=>s.replace(/^(.*?)\s*(([;{}]\s*)+)$/gm,(_,t,u)=>t.padEnd(Math.max(...s.split`
`.map(s=>s.length)))+u.replace(/\s/g,``))
<textarea rows=10 cols=40 oninput=o.textContent=f(this.value)></textarea><pre id=o>

এর জন্য ফায়ারফক্স 48 / ক্রোম 57 / অপেরা 44 / সাফারি 10 / এজ 15 প্রয়োজন padEnd। সম্পাদনা করুন: @ ভালুআইঙ্ককে 18 বাইট সংরক্ষণ করা হয়েছে


s.replace(r,`$1`)লাইনের দৈর্ঘ্য গণনা করার সময় আপনার কি সত্যিই চালানো দরকার ? যুক্তিসঙ্গত ডান-প্যাডিংয়ের যে কোনও পরিমাণই পর্যাপ্ত পরিমাণে হওয়া উচিত, তাই সেমিকোলন এবং বন্ধনীগুলির সাথে লাইনের দৈর্ঘ্য গণনা করা ভাল।
মান কালি

0

পিএইচপি, 201 194 185 172 167 বাইট

foreach($f=file(f)as$s)$x=max($x,strlen($a[]=rtrim($s,"{} ;
")));foreach($a as$i=>$c)echo str_pad($c,""<$c|!$i?$x:0),trim(substr($f[$i],strlen($c))),"
"[""==$a[$i+1]];

ফাইল এফ থেকে ইনপুট নেয়; একক বাইট লাইন ব্রেক এবং কোনও ট্যাব ধরে না; ফাঁকা লাইন সংরক্ষণ করে।

  • সাদা স্পেস সীমিত +1করার জন্য +2 বাইট: দ্বিতীয় str_padপ্যারামিটারে যুক্ত করুন।
  • -6 বাইট যদি এটা নিশ্চিত করা হয় যে কোন কোড লাইন একটি একক নিয়ে গঠিত 0:
    সরান ""<এবং প্রতিস্থাপন ""==সঙ্গে !

ভাঙ্গন

foreach($f=file(f)as$s)             // loop through file
    $x=max($x,strlen(                   // 3. set $x to maximum code length
        $a[]=                           // 2. append to array $a
            rtrim($s,"{} ;\n")          // 1. strip trailing whitespace and braces
    ));
foreach($a as$i=>$c)echo            // loop through $a
    str_pad($c,                         // 1. print code:
        !$i|""<$c                       // if first line or not empty
        ?$x                             // then padded to length $x
        :0                              // else unpadded (= print nothing)
    ),
    trim(substr($f[$i],strlen($c))),    // 2. print braces
    "\n"[""==$a[$i+1]]                  // 3. if next line has code, print newline
;

আপনি কি নিশ্চিত যে আপনাকে {}রেজিজেসের ধনুর্বন্ধনী থেকে বাঁচতে হবে ?
কৃতিমিক লিথোস

@ ক্রিটিক্সিলিথস সম্ভবত না; তবে আমি যাইহোক একটি সংক্ষিপ্ত পদ্ধতির সন্ধান পেয়েছি।
তিতাস

0

জাভা 8, 312 305 বাইট

s->{String t="([;{}]+)",z[],r="",a;s=s.replaceAll(t+"[\\s\\n]*","$1").replaceAll(t,"$1\n");int m=0,l;for(String q:s.split("\n"))m=m>(l=q.length())?m:l;for(String q:s.split("\n")){z=q.split("((?<="+t+")|(?="+t+"))",2);for(a="",l=0;l++<m-z[0].length();a+=" ");r+=z[0]+a+(z.length>1?z[1]:"")+"\n";}return r;}

ব্যাখ্যা:

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

s->{                                  // Method with String parameter and String return-type
  String t="([;{}]+)",                //  Temp regex-String we use multiple times
    z[],a,                            //  Temp String-array and temp String
    r="";                             //  Result-String
  s=s.replaceAll(t+"[\\s\\n]*","$1")  //  We replace all ;{} in the input with zero or more whitespaces/newlines to just ;{}
     .replaceAll(t,"$1\n");           //  and then add a single newline after each group of ;{}
  int m=0,l;                          //  Two temp integers
  for(String q:s.split("\n"))         //  Loop (1) over the lines
    m=m>(l=q.length())?m:l;           //   To determine the longest line
                                      //  End of loop (1)
  for(String q:s.split("\n")){        //  Loop (2) over the lines again
    z=q.split("((?<="+t+")|(?="+t+"))",2);
                                      //   Split on groups of ;{}, but keep them in the array
    for(a="",l=0;l++<m-z[0].length();a+=" "); 
                                      //   Amount of spaces we should add
    r+=z[0]+a+(z.length>1?z[1]:"")+"\n"; 
                                      //   Append this line to the result-String
  }                                   //  End of loop (2)
  return r;                           //  Return the result-String
}                                     // End of method

আরে, আমি এই উত্তরে মন্তব্য করছি, তবে এটি আপনার অনেকের ক্ষেত্রেই প্রযোজ্য। জাভাতে টাইপ করার জন্য বর্তমানে আমাদের ল্যাম্বডা পরামিতিগুলির প্রয়োজন
নাথান মেরিল

1
@ নাথানমেরিল ভয় পেয়েছিলেন যে রায় দেওয়ার দিনটি আসবে। জে কে, এখন থেকে এটিকে যুক্ত করবে এবং আমি আমার উত্তর সম্পাদনা করেছি, ধন্যবাদ। ;)
কেভিন ক্রুইজসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.