দক্ষ ত্রুটি-মুক্ত * এনকোডিং [বন্ধ]


20

লক্ষটি

যেমনটি সুপরিচিত রয়েছে, পৃথিবীর সমস্ত পরিচিত প্রাণীর জিনগত উপাদানগুলি ডিএনএতে এনকোড করা আছে; চারটি নিউক্লিওটাইডস অ্যাডেনিন, থাইমাইন, সাইটোসিন এবং গুয়ানিন ব্যবহার করে। (এটিজির সাধারণভাবে প্রতিনিধিত্ব)।

একটি পুরো জিনোম সংরক্ষণ করতে ইচ্ছুক একজন বায়োইনফর্ম্যাটিক অবশ্যই অবশ্যই এএসসিআইআই হিসাবে এটি সংরক্ষণ করতে চান না, কারণ প্রতিটি পছন্দ কেবল দুটি বিট দ্বারা প্রতিনিধিত্ব করা যেতে পারে!

স্পেসিফিকেশন

আপনার মিশনটি, আপনি যদি এটি গ্রহণ করা পছন্দ করেন তবে হ'ল ASCII প্রতিনিধিত্বকে বাইনারি উপস্থাপনায় এবং পিছনে রূপান্তর করতে প্রোগ্রাম, ফাংশন বা পদ্ধতিগুলির একটি জুড়ি লিখুন; Aহিসাবে প্রতিনিধিত্ব b00, Tহিসাবে b01, Gহিসাবে b10, এবং Cহিসাবে b11(এখন "ইউনিট")।

এছাড়াও, প্রতিটি বাইটের উচ্চ বিটগুলিতে বাইটে ইউনিটগুলির গণনা থাকা উচিত, যাতে প্রতিটি বাইট একটি ট্রিপলকে উপস্থাপন করে।

যেমন: "GATTACCA"হয়ে যায় b11 100001 b11 010011 b10 1100xx

বাইনারি ইনপুট থেকে ASCII এ, স্পেস, ট্যাব এবং নিউলাইনগুলি উপেক্ষা করা উচিত। এর সেটটিতে নেই [ \r\n\tATGC]এমন কোনও অক্ষর একটি ত্রুটি এবং তা উপেক্ষা করা বা প্রসেসিং সমাপ্ত হতে পারে।

বাইনারি থেকে এএসসিআইআই ইনপুটটিতে, দুটি উচ্চ বিট বাইটস b00উপেক্ষা করা হতে পারে।

ASCII আউটপুটটিতে সাদা স্থান থাকতে পারে; তবে বাইনারি ইনপুট প্লাস ওয়ান বাইট দীর্ঘ মাপের আকারের 4 গুণ বেশি কখনও না হওয়া উচিত এবং একটি নতুন লাইন দিয়ে শেষ হওয়া আবশ্যক।

বাইনারি আউটপুটটিতে b00xxxxxx"নিয়ন্ত্রণ" বাইটের একটি নির্বিচার সংখ্যক থাকতে পারে ; তবে এএসসিআইআই ইনপুটের চেয়ে বেশি কখনই লম্বা হওয়া উচিত নয়।

প্রতিটি রূপান্তর প্রোগ্রাম অবশ্যই স্বেচ্ছাসেবী দৈর্ঘ্যের ইনপুট সমর্থন করা উচিত; এবং আনুমানিক লিনিয়ার সময়ে এনকোডিং বা ডিকোডিং সম্পূর্ণ করা উচিত।

মোচড়

দুর্ভাগ্যক্রমে আপনি বায়োইনফর্ম্যাটিকবিদ যার জন্য আপনি এই কাজটি সম্পাদন করছেন তার পক্ষে তিনি ব্যক্তিগতভাবে সম্ভবত ক্ষুদ্র স্তরে কোনওভাবে আপনাকে অন্যায় করেছেন।

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

কী গুরুত্বপূর্ণ তা হল আপনার পেব্যাকের সুযোগ রয়েছে!

বিস্তারিত

প্রতিটি রূপান্তর একটি ছোট ত্রুটি হার প্রবর্তন করা উচিত; প্রতি দশ হাজারে এক ত্রুটির ক্রমক্রমে দশ মিলিয়ন ইউনিট প্রক্রিয়াজাত হয়।

