কোনটি ভাল - ইমাকস বা ভিম? (গুগল লড়াই)


26

শুভেচ্ছা, আভিজাত্য কোড গল্ফার। আজ আপনি সর্বাধিক প্রাচীন এবং বিতর্কগুলির সমাধান করবেন - ইমাসস বা ভিম?

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

এখানে ইনপুট এবং আউটপুটগুলির কয়েকটি উদাহরণ দেওয়া হল:

ইনপুট: emacsএবং vim
আউটপুট: vim(সম্পূর্ণ মন্তব্যগুলিতে কোনও ফ্লেয়ারওয়ার তৈরি করছে না)

ইনপুট: googleএবং microsoft
আউটপুট:google

ইনপুট: code golf stack exchangeএবং code review stack exchange
আউটপুট: code golf stack exchange(হ্যাঁ!)

এবং এখানে কেবলমাত্র মজাদার জন্য (এবং আপনার সমাধানগুলি পরীক্ষা করার জন্য) কয়েকটি প্রান্তের কেস রয়েছে:

ইনপুট: About 1,000,000 resultsএবং About 100,000 results
আউটপুট:About 100,000 results

ইনপুট: This will autocotrectএবং Another testcase
আউটপুট: Another testcase(আপনি যদি স্ব-সংশোধন বিবেচনা না করেন তবে প্রথমটি জিতবে)

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

ইনপুট: Thissear#chter#mhasno#resultsএবং Another testcase
আউটপুট: Another testcase(শূন্য ফলাফলের জন্য কেবল একটি পরীক্ষা)

ইনপুট: "These exact wo#rds do#n't exi#st# on the Internet"এবং Another testcase
আউটপুট: Another testcase(পরীক্ষার ")

ইনপুট: Abo#ut 1,65#2,85#3,2#86 re#sultsএবং Another testcase
আউটপুট: Another testcase(এটি একটি কৌশলযুক্ত - উপরের অনুসন্ধান শব্দটির একটি ফলাফল রয়েছে)

ইনপুট: "Abo#ut 4#8,234,8#75,14#7 res#ults"এবং Another testcase
আউটপুট: Another testcase(কৌতূহলীও - কোনও ফলাফল নেই, সুতরাং এটি অনুসন্ধান শব্দটি প্রদর্শন করে)

"quoted""কোনও ফলাফল নেই, পরিবর্তে উদ্ধৃতিবিহীন ফলাফল দেখানো হচ্ছে" ফেরত অনুসন্ধানগুলির কর্নার-কেসটি হ্যান্ডেল করার দরকার নেই কারণ এটি খুব জটিল হবে। ফলাফলগুলি একই সংখ্যার সাথে আপনাকে ইনপুটগুলি পরিচালনা করতে হবে না।

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


পিএসএস ... আপনার গ্রহণযোগ্য উত্তরটি পরিবর্তন করা উচিত: ডি
বিড়াল

@ ট্যাক বিকল্পভাবে, আমি এটি পরিবর্তে এটি গল্ফ করতে পারি, যা আমি করেছি। ;)
ডুরকনব

আউটপুট / রিটার্ন মান কতটা নমনীয়? এটির একটি স্ট্রিং হতে হবে, বা এটি স্ট্রিং এবং ফলাফলগুলির সংখ্যা সহ একটি অ্যারে বা কেবল স্ট্রিং যুক্ত অ্যারে হতে পারে?
বিড়াল

3
এটি
ভিএম এর

উত্তর:


5

ফ্যাক্টর , 305 201 196 200 201 188 184 182 179 169 178 171 165 199 171 170 165 163 বাইট

জাভা হিসাবে প্রায় একটি ভাষা, রুবি ... এবং পাওয়ারশেলকে মারছে! : ডি

এখন ভাল। @ ফেড এস কে ধন্যবাদ জন্য 5 বন্ধ বাইট!

