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

অনলাইন জাজ সিরিজ – ৪ (Online Judge verdicts)

Post updated on 23rd July, 2016 at 09:22 pm

অনলাইন জাজে বা প্রোগ্রামিং কনটেস্টে প্রবলেম সলভ করার সময় বেশ কিছু ফলাফল (verdict) পাওয়া যায়। সেগুলো নিয়েই আমাদের এই পোস্ট।

 

Accepted

স্বপ্নের, সম্ভাবনার verdict! এই ভার্ডিক্ট পাওয়ার পরের অনুভূতি আসলে ভাষায় প্রকাশের মত না। যে একবার এই স্বাদ পেয়েছে, একমাত্র সে-ই বুঝে এর মর্ম! 🙂

এর দ্বারা বুঝায় নির্দিষ্ট সময়ের মধ্যে সবগুলো ইনপুটের জন্যই তোমার কোড সঠিক আউটপুট দিয়েছে।

 

Wrong Answer

Contestant-দের problem solving life এ সবচেয়ে বেশি অনাকাংক্ষিত আর বেশিবার পাওয়া অন্যতম ভার্ডিক্ট হচ্ছে Wrong Answer!  আদর করে অনেকে একে ডাকে WA বলে। Faulure is the puller of success এর অনুকরণে অনেকে বলে থাকেন WA is the piller of Accepted! 😛

যাই হোক, এই চমৎকার (!) verdict-টি নানাবিধ কারণেই পাওয়া যেতে পারে। প্রথমত এর কারণ হতে পারে যে তুমি যেই লজিক চিন্তা করে কোডটা করেছ লজিকটা আসলে ঠিক নাই। তাই তোমার কোড এমন উল্টাপাল্টা কিছু রেজাল্ট দিচ্ছে যা জাজের কাছে থাকা রেজাল্টের সাথে মিলছে না। যেমন ধরা যাক আমি প্রবলেম সেট করে দিলাম যে দুটি সংখ্যার যোগফল নির্ণয়ের একটা কোড করতে হবে। যেখানে সংখ্যাদুটি int রেঞ্জের মধ্যেই থাকবে। তুমি a, b, c নামের তিনটা variable ডিক্লেয়ার করলা। c = a + b; করে c এর মান প্রিন্ট করে দিলা। এখন চিন্তা কর আমি যদি a এর মান ইনপুট দেই 2,147,483,647 আর b এর মান ইনপুট দেই 1 তাহলে কি তোমার কোড কাজ করবে? উত্তর আসার কথা 2,147,483,648 কিন্তু তোমার কোড উল্টাপাল্টা রেজাল্ট দিবে। কারণ হচ্ছে c এর data type হচ্ছে int. কিন্তু 2,147,483,647
হচ্ছে int ডেটা টাইপের সবচেয়ে বড় সংখ্যা এর সাথে ১ যোগ করা হলে সেটি store করার জন্য int এর চেয়ে বড় ডেটা টাইপ প্রয়োজন। সেটা হতে পারে long int বা long long int. তাই তোমার কোড ভুল উত্তর দেয়ার কারণে ফলাফল পাওয়া গেল Wrong Answer!

তুমি যদি capital letter এর বদলে small letar, ফুল স্টপ, কমা ইত্যাদির কম-বেশি কর। প্রতিটা আউটপুট প্রিন্টের পরে new line print না কর, space কম বা বেশি প্রিন্ট কর তাহলেও WA খেতে পার।

নতুন নতুন সলভ করার সময় সাধারনত আমরা sample input-output এর সাথে আমাদের কোডের ইনপুট আউটপুট মিলাই। স্যাম্পলে ৩টা ইনপুট থাকলে শুধু এই তিনটা মিলিয়েই সাবমিট করে দিয়ে ওয়া খাই। এরপর প্রবলেম সেটারের চৌদ্দ গুষ্ঠি উদ্ধার করতে থাকি। মাঝে মাঝে মনে হতে থাকে জাজ সাইটে থাকা মেইলে জানাই যে আপনাদের ইনপুট-আউটপুটে নিশ্চয়ই ঘাপলা আছে! এইসব চিন্তা আসার সাথে সাথে “লা হাউলা ওয়ালা কুওয়াতা ইল্লা বিল্লাহ…” পড়বা! কারণ এইটা পড়লে শয়তান দূর হয়! 😛

