বিচারকের রায়! অনলানাইন জাজ ভার্ডিক্টগুলো, কোনটা কেনো? চলো একটু জেনে নেই।

Published by DIU CPC on

“10% রং এনসার!”
“রানটাইম কেন ভাইইই?“
“দোস্ত, TLE খাইছি, কেম্নে কী বুঝি না!”
“AC দাও বিধাতা, নয়তো এ জীবন রাখবোনা!”

তুমি যদি উপরের কথাগুলো কোথাও শুনে থাকো এবং ভেবে থাকো যে প্রোগ্রামাররা হিব্রু ভাষায় কথা বলে। তাহলে আশা করি এই লেখাটা পড়ার পর তোমার ভুল ভাঙ্গবে। অথবা তুমিও হিব্রু ভাষায় কথা বলতে পারবে!

প্রোগ্রামিং করা হয় কোনো একটা সমস্যা সমাধানের জন্য। সেটা হোক কোনো অনলাইনে জাজে ছোট্ট একটা প্রবলেম বা বিশাল ফ্লাইওভারের যাতায়াত ম্যানেজ করা জন্য তৈরি সফটওয়্যার। সব কিছুর মূলেই রয়েছে সমস্যা আর তার সমাধানের জন্য প্রোগ্রামিং।

এই সমস্যা সমাধানের দক্ষতা গড়ার জন্য চিন্তা করা শিখতে হয়, আর তার জন্য বেশী বেশী প্রবলেম সলভ করতে হয়। ”Online Judge” সংক্ষেপে OJ হলো সেই রকমই এক-একটি প্রব্লেমের ভান্ডার। । যেখানে হাজার হাজার প্রবলেম দেয়া আছে, সেগুলো তুমি প্রোগ্রামিং এর মাধ্যমে সমাধান করে জমা দিবে। তোমার কোড চেক করে সমাধান সঠিক হয়েছে কি না তার উপর ভিত্তি করে OJ তোমাকে একটি রেজাল্ট দিবে। তুমি ভাবতে পারো তোমার করা কোড একটি আসামি। সেই কোড টি কে — OJ কাঠগড়ায় দাড় করাবে। খুবই কঠিন পদ্ধতিতে তার বিচার হবে। এবং শেষ মুহুর্তে OJ একটি রায় দিবে।

সেটি হতে পারে Wrong answer, Runtime error, Time Limit Exceeded, Compilation error সহ আরো অনেক কিছু। এখনি ঘাবড়ে যেও না। ধিরে ধিরে আমরা সবগুলো রায় এর ব্যাখ্যা করবো। রায় এর ইংরেজি প্রতিশব্দ হচ্ছে Verdict.

ভার্ডিক্টগুলো ব্যাখ্যা করার আগে বলা উচিত OJ কিভাবে একটি প্রবলেমের সমাধান পরীক্ষা করে। তোমার প্রোগ্রাম টেস্ট করার জন্য OJ এর কাছে একটা Input থাকে, ধর ফাইলটির নাম input.txt। সাথে আরেকটি ফাইল থাকে যেটাতে সঠিক আউটপুট আগে থেকেই থাকে। ধর সে ফাইলটার নাম output.txt। জাজ input.txt ফাইলটি তোমার প্রোগ্রামে ইনপুট দিবে এবং তার থেকে আউটপুট নিয়ে অন্য একটি ফাইলে রাখবে। তারপর সেটা জাজের কাছে রাখা output.txt ফাইলের সাথে মিলাবে। তোমার আউটপুট ফাইল এবং জাজের আউটপুট ফাইল মিলে গেলে তোমার প্রোগ্রাম Accepted Verdict পাবে। আর যদি না মিলে তাহলে Wrong Answer Verdict পাবে। তবে ভুল হলে শুধু Wrong Answer Verdict-ই দেয় না। আরো অনেক হাবিজাবি Verdict মাঝে মধ্যে দেখা যায়। চলো আমরা একটি একটি করে সবগুলো সম্বন্ধে জানি।

১. Accepted(AC): এর অর্থ হচ্ছে তোমার প্রোগ্রাম সঠিক সমাধান দিতে পেরেছে। অর্থাৎ নির্দিষ্ট সময়ের মধ্যে সবগুলো ইনপুটের জন্য সব ঠিকঠাক আউটপুট দিয়েছে। পরীক্ষায় পাশ করছো আরকি।