ত্রুটি নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:

  • সদৃশ ত্রুটি: "GAT TAC CA"হয়ে যায়"GAT TAA CCA"
  • মুছে ফেলার ত্রুটি: "GAT TAC CA"হয়ে যায়"GAT TAC A"
  • অনুবাদ ত্রুটি: "GAT TAC CA"হয়ে যায়"GTA TAC CA"
  • ট্রিপলেট নকল: "GAT TAC CA"হয়ে যায়"GAT TAC TAC CA"
  • ট্রিপলেট পিছলে: "GAT TAC CA"হয়ে যায়"TAC GAT CA"
  • ট্রিপলেট বিপরীতগুলি: "GAT TAC CA"হয়ে যায়"GAT CAT CA"

অবশ্যই ত্রুটিগুলি কোড থেকে তাত্ক্ষণিকভাবে সুস্পষ্ট হওয়া উচিত নয়; এবং ইনপুট দৈর্ঘ্য নির্বিশেষে; রূপান্তরটি কমপক্ষে একটি ত্রুটি প্রবর্তন করা উচিত।

অভিন্ন ইনপুট সহ দুটি রান অগত্যা অভিন্ন আউটপুট উত্পাদন করা উচিত নয় ।

শিল্প খাত

দুষ্কর জৈববৈজ্ঞানিক একটি মধ্যপন্থী দক্ষ কোডার; এবং এর মতো, কয়েকটি নির্মাণ স্বয়ংক্রিয়ভাবে আবিষ্কার করা হবে এবং এটি নিষিদ্ধের মতো:

  • তিনি স্বয়ংক্রিয়ভাবে সিস্টেমে র্যান্ডম সংখ্যার জেনারেটর যেমন র‌্যান্ড (), র্যান্ডম (), বা / ডিভ / ইউরানডম বা / ডিভ / র্যান্ডম (বা ভাষার সমতুল্য যেকোন কিছু হতে পারে) থেকে পাঠাবেন।
  • তিনি কোনও অতিরিক্ত অতিরিক্ত ভেরিয়েবল, কাউন্টার বা লুপগুলিও লক্ষ্য করবেন।

স্কোরিং

এনকোডার এবং ডিকোডার পৃথকভাবে স্কোর করা হবে।

প্রতিটি এলোমেলোভাবে উত্পাদিত 100 টি ইনপুট ফাইলের সেটগুলির বিপরীতে 3 বার চালানো হবে, প্রতিটি ফাইল 3 মিলিয়ন ইউনিটের ক্রম অনুসারে একটি আকারযুক্ত।

এনকোডার পরীক্ষার ক্ষেত্রে ডেটা প্রায় তৈরি করা হবে:

for (l = 1 => bigNum)
  for (t = 1 => 20)
    random_pick(3,ATGC)
    t == 20 ? newline : space

ডিকোডার পরীক্ষার ক্ষেত্রে ডেটা প্রায় তৈরি করা হবে:

for (u = 1 => bigNum)
  for (t = 1 => 20)
    random_byte() | 0b11000000
   0x00

এনকোডার

  • প্রকৃত দৈর্ঘ্যের প্রত্যাশিত সর্বনিম্ন দৈর্ঘ্য থেকে অনুপস্থিত প্রতিটি বাইট -1 পয়েন্ট, সর্বোচ্চ -1000 পর্যন্ত স্কোর করবে। (প্রত্যাশিত সর্বনিম্ন দৈর্ঘ্য ceil(count(ATGC) / 3)))

ডিকোডার

  • আসল দৈর্ঘ্যের প্রত্যাশিত সর্বাধিক দৈর্ঘ্যের উপরের প্রতিটি বাইট সর্বোচ্চ -1000 পর্যন্ত -1 পয়েন্ট করবে। (প্রত্যাশিত সর্বোচ্চ দৈর্ঘ্য size(input) * 4 + 1))