এই দোয়া পড়ে নিজ দায়িত্বে কোডের ঘাপলা খোঁজা শুরু কর। শুধু স্যাম্পলের সাথে তোমার আউটপুট মিললেই নর্তন-কুর্দনের সুযোগ নাই। কারণ জাজের পিসিতে লাখ খানেক কিম্ভুত কিমাকার ইনপুট ডেটা থাকতে পারে। যা তোমার কোডে ইনপুট দেয়া হলে তার মাথা আউলা হবার যথেষ্ট চান্স থাকে। তাই all possible input এর কথা মাথায় রেখে কোড লিখতে হবে।

ছোট্ট আরেকটা উদাহরণ দিয়ে এই verdict শেষ করব। ধর তোমাকে বলা হল একটা বছরের সংখ্যা ইনপুট দেয়া হবে। বলতে হবে তা লিপ ইয়ার কিনা। স্যাম্পলে শান্ত-শিষ্ট দুইটা ইনপুট দেয়া আছে ২০১৬ আর ২০১৭। যার একটা লিপ ইয়ার আরেকটা লিপ ইয়ার না। হুট করে বাচ্চাকালের একটা কথা মাথায় আসল কোন সংখ্যাকে চার দিয়ে ভাগ করা গেলে তা leap year আর না করা করা গেলে তা লিপ ইয়ার না।  তুমি কোড করলা:

if(num%4==0) //অর্থাৎ সংখ্যাটি চার দ্বারা বিভাজ্য 
  printf("Leap year\n");
else //অর্থাৎ চার দ্বারা ভাগ করা যায় নি
  printf("Not Leap year\n");

স্যাম্পল ইনপুট দিয়ে লেখলা দারুণ! মিলে গেছে! নাচতে নাচতে সাবমিট করবা এবং ওয়া খাবা! কারণ লিপ ইয়ার চেক করার লজিকই ঠিক নাই তোমার! কিন্তু স্যাম্পল তো মিলেছে! তাহলে হবে না কেন? কারণ জাজের পিসিতে ইনপুট হিসেবে 2100 এই সংখ্যাটাও থাকবে। তোমার লজিক অনুযায়ী এটা লিপ ইয়ার, কিন্তু আসলে এটা লিপ ইয়ার না। তাই ভুল উত্তরের জন্য Wrong Answer পাবা!

এরকম কিছু case থাকে যেগুলো দিয়ে তোমার কোডকে আটকানোর চেষ্টা করা হবে। সেগুলোর ব্যাপারে আগেভাগে চিন্তা করে কোড না করলে নির্ঘাত ওয়া খেতে হবে। তাই সাবধান!!!

Time Limit Exceeded

প্রতিটা প্রবলেমেই মোটামুটি বলে দেয়া থাকে যে এই প্রবলেমটি কত সেকেন্ড সময়ের মধ্যে রান করে শেষ করতে হবে। অর্থাৎ যদি বলা থাকে 2 seconds, তার মানে হচ্ছে জাজের পিসিতে থাকা ইনপুট ফাইলের সকল ডেটা তোমার কোডে দেয়া হবে। এই সব ডেটা প্রসেস করে আউটপুট দিতে তোমার কোড ২ সেকেন্ডের বেশি সময় নিতে পারবে না। তোমার কোড যদি এই সময়ের মধ্যে সবগুলো টেস্ট কেসের জন্য সঠিক আউটপুট দেয় তো ভাল। যদি বেশি টাইম নেয় তাহলে এই রহস্যময় (!) ভার্ডিক্ট পাবা!

