স্ট্রিং বিয়োগ


37

উদ্দেশ্য

বিপরীত স্ট্রিং কনটেন্টেশন একটি ফাংশন তৈরি করুন

ইনপুট

দুটি স্ট্রিং (বর্ণানুক্রমিক + স্পেস), যেখানে অন্যটির জন্য একটি বিয়োগ করা উচিত।

  • আপনি ধরে নিতে পারেন যে বিয়োগ করা স্ট্রিংটি অন্যটির চেয়ে বড় কখনও হবে না।

আউটপুট

বিয়োগফল থেকে ফলাফল

বিয়োগ

আপনার একটি স্ট্রিং অন্য স্ট্রিংয়ের শুরু বা শেষ থেকে অপসারণ করা উচিত। যদি স্ট্রিংটি শুরুতে এবং শেষের দিকে উপস্থিত থাকে তবে আপনি কেবলমাত্র একটিটিকে সরাতে পারবেন, কোনটি মুছে ফেলা হবে তা আপনার হাতে।
যদি স্ট্রিংটি শুরুতে বা শেষের দিকে না থাকে বা কোনও সঠিক মিল না হয় তবে এটি একটি অবৈধ বিয়োগফল এবং আপনার মূল স্ট্রিংটি আউটপুট করা উচিত।

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

বৈধ বিয়োগ

'abcde','ab' -> 'cde'
'abcde','cde' -> 'ab'
'abab','ab' -> 'ab'
'abcab','ab' -> 'abc' or 'cab'
'ababcde','ab' -> 'abcde'
'acdbcd','cd' -> 'acdb'
'abcde','abcde' -> ''
'abcde','' -> 'abcde'
'','' -> ''

অবৈধ বিয়োগ (মূল স্ট্রিং প্রদান করে)

'abcde','ae' -> 'abcde'
'abcde','aa' -> 'abcde'
'abcde','bcd' -> 'abcde'
'abcde','xab' -> 'abcde'
'abcde','yde' -> 'abcde'

অবৈধ ইনপুট (পরিচালনা করার দরকার নেই)

'','a' -> ''

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী!


4
প্রথম মামলার ফলাফল কেন হয় না cde? আপনি বৈধ বলতে কি বোঝাতে চান? আমাদের কি ইনপুটটির বৈধতা বিচার করতে হবে, বা আপনার অর্থ কি আমরা অবৈধ ইনপুটগুলি পাব না?
লিকি নুন

7
অভিশাপ, 'abcde','bcd' -> 'abcde'আমার সমাধান ভঙ্গ করার জন্য
জন ডিভোরাক

5
আমরা কি ধরে নিতে পারি যে স্ট্রিংগুলি রেজেক্স-নিরাপদ হবে (আলফানিউমেরিক + স্পেস)?
জন ডিভোরাক

2
আমি প্রস্তাব করব 'ababcde', 'ab''abcde'একটি পরীক্ষা কেস হিসাবে। কিছু নিষ্পাপ অ্যালগরিদম সেই একটিতে ব্যর্থ হয়।

2
@ রড আপনি কি "রিভার্স স্ট্রিং কনটেনটেশন" চ্যালেঞ্জটি পুনরায় ফিরিয়ে আনতে পারেন?
এমডি এক্সএফ

উত্তর:


19

জাভা 8, 46 45 44 40 বাইট

-1 বাইট ধন্যবাদ TheLethalCoder

-1 বাইট কারণ আমি বোবা (ধন্যবাদ রড!)

-4 বাইট কেভিন ক্রুইজসেনকে ধন্যবাদ

a->b->a.replaceFirst("^"+b+"|"+b+"$","")

এটি অনলাইন চেষ্টা করুন! (সমস্ত পরীক্ষার কেস অন্তর্ভুক্ত)

একটি জাভা উত্তর আসলে কয়েকটি অন্যান্য ব্যবহারিক ভাষায় মারধর করে। হাসি। (এবং এখন এটি জেএসকে পরাজিত করে!)