উভয়

  • উত্পাদিত হতে পারে এমন প্রতিটি ধরণের ত্রুটি 100 পয়েন্ট স্কোর করবে; প্রতিটি জন্য মোট 600 পয়েন্ট সম্ভাব্য, 1200 মোট।
  • প্রতিটি পরীক্ষার ক্ষেত্রে যার জন্য এনকোডারটি তার নিজস্ব গড়ের তুলনায় 30% এর বেশি বা কম ত্রুটি তৈরি করে -5 পয়েন্ট দ্বারা দন্ডিত হবে।
  • প্রতিটি পরীক্ষার ক্ষেত্রে যার জন্য এনকোডার তার নিজস্ব গড়ের চেয়ে 15% কম বা তারও কম ত্রুটি উত্পন্ন করে তাকে 5 পয়েন্ট দেওয়া হবে।
  • প্রতিটি পরীক্ষার ক্ষেত্রে যেখানে তিনটি রান একই ধরণের আউটপুট তৈরি করে -10 পয়েন্ট দ্বারা দন্ডিত হবে।

হার্ড প্রয়োজনীয়তা

একটি এন্ট্রি অযোগ্য ঘোষণা করা হবে যদি:

  • এক ট্রিপলেটের চেয়ে বেশি কোনও বৈধ ইনপুট জন্য এটি এমনকি একটি ত্রুটি তৈরি করতে ব্যর্থ।
  • এর পারফরম্যান্সটি এমন যে এটি প্রায় এক ঘন্টার মধ্যে পরীক্ষা গন্টলেটটি শেষ করতে পারে না।
  • এটি প্রতি দশ হাজার ইউনিটে গড়ে একাধিক ত্রুটি তৈরি করে।
  • এটি গড়ে প্রতি মিলিয়ন ইউনিটে একেরও কম ত্রুটি উত্পন্ন করে।

ইন্টারফেস

প্রবেশকারীদের স্ট্যান্ডার্ড ইনপুটটিতে ইনপুট এবং মান আউটপুট গ্রহণ করা উচিত।

যদি এন্ট্রি দ্বৈত ফাংশন সহ একটি প্রোগ্রাম হয়; সুইচগুলি -eএবং -dযথাক্রমে এনকোডিং এবং ডিকোডিংয়ের জন্য প্রোগ্রামটি সেট করা উচিত।

অনুরোধের উদাহরণ:

$ encoder <infile.txt >outfile.bin
$ decoder <infile.bin >outfile.txt
$ recoder -e <infile.txt >outfile.bin

বিজয়ী

বিজয়ী সর্বোচ্চ স্কোর সহ এন্ট্রি হয়; তাত্ত্বিক সর্বোচ্চ ত্রুটি প্রকারের জন্য 1200 এবং ত্রুটি জেনারেশনের হারের স্থায়িত্বের জন্য 3000 পয়েন্ট being

একটি ড্র হওয়ার সম্ভাব্য ঘটনাতে; বিজয়ী ভোট গণনা দ্বারা নির্ধারিত হবে।

অতিরিক্ত নোট

পরীক্ষা গন্টলেট চালানোর উদ্দেশ্যে, প্রতিটি প্রবেশের মধ্যে রান বা সংকলনের নির্দেশাবলী অন্তর্ভুক্ত করা উচিত।

সমস্ত এন্ট্রি অবশ্যই এক্স ছাড়াই লিনাক্স মেশিনে চালানো উচিত should


4
ট্যাগ পরিবর্তন করা হয়েছে। কোটএইচ এমন চ্যালেঞ্জগুলির জন্য যেখানে জমাগুলি একে অপরের সাথে যোগাযোগ করে। এছাড়াও আমি আশঙ্কা করছি যে "আন্ডারহ্যান্ডড" উপাদানটি উদ্দেশ্যমূলকভাবে প্রয়োগ করা অসম্ভব পক্ষে কঠিন হবে।
মার্টিন ইন্ডার