একটা উদাহরণ দেই। তোমাকে বলা হল 1 + 2 + 3 + … + n অর্থাৎ 1 থেকে n এর মধ্যের সবার যোগফল বের করতে হবে। টাইম লিমিট ২ সেকেন্ড। ইনপুট দেয়া হবে n এর মান। n এর মান হতে পারে long long int এর রেঞ্জের মধ্যের যে কোন সংখ্যা। আর জাজের পিসিতে 10^8 সংখ্যক input data রাখা আছে। যার প্রতিটা তোমার কোডে ইনপুট দেয়া হবে। তুমি যোগ করার জন্য প্রতিবার n ইনপুট নিয়ে ১ থেকে n পর্যন্ত একটা লুপ চালিয়ে যোগ করে যোগফল প্রিন্ট করলা। সাবমিট করলে এই প্রবলেমে মহান TLE ভার্ডিক্ট পাবা! কারণ 10^8 এর লুপ ঘুরাতেই ১ সেকেন্ডের মত ব্যয় হবে। এই লুপের ভিতরে যখন তুমি যোগ করার লুপ ঘুরাবা আর সেই লুপ ঘুরবে long long int রেঞ্জের সমান বার তখন তোমার এই কোড সবগুলো রেজাল্ট আউটপুট দিতে হয়ত কয়েক ঘন্টা সময় নিবে!

তাহলে কী করণীয়? লুপ না ঘুরিয়ে কি যোগ করা যায়? লুপ ঘুরালেই তো TLE! বাবুকালে সমান্তর ধারার সূত্র পড়েছিলে, মনে আছে? 1 হতে n এর মধ্যকার সকল পদের যোগফলের সূত্র হচ্ছে, sum = {n(n+1)}/2. অর্থাৎ আমরা কোডটাকে optimize করে সাবমিট করলে এটা ঠিক সময়ের মধ্যেই রান করে শেষ হবে।

কনটেস্টের ক্ষেত্রে আরেকটা গুরুত্বপূর্ণ ব্যাপার মাথায় রাখতে হয়, যারা C ও C++ ল্যাঙ্গুয়েজ মিলিয়ে কোড করে তাদের। আমরা অনেক সময় টাইপ করার কষ্ট আর সময় বাঁচাতে C++ এর cin ও cout মেথডগুলো ব্যবহার করি। এগুলো ব্যবহার করে ইনপুট আউটপুটের কাজ করতে format specifire ব্যবহার করার দরকার হয় না। কিন্তু এই মেথডগুলো C এর printf(), scanf() এর তুলনায় খানিকটা slow! আমার ক্ষেত্রে এই তিক্ত অভিজ্ঞতা বেশ কয়েকবারই হয়েছে যে শুধুমাত্র cin, cout ব্যবহার করার কারণে TLE খেয়েছি! এগুলো মুছে printf(), scanf() দেয়ার পর Accepted হয়ে গেছে। তাই কনটেস্টের সময় এগুলো ব্যবহার না করাই মনে হয় ভাল।

 

Runtime Error

তোমার কোডটা Judge PC-তে রান করার সময় যদি কোন কারণে crash করে বা বন্ধ হয়ে যায় তখন এই রেজাল্ট দেখাবে। কোন একটা কোড ক্র্যাশ করার অন্যতম প্রধান দুটি কারণ হতে পারে, code এর কোথাও কোন সংখ্যাকে শূন্য দিয়ে ভাগ করা হলে। অথবা কোডে array এর সাইজ ছোট হলে। ধর তুমি array declare করলে ১০০ সাইজের। কিন্তু কোড রান করার কোন একটা পর্যায়ে গিয়ে তুমি তোমার এরের ১১০তম index এর কোন ভ্যালু নিয়ে কাজ করতে চাচ্ছ। দেখ, array এর সাইজই হচ্ছে ১০০, ১১০তম ইন্ডেক্সের তো অস্তিত্বই নাই! তাই প্রোগ্রামটা এখানেই বন্ধ হয়ে যাবে।

একটা example দেইঃ দুইটা সংখ্যা দেয়া আছে (a, b). তোমাকে বলতে হবে দ্বিতীয় সংখ্যা দিয়ে প্রথম সংখ্যাকে নিঃশেষে ভাগ করা যায় কিনা। ভাগ করা গেলে YES না গেলে NO প্রিন্ট করতে হবে। তোমার কোড এমন হলঃ

if(a%b==0)
  cout<<"YES";