[ dup [ url-encode "google.com/search?nfpr=1&q="prepend http-get R/ s">About [\d,]+/ first-match " "split second 10 >base ] map zip [ last ] sort-with last first ]

অথবা 159 157 যদি আউটপুটটি এমন হতে পারে { "vim" 9782948234 }:

[ dup [ url-encode "google.com/search?nfpr=1&q="prepend http-get R/ s">About [\d,]+/ first-match " "split second 10 >base ] map zip [ last ] sort-with last ]

অন্যদিকে, আমরা unkillable হতে পারেন 199 196 193 বাইট :

[ dup [ url-encode "google.com/search?nfpr=1&q="prepend scrape-html nip dup "resultStats"find-by-id-between second text>> " "split second string>number ] map zip [ last ] sort-with last first ]

অযোগ্যযোগ্য কারণ এটি এইচটিএমএলকে বিশ্লেষণ করে, তাই রেজেনেক্স ব্যবহার করে উত্তরের চেয়ে আরও শক্তিশালী।


1
অজগর। ফ্যাক্টর জন্য ভাল। : পি
আর

@ ইস্টারলিআইর্ক এতদূর এতদূর
বিড়াল

@ ইস্টারলিআইর্ক আমি এটি করেছি!
বিড়াল

1
কারও কারও উচিত ফ্যাক্টর গল্ফিং উপভাষা, এত সাদা জায়গা, শব্দ এতক্ষণ ... ভাল, মানুষ!
ফেডারেশন এস।

1
unkillableপদ্ধতির জন্য আপনাকে ধন্যবাদ । এটি রিজেক্স ব্যবহারের চেয়ে পাওয়ারশেলের মধ্যে আসলে খাটো । (তবুও আপনার রেগেক্স উত্তরের চেয়ে 2 বাইট বেশি) আমি PowerShell succint যদিও, এটা কমান্ড নাম খুব কমই ছোট কল না হবে ( iwrজন্য একটি ডিফল্ট ওরফে হতে হবে invoke-webrequestএবং sortএর জন্য sort-object, অন্যথায় এটা যে অনেক লম্বা হতে চাই)
জোনাথন লিচ-Pepin

7

রুবি, 203 180 বাইট

->*s{s.map{|x|[(open("http://www.google.com/search?nord=1&q=#{URI.escape x}&nfpr=1").read.match(/s">(About )?([\d,]+) result/)||[?0])[-1].split(?,).join.to_i,x]}.max[1]}

-ropen-uriপতাকার জন্য +11 বাইট (প্লাস স্পেস)।

ইনপুট দুটি আর্গুমেন্ট হিসাবে নেওয়া হয়।

ইউআরএল ব্যাখ্যা:

  • ?nord=1: এইচটিটিপি থেকে এইচটিটিপিএসে স্বয়ংক্রিয় পুনঃনির্দেশ প্রতিরোধ করুন
  • &q=#{URI.escape x}: ক্যোয়ারী তাই "কাজ এড়িয়ে চলুন
  • &nfpr=1: স্বতঃসংশ্লিষ্ট নয়

পুরো mapপরিণত ['emacs','vim']হয় [[2150000, 'emacs'], [14900000, 'vim']]। (আপনি এটিকে .max[1]শেষের দিকে পরিবর্তন করে দেখতে পারেন .inspect)) তারপরে, maxনেওয়া হয়, যা সবচেয়ে বেশি ফলাফল সহকারে একটিকে দখল করবে এবং [1]অনুসন্ধান শব্দটি ব্যবহার করতে ব্যবহৃত হবে।


অনুসন্ধান করা Thissear#chter#mhasno#resultsএখন এই প্রশ্নটি গুগলে দেখাবে :) মজার বিষয় এটি 2 ফলাফল দেখাচ্ছে (আমার পক্ষে কমপক্ষে!) - google.com/… এনবি। "সম্পর্কিত * ফলাফল" এর সাথে মিলে যাওয়া যে কোনও
রেইগেক্স

এটি আমার পক্ষে কাজ করে না। ideone.com/UqEyBn
থিওডাক্টর

@TheDoc এটা Ideone উপর কাজ করে - প্রকৃত রুবি তে এটি চালানোর
Doorknob

আপনি ruby -ropen-uriফাইলের পরিবর্তে কমান্ডের সাহায্যে আরও কয়েকটি বাইট সংরক্ষণ করতে পারেন ।
শেলভাকু

"প্রায় 100,000,000 ফলাফল" এর মতো অনুসন্ধানগুলিতে কেন এই (এবং অন্যান্য রেজেক্স উত্তরগুলি) ব্রেক হবে না?
বিড়াল 23

7

সমস্যাটিতে উল্লিখিত পাঠ্য সম্পাদকগুলির মধ্যে, তাদের মধ্যে কেবল একটিই এটি নিজস্ব সমাধান করতে পারে ...

ইম্যাকস: 137 কীস্ট্রোক

<C-o><C-u><C-k>(if(<<C-y><C-y><M-<><C-n><F3><C-a>http://google.com/search?nfpr=1&q=<C-S-e><M-x>r-st<RET> <RET>+<RET><C-a><C-k><M-x>b-em<RET><C-y><RET><C-x><C-q><C-s><RET>ts"><RET><M-z><<C-x>0<C-y>0 r<C-a><C-M-s><RET>[0-9]<RET><C-b><M-z> <C-a><C-y><C-k><C-S-a><M-x><up><up><RET>,<RET><RET><F4><C-n><F4><C-e>)(next-line)())<C-x><C-e><C-n><C-a><C-k><C-x>h<DEL><C-y>

এটি বাফারের শুরুতে প্রথম কার্সারটি প্রথম লাইনে এবং দ্বিতীয় সন্ধানের শব্দটি দ্বিতীয় লাইনে থাকবে বলে প্রত্যাশা করে।

ইমাক্স সম্পর্কে অপরিচিতদের জন্য,

  • C-sমানে Ctrl-S
  • M-zমানে Alt-Z( Altসম্ভবত আপনার মেটা কী)
  • M-<মানে Alt-<বাAlt-Shift-,
  • C-S-e মানে Ctrl-Shift-e

ইমাকসের সাথে পরিচিতদের জন্য,

  • এর সাথে ইমাস শুরু করুন emacs -q। এটি আপনার .emacsফাইল লোড করে না , তাই কোনও অভিনব প্যাকেজগুলি এতে হস্তক্ষেপ করবে না।

ব্যাখ্যা

  1. এলিস্প স্ট্যাটমেন্ট শেলের শুরু লিখুন

    • <C-o><C-u><C-k> একটি নতুন লাইন দিয়ে তর্কগুলি সংরক্ষণ করে
    • (if(<<C-y><C-y> If স্টেটমেন্টের শুরুটি লিখুন এবং আর্গুমেন্টের 2 কপি রাখুন
    • <M-<><C-n> দ্বিতীয় লাইনে যান
  2. এইচটিটিপি ম্যাক্রো সংজ্ঞায়িত করুন। এটি যুক্তিটিকে গুগল অনুসন্ধান URL এ রূপান্তর করে এবং তারপরে অনুসন্ধানের ফলাফলের সংখ্যা দেয় returns

    • <F3> কীবোর্ড ম্যাক্রো সংজ্ঞা দেওয়া শুরু করুন
    • <C-a> অনুসন্ধান শব্দটির শুরুতে সরান।
    • http://google.com/search?nfpr=1&q= অনুসন্ধানের URL প্রস্তুত করুন
    • <C-S-e><M-x>r-st<RET> <RET>+<RET> সমস্ত জায়গাগুলি + চিহ্ন সহ প্রতিস্থাপন করুন।
    • <C-a><C-k><M-x>b-em<RET><C-y><RET>ইমাসগুলি কাঁচা এইচটিএমএল পুনরুদ্ধার করে (এর b-emজন্য সংক্ষিপ্ত browse-url-emacs)
    • <C-x><C-q> ফাইলটি লিখিতযোগ্য করুন (প্রয়োজনীয় যাতে ম্যাক্রো ত্রুটি না করে)
    • <C-s><RET>ts"><RET> ফলাফলের সংখ্যা ডিভিতে চলে যান (নিয়মিত অনুসন্ধান করা দরকার কারণ ইমাস ম্যাক্রোস কাজ করার জন্য অনুসন্ধানে নির্ভর করে)
    • <M-z><ভিন্নতার পাঠ্য কেটে ফেলুন (এ কারণেই প্রয়োজনীয় ছিল)
    • <C-x>0 আসল বাফারে ফিরে যান
    • <C-y>0 r;; ফলাফলগুলি লাইনে ফিরিয়ে দিন ('0 আর' কোনও ফল দেয় না)
    • <C-a><C-M-s><RET>[0-9]<RET><C-b><M-z> <C-a><C-y><C-k>;; স্ট্রিং থেকে নম্বরটি বের করুন।
    • <C-S-a><M-x><up><up><RET>,<RET><RET> সংখ্যার বাইরে কমা ছড়িয়ে দেয়
    • <F4> কীবোর্ড ম্যাক্রো শেষ করুন
  3. নীচে সরান এবং পরবর্তী লাইনে কীবোর্ড ম্যাক্রো চালিত করুন।

    • <C-n> পরের লাইনে যায়
    • <F4> একবার ম্যাক্রো পুনরাবৃত্তি।
  4. এলিস্প স্টেটমেন্ট শেষ করুন এবং এটি সম্পাদন করুন

    • <C-e>)(next-line)()) এলিসপ স্টেটমেন্ট শেষ করুন
    • <C-x><C-e> এলিসপ কমান্ড মূল্যায়ন করুন
    • <C-n><C-a><C-k> বিজয়ী যুক্তি হত্যা
    • <C-x>h<DEL> অন্য সব কিছু মুছুন
    • <C-y> বিজয়ী যুক্তি আটকান

রানিং ইট নিজেই

ভাগ্যক্রমে আপনাকে এই সমস্ত কীস্ট্রোক পুরোপুরি টাইপ করতে হবে না! মাংস এবং আলু সমস্ত ম্যাক্রোতে রয়েছে যা আপনি কেবল অনুলিপি এবং পেস্ট করতে পারেন। ম্যাক্রোটি অনুলিপি করে ইমাসে আটকানো যায়!

1. কীবোর্ড ম্যাক্রো সম্পাদনা করুন <C-x><C-k><C-e>
2. এটি পুরো বাফারে পেস্ট করুন (পেস্ট হওয়া উচিত <C-y>)

;; Keyboard Macro Editor.  Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: C-a http://google.com/search?nfpr= 1&q= S-C-e M-x r-st RET SPC RET + RET C-a C-k M-x b-em RET C-y RET C-x C-q C-s RET ts"> RET M-z < C-x 0 C-y 0 SPC r C-a M-C-s [0-9] 5*DEL RET [0-9] RET C-b M-z SPC C-a C-y C-k S-C-a M-x 2*<up> RET , 2*RET
Command: last-kbd-macro
Key: none
Macro:
C-a         ;; move-beginning-of-line
http://google.com/search?nfpr=  ;; self-insert-command * 30
1&q=            ;; self-insert-command * 4
S-C-e
M-x         ;; execute-extended-command
r-st            ;; self-insert-command * 4
RET         ;; newline
SPC         ;; self-insert-command
RET         ;; newline
+           ;; self-insert-command
RET         ;; newline
C-a         ;; move-beginning-of-line
C-k         ;; kill-line
M-x         ;; execute-extended-command
b-em            ;; self-insert-command * 4
RET         ;; newline
C-y         ;; yank
RET         ;; newline
C-x C-q         ;; read-only-mode
C-s         ;; isearch-forward
RET         ;; newline
ts">            ;; self-insert-command * 4
RET         ;; newline
M-z         ;; zap-to-char
<           ;; self-insert-command
C-x 0           ;; delete-window
C-y         ;; yank
0           ;; self-insert-command
SPC         ;; self-insert-command
r           ;; self-insert-command
C-a         ;; move-beginning-of-line
M-C-s           ;; isearch-forward-regexp
RET         ;; newline
[0-9]           ;; self-insert-command * 5
RET         ;; newline
C-b         ;; backward-char
M-z         ;; zap-to-char
SPC         ;; self-insert-command
C-a         ;; move-beginning-of-line
C-y         ;; yank
C-k         ;; kill-line
S-C-a
M-x         ;; execute-extended-command
2*<up>          ;; previous-line
RET         ;; newline
,           ;; self-insert-command
2*RET           ;; newline
  1. <C-c><C-c>ম্যাক্রো সংরক্ষণ করতে টাইপ করুন ।
  2. ব্যাখ্যার পদক্ষেপগুলি অনুসরণ করে, <F4>ম্যাক্রো চালানোর জন্য পদক্ষেপ 2 প্রতিস্থাপন করুন (বা চেষ্টা করার জন্য এটি কেবল নিজেরাই চালান)

আদেশ সহকারে

  1. এইচটিএমএল লোড হয়ে যাওয়া আপনি বাফারটিকে হত্যা না করে আপনি একই অনুসন্ধানে দুবার ম্যাক্রো চালাতে পারবেন না। বাফারদের মেরে ফেলুন
    • <C-x><k> search<TAB>
    • হত্যা করার জন্য এই তালিকার একটি বাফার বেছে নিন।
    • "অনুসন্ধান" দিয়ে শুরু করা সমস্ত বাফারের জন্য পুনরাবৃত্তি করুন
  2. আপনি যদি ম্যাক্রোকে খুব বেশি চালনা করেন তবে গুগল মনে করবে আপনি একটি রোবট এবং এক সময়ের জন্য অ্যাক্সেস ব্লক করে রাখবেন
    • যদি ম্যাক্রো যদি এর মতো কিছু দেয় <input type="submit" name="submit" value="Submit"...>, তবে সম্ভবত এটি ঘটেছিল।
    • আপনি এটি কাঁচা এইচটিএমএল দেখে নিশ্চিত করতে পারেন ( <C-x><C-b>এবং এটিতে অনুসন্ধানের শব্দটি সহ বাফারটি চয়ন করুন)।
    • আপনি যদি রোবট এবং ক্যাপচা সম্পর্কে স্টাফ দেখেন তবে গুগল আপনাকে ব্লক করে দিবে। এটা আমার দোষ না.

এটা সত্যিই দুর্দান্ত! Of the text editors mentioned in the problem, only one of them can solve this on its own...এটা কি সত্য? সত্যিই কি উইমস্ক্রিপ্টের জন্য এইচটিটিপি লাইব্রেরি নেই?
বিড়াল

ভ্যানিলা ভিমে কমপক্ষে কিছুই নেই, তবে সংক্ষিপ্ত গুগলিং কোনও ভিমস্ক্রিপ্ট এইচটিটিপি লাইব্রেরি পপ আপ করতে পারে নি। আমি কখনই কেন এমন লিখতে পারি তা কল্পনা করতে পারি না যখন আপনি কেবল ফলাফলগুলি পড়তে curlএবং একই প্রভাব পেতে পারেন। (তবে তারপরে আপনার উত্তরটি নির্দেশ করে যে এটি ভিম + কার্ল)।
ডোমিনিক এ।

3

জাভা, 828 800 783 744 739 687 বাইট

import java.net.*;import java.util.*;import java.util.regex.*;interface G{static Scanner s(String a)throws Exception{URL u=new URL("http://google.com/search?q="+a);HttpURLConnection c=(HttpURLConnection)u.openConnection();c.addRequestProperty("User-Agent","Mozilla/4.0");return new Scanner(c.getInputStream());}static void main(String[]r)throws Exception{String a,b;String c=s(a=r[0]).useDelimiter("\\Z").next(),d=s(b=r[1]).useDelimiter("\\Z").next();Matcher m=Pattern.compile("ut ([0-9,]+) res").matcher(c);m.find();long i=new Scanner(m.group(1)).nextLong();m=Pattern.compile("ut ([0-9,]+) res").matcher(d);m.find();long j=new Scanner(m.group(1)).nextLong();System.out.print(i>j?a:b);}}

পবিত্র বিড়াল। আমদানি একাই 79 বাইট ... সম্ভবত আপনার গ্রোভির চেষ্টা করা উচিত? : পি
বিড়াল

1
আপনাকে সত্যই আপনাকে ব্যবহারকারী-এজেন্ট স্ট্রিং সেট করতে হবে তা দ্বারা আমি আনন্দিত। পছন্দ করুন, যেন জাভা যথেষ্ট পরিমাণে ভারবস ছিল না
বিড়াল

কারণ গুগল 403 দেয় যদি আপনি না করেন।
সুপারজেডি ২২৪

2
argsস্টাডিনের পরিবর্তে কেন ইনপুট নিবেন না?
পাভেল

2

পাইথন 3, 227 226 208 213 226 220 221 206 202 200 198 বাইট

import re,requests as r,urllib.parse as u
lambda*t:sorted(zip(map(lambda a:int(re.findall("s\">About ([\d,]+)",r.get("http://google.com/search?q="+u.quote(a)).text)[0].replace(",","")),t),t))[-1][1]

ল্যাম্বডাকে কিছু বলার জন্য বরাদ্দ করুন।

অনুরোধের লাইব্রেরি ব্যবহার করে ।

Ungolfed:

import re, requests as r, urllib.parse as u
lambda*t:
  sorted(
  list(
      zip(map(
              lambda a: int(re.findall("About ([\d,]+)",
               r.get("http://google.com/search?q="+u.quote(a)).text)[0].replace(",","")),
              t
          ),
       t)
   )
)[-1][1]

অনুরোধগুলি ইনস্টল করার পরেও এটি আমার মেশিনে কাজ করে না:NameError: name 'quote' is not defined
শেলভাকু

@ শেলভাকু ওফস, আমি স্মার্ট, আমি পরম আমদানির পরে quoteফিরে যেতে ভুলে গেছি urllib.parse.quote
বিড়াল

তুমি কি এটা পরীক্ষা করেছ? দেখে মনে হচ্ছে google.co/search 404 দেয় যেখানে google.com/search কাজ করে
Shelvacu

@ শেলভাকু হ্যাঁ, আমি এটি পরীক্ষা করেছি, এটি রুবি উত্তর হিসাবে একই ফলাফল দেয় এবং প্রশ্নটি বলে।
বিড়াল

1

পাওয়ারশেল, 175 , 172 বাইট

($args|%{[pscustomobject]@{'a'=$_;'b'=[int]((iwr "google.com/search?nord=1&q=$_&nfpr=1").parsedhtml.getelementbyid('resultstats').innertext-split" ")[1]}}|sort -des b).a[0]

স্কোর দেখানোর পাশাপাশি নামটি আরও 2 টি বাইট কেটে দেবে।

এটি ফ্যাক্টর উত্তর (পার্সড এইচটিএমএল) unkillableহিসাবে একই বৈশিষ্ট্যটি ব্যবহার করে এবং পূর্ববর্তী রেজেক্স উত্তর থেকে বিচ্ছিন্ন করে।196 Byte


1

র‌্যাকেট, 360 337 বাইট

#lang racket(require net/url net/uri-codec)(λ(t)(cddr(sort(map list t(map(lambda(a)(string->number(string-replace(list-ref(string-split(car(regexp-match#px"s\">About [\\d,]+ res"(call/input-url(string->url(string-append"http://google.com/search?nfpr=1&q="(uri-encode a)))(curry get-pure-port)port->string)))" ")1)",""")))))#:key cdr <)))

0.o

তারা একে লস্ট ইন প্যারেন্টিসেসের সাগর বলে একটি কারণ রয়েছে।

Ungolfed:

#lang racket
(require net/url)
(require net/uri-codec)

(define (open-url term)
  (call/input-url
   (string->url (string-append "http://" term))
   (curry get-pure-port #:redirections 5)
   port->string))

(define (get-result term)
  (string->number
   (string-replace
    (list-ref
     (string-split
      (car (regexp-match #px"s\">About [\\d,]+ results" (open-url (string-append "google.com/search?nfpr=1&q=" (uri-encode term)))))
      " ")
     1)
    "," "")))

(define (zip a b) (map list a b))

(define (google-fite terms) (cddr (sort (zip terms (map get-result terms))) #:key cdr <))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.