2
আমি @ মিঃ বেটনার এর মন্তব্যে একমত যে আন্ডারহ্যান্ড অংশটি বিচার করা কঠিন। অন্যদিকে আমি অনুভব করি যে এই চ্যালেঞ্জের একমাত্র আকর্ষণীয় অংশ। আমি গ্যারান্টি দিতে পারি যে ত্রুটি উত্পন্নকরণ এবং হার হুবহু নির্দিষ্টকরণের মধ্যে রয়েছে এবং তাই সর্বাধিক পয়েন্ট রয়েছে। বা আমি অনুমান থেকে কিছু মিস করি? তদুপরি, অতিরিক্ত ধরণের ত্রুটি যদি গ্রহণ করা হয় তবে এটি উপরের তালিকায় যুক্ত হবে; এবং সমস্ত উত্তর এটিতে স্কোর করা হবে। লোকেরা কাজ শুরু করার বা সমাধান জমা দেওয়ার পরে আপনি যে চ্যালেঞ্জটি পরিবর্তন করতে চলেছেন বলে মনে হচ্ছে যা আমার মনে হয় ভাল ধারণা নয়।
হাওয়ার্ড

@ হাওয়ার্ড: লক্ষণীয়। নিয়মগুলি নির্দিষ্ট আন্ডারহেনডনেডনেস মানদণ্ডের সাথে আপডেট হয়; এবং মিউটেশনাল দিক ত্রুটিগুলি সরানো হয়।
উইলিয়াম টটল্যান্ড

1
আমি আমার উত্তর দিতে যাচ্ছি .. তবে আমি মনে করি এই দুটি বাক্য "প্রতিটি রূপান্তরটিতে একটি ছোট ত্রুটির হার প্রবর্তন করা উচিত; দশ হাজার প্রতি এক ত্রুটির ক্রমক্রমে দশ মিলিয়ন ইউনিট প্রক্রিয়াজাত করা উচিত।" এবং "একটি এন্ট্রি অযোগ্য ঘোষণা করা হবে যদি: এটি প্রতি দশ হাজার ইউনিটে গড়ে একাধিক ত্রুটি উত্পন্ন করে।" বেমানান। "প্রতিটি রূপান্তরটির মধ্যে একটি ছোট ত্রুটির হার প্রবর্তন করা উচিত; দশ হাজার প্রতি এক ত্রুটির ক্রমক্রমে প্রক্রিয়াজাত দশ মিলিয়ন ইউনিট"। এবং "একটি এন্ট্রি অযোগ্য ঘোষণা করা হবে যদি: এটি প্রতি মিলিয়ন ইউনিটে গড়ে একটিরও কম ত্রুটি উত্পন্ন করে।"
ম্যাটস্টিল

1
আমি এই প্রশ্নটিকে অফ-টপিক হিসাবে বন্ধ করতে ভোট দিচ্ছি কারণ ছদ্মবেশী চ্যালেঞ্জগুলি এখন আর এই সাইটে অন টপিক নয়। meta.codegolf.stackexchange.com/a/8326/20469
বিড়াল

উত্তর:


3

পার্ল 5.10

পার্লে আমার সমাধানটি উপস্থাপন করতে পেরে আমি আনন্দিত।

আমি যখন চ্যালেঞ্জটি শুরু করেছি তখন আমি নিশ্চিত ছিলাম যে পার্ল 1 ঘন্টার সীমার নীচে থেকে যাবে।

পরীক্ষার উদ্দেশ্যে আমি একটি সরল নমুনা জেনারেটর এবং একটি কোডযুক্ত নমুনা জেনারেটর তৈরি করেছি।

তারপরে আমি এনকোডারটি বিকাশ করেছি যা আরও বড় চেষ্টা করেছিল এবং একটি দীর্ঘতর কোড তৈরি করে। এনকোডারটি নিম্নলিখিত হিসাবে কাজ করে:

  1. প্রথম লুপ পুরো ফাইলটি পড়ে এবং সমস্ত ট্রিপলের অ্যারে রাখতে ডেটা বিভক্ত করে l
  2. দ্বিতীয় লুপটি অ্যারেটিকে ঘুরিয়ে দেয় এবং প্রতিটি উপাদানকে তার দৈর্ঘ্যের জন্য প্রিপেন্ড করে
  3. তৃতীয় লুপ আবার ট্র্যাভার করে এবং আউটপুট দেওয়ার জন্য প্রতিটি চরিত্রকে মানচিত্র করে।