else
  cout<<"NO";

স্যাম্পলে ধর 25 5 একটা ইনপুট সেট ছিল, যার আউটপুট YES. আর 25 6 ছিল যার আউটপুট NO. তোমার কোডও এই দুই সেট আউটপুটের জন্য ঠিকঠাক কাজ করবে। সাবমিট করলে নিশ্চিত ভাবে তুমি রান টাইম এরর খাবা। কারণ ইনপুট ডেটা সেটে ভয়ংকর এক সেট ইনপুট লুকানো থাকবে। সেটা হতে পারে 25 0. বুঝতে পারছ এর ভয়াবহতা? অর্থাৎ তোমার কোড অনুযায়ী তোমাকে রীতি মত শূণ্য দিয়ে ভাগ করার একটা চেষ্টা নিতে হবে! যা করলে প্রোগ্রাম ক্র্যাশ করবে। তাই এই প্রোগ্রামের ফলাফল আসবে Run Time Error.

এছাড়াও কোন প্রোগ্রাম শুধু রান করেই যাচ্ছে, যখন বন্ধ হবার কথা বন্ধ হচ্ছে না। এসব ক্ষেত্রেও যতদূর মনে পড়ে RTE পাওয়া যায়।

 

Presentation Error

তোমার কোডের আউটপুট সব ঠিকই আছে কিন্তু হয়ত দুই-একটা space কম বা বেশি প্রিন্ট করেছ। এসব ক্ষেত্রে এই error দেখানো হতে পারে। এই ভার্ডিক্ট পেলে কোডের কোন লজিক বা হিসাব-নিকাশে পরিবর্তন করবে না। শুধুমাত্র চেক করবে তোমার output function-টা। ঠিকঠাক মত sample Output এর সাথে তোমার প্রোগ্রামের আউটপুট চেক করবা।

 

Compile Error

তোমার কোডটা অনলাইন জাজের পিসির compiler ঠিক মত কম্পাইল করতে পারে নি। হয়ত তুমি এমন কিছু কোড করেছ যেটা জাজের পিসি’র কম্পাইলার সাপোর্ট করে না। আবার এমনও হতে পারে তুমি প্রবলেমে কোড সাবমিট করার সময় ভুলে programming language সিলেক্ট করলা Java, কিন্তু তুমি কোড করেছ C++ এ। তখন কী হবে? জাজের পিসি তোমার এই কোডকে Java’র কম্পাইলার দিয়ে কম্পাইল করার চেষ্টা করবে। কিন্তু দেখবে এটি কম্পাইল করা যাচ্ছে না। তখন এই ফলাফল পাওয়া যাবে।

আবার অনেক সময় standard না এমন method/function ব্যবহার করলেও এই error আসতে পারে। যেমন C প্রোগ্রামে string reverse করার জন্য strrev() function টা ব্যবহার করলা। অথবা <conio.h> header file include করলা ও এর কোন ফাংশন নিয়ে কাজ করলা। মোটামুটি নিশ্চিত যে Compile Error খাবা!

 

Memory Limit Exceeded

জাজের পিসিতে প্রতিটা প্রবলেমের জন্যই একটা memory limit সেট করে দেয়া থাকে। অর্থাৎ তোমার প্রোগ্রামটা রান করার সময় RAM এ কতখানি মেমরি দখল করবে তার একটা লিমিট দেয়া থাকে। ধর দুইটা সংখ্যার যোগফল প্রিন্ট করার একটা প্রোগ্রামের জন্য মেমরি লিমিট দেয়া আছে 20 byte (এত কম থাকে না)। একেকটা int type variable দখল করে 4 byte. চারটা int ডিক্লেয়ার করলেও তোমার মেমরি জায়গা দরকার হবে ১৬ বাইট। কিন্তু তুমি যদি অকারকণে ইয়া বড় বড় সব array-string বা আরো অনেক অনেক ভ্যারিয়েবল ডিক্লেয়ার করে রাখ যা র‍্যামে 20 byte এর বেশি মেমরি ধরে রাখে তাহলে তুমি এই এরর পাবা।

 