২. Wrong Answer(WA): এর অর্থ হলো তোমার প্রোগ্রাম সঠিক উত্তর দিতে পারে নি। হয়তো স্যাম্পল ইনপুট আউটপুট মিলেছে। কিন্তু জাজের ইনপুট ফাইলে এর বাইরেও অনেকগুলো টেস্ট ইনপুট থাকতে পারে যার জন্য তোমার প্রোগ্রাম ঠিক আউটপুট দিচ্ছে না। এর আরো অনেক কারন থাকতে পারে। যেমন, হয়তো তোমার লজিকে ভুল! আছে অথবা তুমি ক্যাপিটাল লেটারের যায়গায় স্মল লেটার ব্যবহার করেছো বা স্পেস কমবেশি প্রিন্ট করেছো বা নিউলাইন দাও নি। এমন অনেক ধরনের ভুলের জন্য তুমি WA ভার্ডিক্ট পাবে। WA ভার্ডিক্ট পেলেই প্রথম করণীয় হচ্ছে অনলাইন জাজ কে গালাগালি না করে নিজের ভুল কোথায় থাকতে পারে সেটা নিয়ে চিন্তা করা। স্টেটমেন্ট আবার পড়া। সুযোগ থাকলে খাতায় আরো অদ্ভুত কিছু কর্ণার কেস খুজে বের করে তার জন্য তোমার প্রোগ্রামে কি আউটপুট দিচ্ছে দেখা এবং কি দেয়া উচিৎ তা মিলিয়ে দেখা, কন্সট্রেইন্টগুলোর দিকে নজর দেয়া এবং কি কি ইনপুটের জন্য সঠিক আউটপুট দিতে ব্যার্থ হতে পারে সেটা নিয়ে ভাবা।

৩. Presentation Error(PE): কিছু কিছু জাজে আউটপুট ফর্মেটিং যেমনঃ স্পেস কমবেশী, নিউলাইন না দেয়া এসবের জন্য সরাসরি WA ভার্ডিক্ট না দিয়ে Presentation Error দিয়ে থাকে। যার অর্থ তোমার প্রোগ্রাম এর আউটপুট প্রেজেন্টেশন ঠিক হয়নি। এই Verdict পেলে Sample Output অংশটি মনযোগ দিয়ে দেখতে হবে এবং সে অনুযায়ি কোড পরিবর্তন করতে হবে।