কোডেড বাইনারি আউটপুটটি 20 টি অক্টেটের নতুন-লাইন সমাপ্ত "লাইনগুলি" হিসাবে ফর্ম্যাট করা হয়েছে যেখানে প্রতিটি অক্টেটের একটি ট্রিপলেট কোড রয়েছে, যেখানে উপসর্গের দুটি অক্ষর রয়েছে (একটি চক্রীয় লাইন সংখ্যা হিসাবে)।

উদাহরণস্বরূপ, সংক্ষিপ্ততম তিন বাইট ইনপুট:

AAA

তিনটি বাইট প্লাস নতুন-লাইনের সংক্ষিপ্ত আউটপুট দেওয়া উচিত।

00ÿ

এটাই

30 30 FF 0A

এবং

AGG CGC AAC GGC TAA ATC GTT TTC ACA CCA CGT TTG AAA CGG GTG ACA CGA GAT TTA GTC
TAT GGT ACT AGG TAC GCC GTG GTG CGT GCG GAG TTA CTA GAT GTG TTA GTA CGC CAT CGT

নিম্নলিখিত বাইনারি দেওয়া উচিত।

01ÊûÃëÐÇå×ÌüùÖÀúæÌøáÔç
00ÑéÍÊÓïææùîâÔôáæÔäûñù

ছোট ত্রুটির হারের কারণে হওয়া উচিত : ক্ষুদ্রতম ইনপুটটির জন্য, স্ক্রিপ্টটি 1 ত্রুটি প্রবর্তন করে।

3 মিলিয়ন ট্রিপল ফাইল ফাইলের জন্য, এনকোডার 11 টি ত্রুটি পরিচয় করিয়ে দেয়।

প্রদত্ত স্ক্রিপ্টটি dnacodec3.pl হয়, রানটি কমান্ড প্রম্পটে যথারীতি ডাকা হয়:

$> perl dnacodec3.pl -e < plain.txt > coded.txt

ডিকোডারটি নিম্নলিখিত হিসাবে কাজ করে:

  1. প্রথম লুপ পুরো ফাইলটি পড়ে এবং সমস্ত অক্টের অ্যারে রাখতে ডেটা বিভক্ত করে। এটি প্রতিটি নতুন লাইনের উপর নজর রাখে।
  2. দ্বিতীয় লুপ প্রতিটি অক্টেট পরীক্ষা করে, 00 টি না দিয়ে শুরু করে এবং বাকিগুলিকে উপেক্ষা করে। প্লেইন আসকি আউটপুটটিকে একটি স্পেস দ্বারা পৃথক করা ট্রিপলটির নতুন-লাইন টার্মিনেটেড লাইন হিসাবে ফর্ম্যাট করা হয়। নতুন লাইন আছে একই অবস্থানে হিসাবে তারা ইনপুট ছিলেন।

আমি একটি 3 মিলিয়ন ট্রিপল্ট নমুনা পরীক্ষা ফাইল (প্রায় 12MByte) প্রস্তুত করেছি এবং সময় পরীক্ষার জন্য পরীক্ষা করেছি। আমার ল্যাপটপটি 2.6 গিগাহার্জ ইনটেল কোর আই 5 ভিপ্রো দিয়ে ব্যবহার করে 3 এম এনকোডার রানটি সর্বদা 20 সেকেন্ডেরও কম সময় নেয়। রান চলাকালীন সময়টি 200-220 এমবিাইট র‌্যাম লাগে। কী অপচয়!

ডিকোড রান 10 সেকেন্ডেরও কম সময় নেয়। এটি আপাতত ত্রুটিগুলি প্রবর্তন করতে পারে না।

আবার, ডিকোডিং রান জন্য

$> perl dnacodec3.pl -d < coded.txt > plain.txt

কোডটি এখানে

#!/usr/bin/perl
use strict ;
use warnings ;
my $switch = shift || die "usage $0 [-e|-d]\n";
my %map = qw( x 10  X 11  c 0b  ? 00
              A 00  T 01  G 10  C 11  
              0 00  1 01  2 10  3 11  
              00 A  01 T  10 G  11 C  ) ;
my $r = 20 ;
my @dummy = unpack ( '(A4)*', '0xxx' x $r ) ;
my $map = oct( $map{ c } . ($map{ C } x 9) ) ;
my $t = time() ;
my @inp = () ;
my @out = () ;
my @buf = () ;
my $n ;

