পোস্টটি পড়া হয়েছে 6,472 বার
UVa 10931 Parity Solution in Bengali

অনলাইন জাজ সিরিজ – ২ (অনলাইন জাজ কিভাবে কাজ করে?)

Post updated on 1st February, 2017 at 08:56 pm

প্রথম পর্বে তোমরা অনলাইন জাজের সাথে পরিচিত হয়েছ। এই পর্বে জানতে পারবে একটা অনলাইন জাজ কিভাবে কাজ করে?

অনলাইন জাজ কিভাবে কাজ করে সেটা জানা থাকলে problem solving এর সময় বেশ কিছু বিষয়ে চিন্তা করতে সুবিধা হবে। তাই এই পার্টটা গুরুত্বপূর্ণ।

ধর তোমাকে আমি বললাম একটা কোড কর, যেখানে আমি একটা সংখ্যা ইনপুট দিব। তোমার প্রোগ্রামটা আউটপুট দিবে যে সংখ্যাটা positive নাকি negative তা। দুইটা স্যাম্পলও তোমাকে দেখালাম। 6 ইনপুট দিলে কোডের আউটপুট হবে পজেটিভ কিন্তু যদি ইনপুট দেই -2 (minus 2) তাহলে আউটপুট হবে নেগেটিভ। তো তুমি নিচের কোডটা করে এনে দেখালেঃ

scanf("%d", &a);

if(a>0)
  printf("positive\n");

else
  printf("negative\n");

আমি চেক করব যে কোডটা ঠিক আছে কিনা। কিভাবে চেক করব? কোডে কী লিখেছ সেটা দেখা ছাড়া সহজ বুদ্ধি হল কোডটা রান করব। ইনপুট দিব 6। দেখব এটার আউটপুট পজিটিভ কিনা। এরপর আবার ইনপুট দিব -2 দেখব নেগেটিভ দেখাচ্ছে কিনা। আচ্ছা শুধু এই দুইটা দেখেই কি ছেড়ে দিব? তা কিন্তু না। পজেটিভ আরো ১০-১২ টা নাম্বার একই রকম ভাবে নেগেটিভ আরো ১০-১২ টা নাম্বার ইনপুট দিয়ে দেখব ঠিকঠাক আউটপুট দেখাচ্ছে কিনা। দেখলাম উপরে যা কোড লিখেছ তাতে সব ঠিকঠাকই রেজাল্ট আসছে। এখন critical case হিসেবে ইনপুট দিলাম 0! এটার জন্য আউটপুট কী আসবে? তোমার উপরের কোডে কিন্তু এটার জন্য আউটপুট আসবে নেগেটিভ! কিন্তু শূন্য কি আসলেই নেগেটিভ? ঘাটাঘাটি করলে দেখতে পাবে শূন্য পজেটিভও না নেগেটিভও না। আবার কখনো পজেটিভ-নেগেটিভ উভয়ই বলা যায়। আমরা যদিও শূন্যকে পজেটিভ ভাবতেই ভালবাসি। সেক্ষেত্রে কিন্তু তোমার কোডটা কিন্তু ভুল রেজাল্ট দিচ্ছে।

এখন আসি অনলাইন জাজের সাথে এর সম্পর্কের কথা। আমি তোমার কোডকে বিভিন্ন ইনপুট দিয়ে দিয়ে চেক করলাম যে আউটপুট ঠিক আছে কিনা। অনলাইন জাজও ঠিক একই কাজটাই করে।

অনলাইন জাজটা কোন না কোন একটা ওয়েব সার্ভারে হোস্ট করা থাকে। এটাকে আমরা বলতে পারি Judge PC. এই জাজ পিসির কাছে প্রতিটা প্রবলেমের জন্য ২টা ফাইল থাকে। ধর একটার নাম input.txt অপরটি output.txt. তোমাকে যেই প্রবলেমটা দেয়া হবে সেটার ডেসক্রিপশনও এই পিসিতেই স্টোর করা থাকবে। আর থাকবে বিভিন্ন ল্যাঙ্গুয়েজের জন্য কিছু কম্পাইলার।

কম্পাইলার কী? CodeBlocks? না না…!!! CodeBlocks কিন্তু সি বা সি++ ল্যাঙ্গুয়েজের কম্পাইলার না। এটা একটা IDE. যেটা text editor, compiler ইত্যাদির একটা প্যাকেজ। কোডব্লক্সে যখন তুমি C programming language এর কোন কোড compile কর তখন এই IDE সি সোর্স কোডটাকে GCC কম্পাইলার দিয়ে compile করে machine readable format এ কনভার্ট করে। আবার যখন C++ এর কোড রান কর তখন g++ কম্পাইলার দিয়ে একে কম্পাইল করে। তাই অনলাইনে host করা আমাদের জাজের পিসিতেও GCC, G++ সহ যতগুলো প্রোগ্রামিং ল্যাঙ্গুয়েজে আমাদের প্রবলেমটা সলভ করতে চাই ততগুলো কম্পাইলার ইন্সটল করা থাকে। এজন্য দেখবে অনলাইনে প্রবলেম সলভের সময় যখন কোড সাবমিট করবে তখন কোন ল্যাঙ্গুয়েজে কোডটা লিখা সেটা সিলেক্ট করে দিতে হয়। তুমি যদি C তে কোড করে সিলেক্ট কর Pascal ল্যাঙ্গুয়েজ তাহলে জাজ পিসি প্যাসকেলের কম্পাইলার দিয়ে তোমার সি সোর্স কোডকে কম্পাইল করার চেষ্টা করবে। প্যাসকেলের কম্পাইলার তো সি এর কোড চিনে না! তখন তোমাকে verdict দেয়া হবে Compilation Error! অর্থাৎ জাজের পিসি তোমার কোডটাকে কম্পাইলই করতে পারে নাই!