বাইট সংরক্ষণের জন্য a->b->
কার্চিং

@ লেথলকোডার ধন্যবাদ
Okx

আপনি কেন আপনার অনলাইন উদাহরণে অব্যবহৃত হ্যাশম্যাপে রেখে গেছেন?
মাইকেল

আপনি পরিবর্তন করতে পারেন Firstকরতে All-2 বাইট জন্য। কারণ ^এবং $এটি সর্বদা হয় হয় স্ট্রিংয়ের শেষে বা শুরুতে, তাই এমনকি replaceAllএটি কেবল একবারে প্রতিস্থাপন করে। এখানে চেষ্টা করুন। পিএস: আমি আপনার উত্তরে আগের বাইট-কাউন্টগুলি যুক্ত করেছি, যা পিপিসিজিতে এখানে কোড-গল্ফ সম্পাদনার পরে সাধারণত করা হয়।
কেভিন ক্রুইজসেন

@ কেভিন ক্রুইজসেন আমি ধর্মঘটের মাধ্যমে জানতাম, অনুমান আমি এখনই ভুলে গেছি। তবে, আমি যদি এর Allপরিবর্তে ব্যবহার করি তবে Firstএটি সত্য হয়ে যায়:"abab" + "ab" -> ""
Okx

9

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

s=>t=>s.replace(eval(`/^${t}|${t}$/`),'')

কারিটিং সিনট্যাক্সের মাধ্যমে ইনপুট নেয়, যেমন f("abab")("ab")


3
এখন, আমি কেন eval()আগে কখনও RegExes নির্মাণের জন্য ব্যবহার করার কথা ভাবিনি ?!
শেগি

9

ব্র্যাচেল্যাগ (এটি অনলাইনে চেষ্টা করুন!), 12 বাইট

~cpĊh.∧Ċtw|w

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

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

ব্যাখ্যা

~cpĊh.∧Ċtw|w
~c            Split {the input} into pieces
  p           and (possibly) rearrange those pieces
   Ċ          such that there are two pieces
    h         and the first
     .        matches the command line argument
      ∧       then
         w    print
        t     the last
       Ċ      piece.
          |   If all else fails,
           w  print {the input}.


6

জাভাস্ক্রিপ্ট (ES6), 76 70 45 41 বাইট

s=>t=>s.replace(RegExp(`^${t}|${t}$`),"")

এটি চেষ্টা করুন

f=
s=>t=>s.replace(RegExp(`^${t}|${t}$`),"")
o.innerText=f(i.value="abcde")(j.value="ab")
i.oninput=j.oninput=_=>o.innerText=f(i.value)(j.value)
<input id=i><input id=j><pre id=o>


2
আপনি প্রয়োজন হবে না new
প্রোগ্রামার

@ প্রোগ্রামার 500, আমি ইটিএইচটির সংস্করণটি দেখলে আমি এতে কাজ করা ছেড়ে দিয়েছি! : ডি এখন আপডেট হয়েছে। ধন্যবাদ।
শেগি



3

টিআই-বেসিক (টিআই -৪৪ প্লাস সিই), 63 বাইট