sub arch {
    push @buf, @dummy[ 0 .. $r - $#buf - 2 ] ;
    push @out, "@buf" ;
    @buf = () ;
}

sub encode {
    my $mask = '(A3)*' ;
    while ( my $row = <STDIN> ) {
        chomp $row ;
        $row =~ s/\s+//g ;
        $row =~ s/[^\r\n\tATGC]//g ;
        next unless $row ;
        my @row = unpack( $mask, $row ) ;
        push @inp, @row if $row ;
    }
    $n = scalar @inp ;
    $r = $n if $r > $n ;
    for ( my $i = $n - 1 ; $i >= 0 ; --$i ) {
        my $e = $inp[$n-$i-1] ;
        my $l = length( $e ) ;
        my $d = $e =~ /\?/? 0: $l ;
        push @buf, ( $d -((($i-($n>>1))&$map)?0:1) )
           . $e . 'x'x(3-$l) ;
        arch unless $i % $r ;
    }
    arch if scalar @buf ;
    my $m = scalar @out ;
    for ( my $j = $m - 1 ; $j >= 0; --$j ) {
        my @ary = () ;
        my $e = $out[$m-$j-1] ;
        for my $byte ( split / /, $e ) {
            my @byte = split ( //, $byte ) ;
            my @trad = map { $map{ $_ } } @byte ;
            my $byte = join( '', @trad ) ;
            push @ary, $byte ;
        };
        my $row = sprintf( '%02d', $j % $r) ;
        $row .= pack( '(B8)*', @ary ) ;
        print "$row\n" ;
    }
}

sub decode {
    my $mask = '(B8)*' ;
    while ( my $row = <STDIN> ) {
        chomp $row ;
        next unless $row ;
        my @row = unpack( $mask, $row ) ;
        push @inp, @row[0..$#row], '?' if $row ;
    }
    $n = scalar @inp ;
    my @ary = () ;
    for ( my $i = $n - 1 ; $i >= 0 ; --$i ) {
        my $e = $inp[$n-$i-1] ;
        if ( $e ne '?' ) {
            my $u = oct( '0b'. substr($e,0,2) ) ;
            my $a = '' ;
            for my $j ( 1 .. $u ) {
                $a .= $map{ substr($e,$j+$j,2) } ;
            }
            push @ary, $a if $u ;
        }
        else {
            my $row = "@ary" ;
            $row =~ s/\s{2,}//g ;
            print "$row\n" if $row ;
            @ary =() ;
        }
    }
}

decode if $switch eq '-d' ;
encode if $switch eq '-e' ;

এবং এখানে নমুনা জেনারেটর:

sub test_coder {
    my $n = shift || 1000 ;
    my @b = qw( A C G T ) ;
    for (my $l = 0; $l < $n; $l++) {
        my @ary = () ;
        for (my $t = 0; $t < 20; $t++) {
            push @ary, $b[ int(rand(4)) ] . $b[ int(rand(4)) ] . $b[ int(rand(4)) ] ;
        }
        print "@ary\n" ;
    }
    1;
}

sub test_decoder {
    my $n = shift || 1000;
    for (my $l = 0; $l < $n; $l++) {
        my @ary = () ;
        for (my $t = 0; $t < 20; $t++) {
            push @ary, int(rand(256)) | 0b11000000 ;
        }
        my $row = pack( 'C*', @ary ) ;
        print "$row\000" ;
    }
    1;
}


test_coder( @ARGV ) if $switch eq '-g' ;
test_decoder( @ARGV )  if $switch eq '-h' ;

ত্রুটিটি কোথায় ইনজেক্ট করা হয়েছে তা দেখাতে ভুলে গিয়েছি: দ্বিতীয় লুপের @ বুফটি ধাপটি চালিত করে।
ম্যাটস্টিল

এটা সূক্ষ্ম, আমি আপনাকে এটি দেব। একাধিক প্রতিযোগী না হওয়া পর্যন্ত আমি পূর্ণ-স্কেল পরীক্ষা চালাচ্ছি না, তবে এটি ভাল জিনিস। :)
উইলিয়াম টটল্যান্ড

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