৪. Run Time Error(RTE): তোমার প্রোগ্রামটি জাজের পিসিতে চলার সময় হঠাত Crash করলে RTE ভার্ডিক্ট দেখায়। RTE এর সাধারণত ৩টি কারনে হয়ে থাকে

  • কোনো সংখ্যাকে ০ দিয়ে ভাগ করার চেষ্টা, যেটা গাণিতিক ভাবে অসঙ্গায়িত, তাই প্রোগ্রাম এটা হ্যান্ডেল করতে পারে না এবং এরর দেয়।
  • Array এর ভুল ইন্ডেক্সে পা দেয়া, অর্থাৎ তুমি যদি কোনো ১০ সাইজের একটি এ্যারে ডিক্লেয়ার করো এবং প্রোগ্রাম কোনো কারনে ১০(যেহেতু এটা 0 indexing মেনে চলে নাম্বার ইন্ডেক্সে এক্সেস করতে চায় অথবা Negative index Access করতে চায় তাহলে সেখানেই প্রোগ্রাম ক্র্যাশ করবে। কারন Array তে ১০ নাম্বার ঘরের কোনো অস্তিত্ব নেই।
  • Recursion এর Stack Overflow হলে, মানে recursion er depth অনেক অনেক বেশি হয়ে গেলে কম্পিউটার সেটা নিয়ে আর কাজ করতে পারেনা তাতেও RTE দেখাতে পারে। ৩য় কেসের দেখা খুব কম মিলবে, রিকার্শন নিয়ে বিস্তারিত জ্ঞান হলে এই কথাটা মনে করে দেখে নিবে একবার।

৫. Time limit exceeded(TLE): আমরা আদর করে যাকে TLE ডাকি তার মানে হলো তোমার প্রোগ্রামটি নির্দিস্ট সময়ের মধ্যে আউটপুট দিতে ব্যর্থ হয়েছে। একটু যদি খেয়াল করো তাহলে দেখবে প্রত্যেকটি প্রবলেমেই উপরের দিকে দুটো জিনিস লিখা থাকে। একটি হচ্ছে Time Limit: # Seconds আরেকটি হচ্ছে Memory Limit: # Megabyte. ধর টাইমলিমিট দেয়া ২ সেকেন্ড। তাহলে তোমার প্রোগ্রামটি জাজের সব ইনপুটের জন্য ২ সেকেন্ডের মধ্যে সব আউটপুট দিতে হবে। অন্যথায় সেটা TLE পাবে। TLE এর মানে হচ্ছে তোমার প্রোগ্রাম সঠিক আউটপুট দিলেও সেটা অনেক বেশী স্লো কাজ করছে। এটাকে আরো বুদ্ধি খাটিয়ে ফাস্ট করতে হবে। আর এই বুদ্ধি খাটিয়ে ফার্স্ট করাকেই বলে প্রোগ্রাম Optimization. প্রোগ্রামিং এ অপটিমাইজেশন খুবই গুরুত্বপুর্ণ একটি বিষয়। তুমি নিশ্চই চাইবে না একটি স্লো পিসিতে কাজ করতে, তাই না?

তাই জাজের operation per second জেনে রাখা ভালো এবং Time Complexity এর ওপর ধারণা রাখা ভালো, কারণ তোমার কম্পিউটারের চেয়ে জাজের কম্পিউটার/সার্ভার ফাস্ট হতে পারে, সেক্ষেত্রে নিজের কম্পিউটারে ২-১০সেকেন্ড লাগিয়ে দিলো বলে সাবমিট না করে বসে থাকা মোটেও ঠিক হবেনা।

৬. Memory Limit Exceeded(MLE): মেমরির লিমিট যখন ক্রস করে যায় তখন এই ভার্ডিক্ট পাওয়া যায়। প্রত্যেকটি প্রব্লেমের জন্য জাজের পিসিতে একটি নির্দিষ্ট র‍্যাম বরাদ্দ থাকে। এর বেশী ব্যবহার করতে গেলেই MLE পাওয়া যায়। TLE যেমন টাইম নিয়ে কাজ করে ঠিক তেমনই MLE মেমরি নিয়ে কাজ করে। এর সমাধানও একই রকম। বুদ্ধি খাটিয়ে ম্যামরি অপটিমাইজড কোড লিখা। বেশিরভাগ কন্টেস্টেই যদিও এটা নিয়ে খুব একটা মাথা ঘামাতে হয়না, তবুও সতর্ক থাকা ভালো।

৭. Compilation Error(CE): তোমার কোডটা অনলাইন জাজের পিসির compiler ঠিক মত কম্পাইল করতে পারে নি। হয়ত তুমি এমন কিছু কোড করেছ যেটা জাজের পিসি’র কম্পাইলার সাপোর্ট করে না। আবার এমনও হতে পারে তুমি প্রবলেমে কোড সাবমিট করার সময় ভুল programming language সিলেক্ট করলে। যেমন সিলেক্ট করলে Java, কিন্তু তুমি কোড করেছ C++ এ। তখন কী হবে? জাজের পিসি তোমার এই কোডকে Java’র কম্পাইলার দিয়ে কম্পাইল করার চেষ্টা করবে। কিন্তু দেখবে এটি কম্পাইল করা যাচ্ছে না। তখন CE ফলাফল পাওয়া যাবে।
আবার অনেক সময় standard না এমন method/function ব্যবহার করলেও এই error আসতে পারে। যেমন C প্রোগ্রামে string.h header ব্যবহার না করে string reverse করার জন্য strrev() function টা ব্যবহার করলে। অথবা header file include করলে ও এর কোন ফাংশন নিয়ে কাজ করলে। মোটামুটি নিশ্চিত যে Compile Error খাবে! তাই এর থেকে বাচার জন্য অবশ্যই কোড নিজের কম্পাইলারে রান করবে, কোনো লাইব্রেরি ফাংশান ব্যবহার করলে গুগল করে দেখে নিবে তা স্ট্যান্ডার্ড কি না(অবশ্যই কন্টেস্ট টাইমে সেই সুযোগ হবেনা) এবং কোড সাবমিটের সময় মনযোগী থাকবে।

৮. Output Limit Exceeded(OLE): প্রয়োজন থেকে অনেক বেশী আউটপুট প্রিন্ট করতে থাকলে এই ভার্ডিক্ট পাওয়া যায়। তাই এই ভার্ডিক্ট পাওয়ার পর প্রথম কাজ হবে কোড কোথায় অতিরিক্ত আউটপুট প্রিন্ট করছে তা খুঁজে বের করা।

মোটামটি এই ৮টি Verdict দেখেই তোমার প্রবলেম সলভিং জীবন কেটে যাবে। সবচেয়ে বেশী দেখা পাবে Wrong Answer এর, TLE দেখলে মেজাজ খারাপ হবে, RTE বা CE দেখলে নিজের চুল নিজের ছিঁড়তে ইচ্ছা করবে, কিন্তু ঘন্টার পর ঘন্টা দিনের পর দিন চেষ্টা করার পর যখন তোমার কোড সাবমিশন এর পাশে সবুজ রং এর Accepted লিখা উঠবে, আমি নির্দিধায় বলতে পারি সেই আনন্দটা তোমার সব কষ্টকে ছাড়িয়ে যাবে। সবার প্রোগ্রামিং ভুবনে যাত্রা শুভ হোক। বেশী বেশী AC আসুক তোমার জীবনে এই কামনা রইলো।

#Happy_Coding 🙂

Author: মোঃ হাফিজুর রহমান আরফিন
Press Secretary, DIU CPC Batch: 43, CSE, DIU


0 Comments

Leave a Reply

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