Prompt Str0,Str2
inString(Str0,Str2
If Ans
sub(Str0,1,Ans-1)+sub(Str0,Ans+length(Str2),length(Str0)-Ans+1-length(Str2→Str0
Str0

আমার একটি প্রশ্ন আছে, আপনি কেন Str1 কে ভেরিয়েবল হিসাবে ব্যবহার করেন নি?
জাকারি

@ জ্যাচারý আমি মনে করি সেসময় আমার কাছে এটিতে কিছু সঞ্চিত ছিল। সত্যি মনে নেই।
pizzapants184

Ansচতুর্থ লাইনে কী বোঝায় ?
জাকারি

@ জাকারি Ansসর্বশেষ মূল্যায়িত মানকে বোঝায়, সুতরাং এই ক্ষেত্রে এটি প্রত্যাবর্তিত মানকে বোঝায় inString(, যা Str2স্ট্রিংয়ের মধ্যে স্ট্রিংয়ের সূচক হয় Str0বা 0 টি যদি স্ট্রিংটি উপস্থিত না হয়। যদি একটি বিবৃতি আনসের মান পরিবর্তন করে না, সুতরাং চতুর্থ লাইনে সূচকটি এখনও রয়েছে Ans
pizzapants184

ওহ, আমি কীভাবে inStringকাজ করেছি তা ভুলে গেছি । দুর্দান্ত গল্ফ!
জাকারি

3

গণিত, 162 বাইট by

(c=Characters;a=c@#;b=c@#2;l=Length;t={};If[l@Intersection[a,b]==l@b,If[MemberQ[Partition[a,l@b,1],b],t=a;Table[t=DeleteCases[t,b[[i]],1,1],{i,l@b}]],t=a];""<>t)&

ইনপুট স্টাইল পরীক্ষা করুন ["abcde", "আব"]


1
চমৎকার সমাধান! #পরিবর্তে ব্যবহার করে আপনি একটি বাইট সংরক্ষণ করতে পারেন #1- এর অর্থ হুবহু একই। এছাড়াও, ব্যবহারের পরিবর্তে StringJoin@t, আপনি এটির সাথে একটি খালি স্ট্রিংটিতে যোগদান করে প্রতারণা করতে পারেন ""<>t, যা স্বয়ংক্রিয়ভাবে সমস্ত কিছু tএকসাথে যোগ দেয় । আপনি গাণিতিক গল্ফিং টিপস পৃষ্ঠাটি দেখেছেন ?
একটি গাছ নয়

বাইট সংরক্ষণের জন্য আরও কয়েকটি জিনিস আপনি করতে পারেন (আমি মনে করি না প্রথমদিকে আপনাকে সংজ্ঞা t={};দেওয়ার দরকার নেই ) তবে এটির ভিন্নরূপে ব্যবহার করা সহজতর হতে পারে - আপনি কি চেষ্টা করে দেখেছেন StringReplaceফাংশন আছে?
বৃক্ষ নয়

আপনি ইনপুট হিসাবে একটি স্ট্রিং অ্যারে নিতে অনুমতি দেওয়া হয়, যাতে আপনার সত্যিই প্রয়োজন হবে নাc=Characters;a=c@#;b=c@#2;
JungHwan Min

এছাড়াও, l@Intersection[a,b]হয় l[a∩b]
জংহওয়ান মিন

3

পাইথন, 69 68 64 57 51 45 বাইট

এটি রেজেজের সাথে সম্পূর্ণ ভিন্ন সমাধান হয়ে শেষ হয়েছিল।

-২ বাইটের জন্য মান কালি ধন্যবাদ !
এবং ফেলিপে Nardi বাতিস্তা বৃহদায়তন জন্য -6 বাইট!

import re
lambda s,c:re.sub(c+'$|^'+c,'',s,1)

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


-২ বাইটের জন্য:re.sub(c.join("^|$"),'',s,1)
কালি মান

1
-6 বাইটের জন্য:c+'$|^'+c
ফিলিপ নার্দি বাতিস্তা

3

বাশ ,66 61 49 বাইট

case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac

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

কম গল্ফড:

a=$1;
case $1 in 
    *$2)  c=${a%$2};;       
    $2*)  c=${a#$2};;
      *)  c=$1;;
esac;
echo $c

শুরু বা শেষ পরীক্ষা করতে অ্যারের উপসর্গ / প্রত্যয় (% / #) বিয়োগফল ব্যবহার করে


1
এর দুর্দান্ত ব্যবহার case, তবে প্রয়োজনের চেয়ে দীর্ঘ। 2nd এবং 3rd প্যাটার্ন একটি একক এক মধ্যে মিশে গিয়ে তৈরি করা যেতে পারে: *)c=${1#$2};;। তারপর মাত্র 2 শাখাগুলিকে খাটো হবে echoপ্রতিটি সরাসরি পরিবর্তে পরিবর্তনশীল ব্যবহার $c: case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac। অথবা আপনি এটি ব্যবহার করা চালিয়ে পারে, কিন্তু ছাড়া case: c=${1%$2};[[ $c = $1 ]]&&c=${1#$2};echo $c
manatwork

3

এপিএল (ডায়ালগ) , 31 30 বাইট

-1 ধন্যবাদ Zachary

এটি প্রকৃতপক্ষে বিপরীত ব্যবহার করে (অর্থাত্ বিপরীত) উপসংহার! বাম আর্গুমেন্ট হিসাবে মূল স্ট্রিং নেয় এবং ডান আর্গুমেন্ট হিসাবে কী বিয়োগ করতে হয়।

{0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}

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

Ungolfed:

{
    0::⍺{          if an error happens, apply the following function on the arguments
        0::⍺           if an error happens, return the left argument unmodified
        ,∘⍵⍣¯1⊢⍺       inverse-append right argument on left argument
        }⍵
    ⍵,⍣¯1⊢⍺       inverse-prepend the right argument on the left argument
}

লেজেন্ড:

{} বেনামে ফাংশন

 বর্তমান ফাংশন বাম আর্গুমেন্ট

 বর্তমান ফাংশন ডান যুক্তি

0::… যদি কোনও ত্রুটি ঘটে থাকে তবে এটি কার্যকর করুন, অন্যথায়…

⍣¯1⊢ বিপরীত

,∘⍵ CONCATENATE ডান দিকে

⍵, CONCATENATE বাম


আমি মনে করি আপনি এটি দিয়ে একটি বাইট সংরক্ষণ করতে পারেন {0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}
জাকারি

@ জ্যাচারý হ্যাঁ, ধন্যবাদ
অ্যাডম



2

হাস্কেল , 49 বাইট

f s a b|s==b=a|a/=b,h:t<-a=f(s++[h])t b|1<3=s
f""

এটি অনলাইন চেষ্টা করুন! ব্যবহার: f"" "abcdef" "ab"। বিকল্পভাবে, সংজ্ঞা (-)=f""এবং মত ব্যবহার করুন "abcdef" - "ab"

এই রেজেক্স-মুক্ত সমাধানটি তার সমস্ত প্রাক- এবং পোস্টফিক্সগুলিতে স্ট্রিংকে পুনরাবৃত্তভাবে বিভাজন করে এবং স্ট্রাক্টটি স্ট্রাক্ট করার জন্য সেগুলির কোনওটির সাথে মিলে যায় কিনা তা পরীক্ষা করে কাজ করে।



1

সি #, 88 বাইট

s=>r=>s.StartsWith(r)?s.Substring(r.Length):s.EndsWith(r)?s.Substring(0,s.IndexOf(r)):s;

সংকলন a Func<string, Func<string, string>>


1

রুবি (ল্যাম্বডা এক্সপ্রেশন), 29 বাইট

->a,b{a.sub /^#{b}|#{b}$/,""}

ইয়েজ রেগেক্স ইন্টারপোলেশন! রেজেক্স-সেফ সাবট্রেন্ডস দরকার, তবে চ্যালেঞ্জ অনুযায়ী ঠিক আছে।


1

Tcl , 37 বাইট

proc s {a b} {regsub "^$b|$b$" $a {}}

এটি অনলাইন চেষ্টা করুন! (এখন সমস্ত পরীক্ষা চলছে)

টিসিএল সোজা is proc s {a b}একটি ফাংশন সংজ্ঞায়িত করে sযা পরামিতি নেয় aএবং bregsubবিকল্পগুলি {}, যা খালি স্ট্রিং হয় bএটির শুরুতে বা শেষে হয় তার মানের জন্য a। রিটার্ন অন্তর্নিহিত।


1

সি, 96 বাইট

এটি সাধারণ জ্ঞান যে সিতে স্ট্রিং ম্যানিপুলেশন জটিল, আমার কাছে ঠিক আছে।

f(a,b,t,l)char**a,*b,*t;{t=*a;l=strlen(b);bcmp(t,b,l)?bcmp(t+=strlen(t)-l,b,l)||(*t=0):(*a+=l);}

আমি স্বল্প পাঠযোগ্য প্রোগ্রামগুলির মধ্যে একটি লিখেছি of দুটি ইনপুট লাগে (ক্রিয়াটি কেমন দেখায় তা সত্ত্বেও), char**ডিকনক্যাটনেটে স্ট্রিংকে নির্দেশ করে এবং এটি char*সরানোর জন্য স্ট্রিং। ইনপুট পয়েন্টারটি জায়গায় সম্পাদিত হয় এবং আউটপুট হয়ে যায় (যিনি যাই হোক মেমরি ফাঁস হওয়ার ক্ষেত্রে কেস হয়)।

ব্যবহারের উদাহরণ:

char *a = malloc(6);
strcpy(a, "abcde");
char *b = malloc(4);
strcpy(b, "abc");
f(&a,b);
printf("%s\n", a); // "de"

1

এডাব্লুকে , 21 32 বাইট

{sub("^"$2"|"$2"$",z,$1);$0=$1}1

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

আসল জমা কেবল প্রথম শুরুতে বা শেষের দিকে নয়, প্রথম স্ট্রিংয়ের মধ্যে নির্লজ্জভাবে পাঠ্য প্রতিস্থাপন করে।

{sub($2,z,$1);$0=$1}1

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

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


1

আর, 20 42 41 বাইট

pryr::f(sub(sprintf('^%s|%s$',b,b),'',a))

-১ বাইট ধন্যবাদ মিকিটিকে!

একটি বেনামী ফাংশন (যার ক্রমে যুক্তি রয়েছে b,a) প্রদান করে। স্ট্রিং পার্থক্য গণনা করে a-bsubএটি একটি সহজ প্রতিস্থাপন যা এই ক্ষেত্রে খালি স্ট্রিং সহ প্যাটার্নের প্রথম ঘটনাকে অদলবদল করে ''sprintfশুধুমাত্র স্ট্রিংয়ের শুরু এবং শেষের সাথে মিলে যাওয়ার জন্য রেজেক্স তৈরি করে । প্রয়োজন pryrপ্যাকেজটি ইনস্টল করতে হবে।

টিআইও লিঙ্কে, আরও function(a,b)চারটি বাইটের জন্য ফাংশনের জন্য আরও ভার্বোস সংজ্ঞা ব্যবহার করে।

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


1
'abcde','bcd' -> 'abcde'মামলার কী হবে ?
জোনাথন অ্যালান

" subএকটি সহজ প্রতিকল্পন যে কেবল প্রথম সংঘটন বিনিময়সমূহ হয় bমধ্যে a": নতুন swap দ্বিতীয় স্ট্রিং প্রথম স্ট্রিং মাঝখানে হলে হবে?
TheLethalCoder

প্রশ্নটা ভুল করে ফেললাম! উফ। এটি ধরার জন্য ধন্যবাদ!
জিউসেপ

আপনি 1 বাইট দিয়ে ফিরে পেতে পারেনsprintf('^%s|%s$',b,b)
মিকিটি

@ মিকিটি, ধন্যবাদ! স্থির করেছি।
জিউসেপ

1

কমন লিস্প, 121 বাইট

(lambda(x y)(cond((equal(#1=subseq x 0 #3=(length y))y)(#1#x #3#))((equal(#1#x #2=(-(length x)#3#))y)(#1#x 0 #2#))(t x)))

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

সাধারণ শব্দযুক্ত কমন লিস্প!

অবরুদ্ধ সংস্করণ:

(defun f(x y)
  (cond ((equal (subseq x 0 (length y)) y)               ; if x starts with y
         (subseq x (length y)))                          ; return rest of x
        ((equal (subseq x (- (length x) (length y))) y)  ; if x ends with x
         (subseq x 0 (- (length x) (length y))))         ; return first part of x
        (t x)))                                          ; else return x


1

পাওয়ারশেল, 34 40 বাইট

Invalid Subtractionপরীক্ষার কেস যুক্ত হলে +6 বাইট

param($s,$t)$s-replace"^$t(?!.*$t$)|$t$"

মন্তব্য:

রিজেক্সপ এক্সপ্রেশনটি ^$t|$t$প্রত্যাশার মতো কাজ করে না: এটি উভয় ম্যাচের পরিবর্তে দুটি ম্যাচ প্রতিস্থাপন করে (পতাকা gসর্বদা চালু থাকে)। সুতরাং, আমরা নেতিবাচক চেহারার গোষ্ঠীটি ব্যবহার করতে বাধ্য হচ্ছি।

পরীক্ষার স্ক্রিপ্ট:

$f = {
    param($s,$t)$s-replace"^$t(?!.*$t$)|$t$"
}

@(
    ,('abcde','ab', 'cde')
    ,('abcde','cde', 'ab')
    ,('abab','ab', 'ab')
    ,('abcab','ab', 'abc', 'cab')
    ,('ababcde','ab', 'abcde')
    ,('acdbcd','cd', 'acdb')
    ,('abcde','abcde', '')
    ,('abcde','', 'abcde')
    ,('','', '')

    ,('abcde','ae', 'abcde')
    ,('abcde','aa', 'abcde')
    ,('abcde','bcd', 'abcde')
    ,('abcde','xab', 'abcde')
    ,('abcde','yde', 'abcde')

    ,('','a', '')
) | % {
    $s,$t,$e = $_
    $r = &$f $s $t
    "$($r-in$e): $r"
}

আউটপুট:

True: cde
True: ab
True: ab
True: abc
True: abcde
True: acdb
True:
True: abcde
True:

0

কিউবিআইসি , 57 বাইট

হুই, এটি কিউবিআইসি / কিউব্যাসিকের মধ্যে গোলমাল ...

B=@ `+B┘x=instr(;,;)~x|?_t_sB,x-1|+_sB,x+_lC|,_lB|||\?B

B=@ `+B          Prepend a string to B$. Thisis a hack to avoid errors with 
                 removing substrings stating at index 1
┘                Line-break in QBasic output
       (;,;)     Read the string (B$) and the to-be-removed substring (C$)
x=instr          And make x to be the starting index of the first C$ in B$
~x|              IF X <> 0 (ie C$ is present in B$)
?                PRINT
 _t                trimmed version (drops the prepended space)
  _sB,x-1|+        of a substring from 1 to x (the start of C$) -1
  _sB,x+_lC|,_lB   and the rest of the string, starting after C$
                     _l takes the length of a string
  |||              End TRIM, end Substring, end Length
\?B              When missing C$, just print B$


0

আমি প্রাথমিকভাবে নির্দেশাবলী ভুল করে পড়েছি। ধন্যবাদ, আমার ভুল দেখানোর জন্য আরজান জোহানসেন !

পাওয়ারশেল , 46 51 বাইট

Function F($o,$a){([regex]"^$a").replace($o,'',1);}

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


এটি 'অ্যাবসিডি' 'বিসিডি' মামলায় ব্যর্থ।
janrjan জোহানসেন

আমি এই পরীক্ষার কেস থেকে প্রত্যাশিত ফলাফলগুলি দেখছি - টিআইও এখানে
জেফ ফ্রিম্যান

এটি ওপির একটি তালিকাভুক্ত পরীক্ষার কেস এবং ফলাফলটি হওয়া উচিত abcde- bcdস্ট্রিংয়ের উভয় প্রান্তে ঘটে না।
janrjan জোহানসেন

আপনি সঠিক. আমি নির্দেশাবলী ভুল লিখেছি। এটা ইশারা জন্য ধন্যবাদ!
জেফ ফ্রিম্যান

0

এক্সেল, 129 বাইট

=IFERROR(IF(FIND(B1,A1)=1,SUBSTITUTE(A1,B1,"",1),IF(FIND(B1,A1,LEN(A1)-LEN(B1))>LEN(A1)-LEN(B1),LEFT(A1,LEN(A1)-LEN(B1)),A1)),A1)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.