Output Limit Exceeded

তোমার প্রোগ্রাম যদি অনেক বেশি তথ্য প্রিন্ট করতে চায় তখন এই ভার্ডিক্ট পেতে পার। এটা হতে পারে যদি তোমার কোড infinite loop এর মধ্যে পড়ে যায়।

 

Submission Error

তোমার কোডটা ঠিকঠাক মত সাবমিট না হলে বা data corrupt হলে এটা দেখাতে পারে।

 

Source Code Error

Hust এ arrange করা একটা কন্টেস্টে এই  অদ্ভুত জিনিসটা প্রথম দেখি। দুইটা প্রবলেম খুব সহজ ছিল। কনটেস্ট শুরুর ২-৩ মিনিটের মাথায় এক সাথে প্রায় ৪০-৫০ টার মত সাবমিশন হয়েছিল। এরপর শুরু হল এই ভার্ডিক্ট দেয়া! ধারণা করা হচ্ছে যে Judge এর server busy থাকলে তখন এই এরর দেয়। একই problem ৩ বার submit করা হল। প্রথম দুইবার Source Code Error আর শেষ বার Accepted!

তাই এই ধরণের এরর পেলে ঐ মুহূর্তে আবার সাবমিট করা থেকে বিরত থাকুন। জাজের মাথা একটু ঠান্ডা হলে পরে আবার সাবমিট করুন।

 

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

ধন্যবাদ। 🙂

14 thoughts on “অনলাইন জাজ সিরিজ – ৪ (Online Judge verdicts)

    1. Compile Error

      তোমার কোডটা অনলাইন জাজের পিসির compiler ঠিক মত কম্পাইল করতে পারে নি। হয়ত তুমি এমন কিছু কোড করেছ যেটা জাজের পিসি’র কম্পাইলার সাপোর্ট করে না। আবার এমনও হতে পারে তুমি প্রবলেমে কোড সাবমিট করার সময় ভুলে programming language সিলেক্ট করলা Java, কিন্তু তুমি কোড করেছ C++ এ। তখন কী হবে? জাজের পিসি তোমার এই কোডকে Java’র কম্পাইলার দিয়ে কম্পাইল করার চেষ্টা করবে। কিন্তু দেখবে এটি কম্পাইল করা যাচ্ছে না। তখন এই ফলাফল পাওয়া যাবে।

      আবার অনেক সময় standard না এমন method/function ব্যবহার করলেও এই error আসতে পারে। যেমন C প্রোগ্রামে string reverse করার জন্য strrev() function টা ব্যবহার করলা। অথবা header file include করলা ও এর কোন ফাংশন নিয়ে কাজ করলা। মোটামুটি নিশ্চিত যে Compile Error খাবা!

  1. অনেক কাজের একটা আর্টিকেল লিখেছেন ভাইয়া। নূতন নূতন OJ ইউজ করছি, WA ছাড়া এখন পর্যন্ত কপালে কিছু জোটে নাই। ইন শা আল্লাহ এবার একটা হলেও Accepted জুটবে 😀

  2. ভাইয়া, Codeforces এ “Idleness Limit Exceeded” বলে একটা verdict আছে, যেটা থেকে বাঁচার জন্য output stream বারবার flush করতে হয়। ওটা ব্লগে অ্যাড করে দিয়েন।

  3. আচ্ছা কারোর কোড এ কি একসাথে অনেকগুলা verdict(যেমন presentation error এবং Output limit exceeded) আসতে পারে?? সেক্ষেত্রে কোন verdict টা দেখাবে?

  4. ভাই আমি ইউ আর আই তে প্রব্লেম সাবমিট করতে গেলে কম্পাইলেশন ইরর দেখায় কেন ?? জাভা ল্যাংগুজে ইন্টেলিজে তে লিখেছি ।কুথাও সমাধান পাচ্ছি না ।

    1. Java এর ক্ষেত্রে Online Judge-গুলো মেইন ক্লাসের নাম নির্দিষ্ট করে দেয়। আপনি সেই একই নামের ক্লাস ডিফাইন করেছেন কিনা দেখে নিন।

Leave a Reply

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