আচ্ছা, এবার আসি ইনপুট-আউটপুট ফাইলের ব্যাপারে।

আমি তোমার কোডকে জাজ করার জন্য কী করেছিলাম? একটা একটা করে নাম্বার ইনপুট দিয়েছিলাম। জাজের পিসিও তোমার কোড কম্পাইল করার পর রান করে একটা একটা করে সংখ্যা ইনপুট দিয়ে চেক করবে। এই সংখ্যাগুলো কোন মানুষ বসে বসে ইনপুট দিবে না। জাজ পিসির input.txt নামক text file এ এই সংখ্যাগুলো নিচের মত করে save করা থাকে। এই ফাইল থেকে একটা একটা করে সংখ্যা তোমার প্রোগ্রামে ইনপুট দেয়া হবে।

5
6594
-8
9
0
-2
7
-85652

output.txt নামক আরেকটি টেক্সট ফাইলে save করে রাখা হবে উপরের ইনপুট ফাইলের ইনপুটগুলোর জন্য correct result-গুলো। শূন্যকে পজিটিভ ধরে তৈরি করা output.txt ফাইলটি হবে এমনঃ

positive
positive
negative
positive
positive
negative
positive
negative

Judge PC এখন যেভাবে জাজ করবে তার কনসেপ্টটা মোটামুটি এমন যে,  সে ইনপুট ফাইল থেকে প্রথমে 5 ইনপুট দিবে তোমার প্রোগ্রামে। এটার জন্য তোমার প্রোগ্রাম আউটপুট দিবে ‘positive’. এই আউটপুটটা সে আরেকটা টেক্সট ফাইলে সংরক্ষণ করবে। ধর এই ফাইলের নাম student_output.txt. এভাবে input.txt ফাইলের সবগুলো সংখ্যা তোমার কোডে ইনপুট করানো হবে আর আউটোপুটগুলো প্রিন্ট করা হবে student_output.txt নামক সেই ফাইলে। তাহলে সবগুলো ইনপুটের পর এই ফাইলের আউটপুটগুলো দাঁড়াবে এমনঃ

positive
positive
negative
positive
negative
negative
positive
negative

এরপর জাজের পিসি output.txt এর সাথে লাইন বাই লাইন চেক করবে student_output.txt ফাইলের সকল ডেটা। প্রথম চার লাইনের ডেটা হুবহু মিলে যাবে। কিন্তু ৫ নম্বর লাইনে এসে দেখবে judge result এ আছে positive কিন্তু তোমার রেজাল্ট এসেছে negative! যেহেতু উত্তর ভুল, তাই তোমার verdict পাঠানো হবে Wrong Answer.

এখানে দেখা যাচ্ছে যে একটা মাত্র শব্দ match করে নাই, তাতেই তোমার কোডকে Wrong বলা হল। মজার ব্যাপার হচ্ছে, একটা কোডকে Wrong বলার জন্য একটা শব্দের পার্থক্য দরকার হয় না। একটা space কম বা বেশি হলেও কিন্তু সেটা Wrong Answer শো করবে (Judge ভেদে এসব ক্ষেত্রে কখনো কখনো Presentation Error দেখায়)। আবার ধর সুন্দর দেখা যাবে তাই তুমি বুদ্ধি করে লিখলে এভাবে “Negative” অর্থাৎ শুরুর N টা capital letter এ। তাহলেও Wrong Answer! কারণ জাজের রেজাল্টে আছে “negative”. তুমি নিজেই একটা টেক্সট ফাইলে “negative” লিখে সার্চ কর “Negative” লিখে তাহলেও কিন্তু সার্চের রেজাল্টে পাবা “0 match”. কারণ N ও n এর ASCII value এক নয়। অথবা অনেক সময় ইনপুট নেয়ার আগে প্রিন্ট করতে পারো “Enter your number:” অথবা আউটপুট দেখানোর সময় একটু সাজিয়ে গুছিয়ে লিখতে পারো “Your result is: negative” ইত্যাদি। এসব ক্ষেত্রেও যথারীতি WA খাবা। কারণ তুমি “Enter your number” প্রিন্ট করলে সেটাও output.txt এর মধ্যে প্রিন্ট হবে। জাজের আউটপুটে এই লাইনটা লেখা নাই, কিন্তু তোমার ফাইলে আছে। তারমানে হচ্ছে দুইটা ফাইল পুরোপুরি এক না। তাই রেজাল্ট আসবে রং এনসার!

অতএব, জাজের কোডে আউটপুট দেখানোর সময় ১০০% accurate হতে হবে। জাজের আউটপুটের সাথে তোমার কোডের আউটপুটের প্রতিটা character by character মিললেই শুধুমাত্র তুমি verdict হিসেবে Accepted পাবা। তাই প্রবলেম ডেস্ক্রিপশন ও sample input/output মনোযোগ সহকারে দেখা উচিত। আর একটা কথা মাথায় রাখলে ভাল সেটা হচ্ছে, সকল আউটপুটের শেষেই একটা করে new line (\n) প্রিন্ট করতে হবে। এটা ডেস্ক্রিপশনে কোথাও বলা থাকুক বা না থাকুক এটা দিতেই হবে। শুরুর দিকে অসংখ্য প্রবলেমের আউটপুটের শেষে \n প্রিন্ট না করার কারণে verdict পেতে হয় WA! তাই সাধু সাবধান!!!

Leave a Reply

Your email address will not be published. Required fields are marked *