প্রোগ্রামিংয়ের মজার দুনিয়া ৬

এর আগের লেখায় আমরা বলেছি বিভিন্ন প্রোগ্রামিং প্রতিযোগিতা নিয়ে। এখন এ রকম অনেকগুলো প্রতিযোগিতাই দেশে ও বিদেশে নিয়মিতভাবে অনুষ্ঠিত হয়। বাংলাদেশে স্কুল-কলেজের ছেলেমেয়েদের জন্য আয়োজিত এ রকম সবচেয়ে বড় প্রতিযোগিতা হলো ‘জাতীয় হাইস্কুল প্রোগ্রামিং কন্টেস্ট’ বা এন এইচ এসপিসি। কাজেই এন এইচ এসপিসির জন্য ভালোমতো প্রস্তুতি নেওয়া এখন খুবই জরুরি। আজকের পর্বে আমরা সে ব্যাপারেই কথা বলব।

প্রথমবার অংশগ্রহণকারীদের জন্য

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

  • যেকোনো প্রতিযোগিতার মতোই প্রোগ্রামিং প্রতিযোগিতাতেও ভালো ফল করার জন্য সময় দিতে হয়। আমরা অনেকেই গণিত বা বিজ্ঞানভিত্তিক প্রতিযোগিতায় ভালো করি, কিন্তু প্রোগ্রামিং প্রতিযোগিতায় ভালো না করে হাল ছেড়ে দিই। এখানে মনে রাখা দরকার যে আমরা গণিত বা বিজ্ঞান চর্চা করি একদম ছোটবেলা থেকে। কিন্তু প্রোগ্রামিং চর্চা আমরা সে হিসেবে করিই না। কাজেই ভালো ফল করার জন্য আমাদের ধৈর্য ধরতে হবে।

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

  • শুধু বইয়ে দেখানো প্রোগ্রামগুলো লিখলেই চলবে না। তোমাকে নতুন নতুন সমস্যাকে প্রোগ্রাম করার দক্ষতা অর্জন করতে হবে। এ রকম সমস্যা বিভিন্ন বইতেই পাওয়া যাবে। আর না পেলেও সমস্যা নেই। তুমি নিজেই সমস্যা বের করে তা সমাধানের চেষ্টা করবে। আসল বিষয়টি হলো তুমি প্রোগ্রামিংয়ের খুঁটিনাটি বিষয়গুলো একদম গভীরে গিয়ে বুঝতে চেষ্টা করবে।

  • অন্য প্রোগ্রামারদের সঙ্গে যোগাযোগ রাখা খুব জরুরি। আমাদের এখন অনেক বিশ্ববিদ্যালয়েই এন এইচ এসপিসির মেন্টর রয়েছে। এরা সবাই তোমাদের সাহায্য করার জন্য প্রস্তুত। শুধু তা-ই নয়, তোমার নিজের স্কুলে বা কলেজেই হয়তো বড় কোনো ভাইয়া-আপুর আগে এই প্রতিযোগিতায় অংশ নিয়েছ। এদের সবার সঙ্গে যোগাযোগ করার মাধ্যমেও তুমি তোমার প্রোগ্রামিং দক্ষতা বাড়াতে পারো।

  • সবচেয়ে গুরুত্বপূর্ণ যে বিষয়টি খেয়াল রাখতে হবে তা হলো তোমাকে সাহস করে শুরু করতে হবে। তুমি হয়তো প্রোগ্রামিংয়ে একেবারেই কাঁচা। কাজেই তুমি মনে করতেই পারো যে এই প্রতিযোগিতায় তুমি এ বছর আসবে না। হয়তো আসলে তুমি অনেক খারাপ করবে। কিন্তু তোমার অবশ্যই সাহস নিয়ে শুরু করা উচিত। যেকোনো ক্ষেত্রেই শুরু করাটি হচ্ছে সবচেয়ে গুরুত্বপূর্ণ।

  • তোমাকে অবশ্যই ধৈর্য ধরতে হবে। প্রোগ্রামিং শেখার শুরুতে হতাশ হয়ে যাওয়াটা খুবই স্বাভাবিক। কিন্তু কোনোভাবেই হতাশ হয়ে হাল ছেড়ে দেওয়া যাবে না।

    তোমরা যারা প্রথমবার আসছ, তাদের অনেকেরই হয়তো প্রতিযোগিতাটি কীভাবে হয়, সেভাবে ধারণা নেই। আমরা এখন সে ব্যাপারে তোমাদের জানাব।

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

এবং বেশির ভাগ প্রতিযোগী এই স্বয়ংক্রিয় বিচারকের কারণেই সবচেয়ে বেশি ঝামেলা পোহায়। যেহেতু মানুষের বদলে কম্পিউটার ব্যবহার করা হয়েছে বলে সে বিচারক কিছু কিছু ব্যাপারে সীমাবদ্ধ। এই বিচারক, বিভিন্ন প্রকার ইনপুট দিয়ে তোমার আউটপুটের সঙ্গে সঠিক আউটপুট মিলিয়ে দেখেন। যদি আউটপুট মিলে যায়, তাহলে তিনি মনে করেন যে তোমার প্রোগ্রাম ঠিক আছে। এই বিচারকের কাছে সমাধান প্রেরণ করা হলে তিনি তোমাকে নিচের বিচারগুলো দিতে পারেন:

১. Wrong Answer

এই বিচার সবচেয়ে বেশি পাওয়া যায়। এর অর্থ হলো তোমার দেওয়া প্রোগ্রাম ঠিক আউটপুট দেয়নি। বিভিন্ন কারণেই তোমার প্রোগ্রামটি ঠিক আউটপুট না দিতে পারে। কারণগুলো হলো:

  • যুক্তিগত ভুল: এর অর্থ হলো তুমি প্রোগ্রামে এমন কোনো ভুল করেছে, যা গাণিতিকভাবে বা যৌক্তিকভাবে সঠিক নয়। যেমন ধরো, তোমাকে বৃত্তের ক্ষেত্রফল বের করতে বলা হয়েছে। তুমি ভুল করে সূত্র লেখার সময় 𝝅r2 এর বদলে 𝝅r3 লিখে ফেলেছ। কাজেই ব্যাসার্ধ ১ হলে যদিও তোমার ক্ষেত্রফলের মান ঠিকমতোই আসবে, কিন্তু অন্য ইনপুটের জন্য ঠিকই তোমার প্রোগ্রাম ভুল উত্তর দেবে।ঙ. প্রয়োজনের অতিরিক্ত নিউলাইন দেওয়া। যা চাওয়া হয়েছে, তার থেকে বেশি নিউলাইন দেওয়া যাবে না।

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

    ক. যেখানে বড় হাতের অক্ষর চাওয়া হয়েছে সেখানে ছোট হাতের অক্ষরে লেখা বা এর উল্টোটা। যেমন তোমাকে লিখতে বলা হয়েছে ‘Case’ সেখানে যদি তুমি লেখো ‘case’ তাহলে তুমি wrong answer পাবে।

    খ. প্রয়োজনের অতিরিক্ত স্পেস দেওয়া। যেখানে স্পেস দিতে বলা হয়েছে শুধু সেখানেই স্পেস দেওয়া। লাইনের শুরুতে বা শেষে অতিরিক্ত স্পেস দেওয়া হলেও তোমার প্রোগ্রামকে ভুল হিসেবে ধরা হবে।

    গ. লাইনের শেষে নিউলাইন না দেওয়া। প্রতিটি লাইনের শেষে নিউলাইন দেওয়া বাধ্যতামূলক। এমনকি শেষ লাইনের পরেও।

    ঘ. আউটপুটে যা চাওয়া হয়েছে তার কোনো কিছু বাদ দেওয়া। একটি ফুল স্টপ হলেও বাদ দেওয়া যাবে না। যেভাবে যা লিখতে বলা হয়েছে, সেটি হুবহু লিখতে হবে।

    ঙ. প্রয়োজনের অতিরিক্ত নিউলাইন দেওয়া। যা চাওয়া হয়েছে, তার থেকে বেশি নিউলাইন দেওয়া যাবে না।

    চ. প্রয়োজনের অতিরিক্ত লাইন আউটপুট দেওয়া। যেমন ইনপুট নেওয়ার আগে এ রকম লাইন লেখা: ‘give two integers’। সমস্যার আউটপুট অংশে যা বলা হয়নি, তার অতিরিক্ত যেকোনো কিছু প্রিন্ট করলেই তোমার সমাধানটি ভুল হিসেবে বিবেচিত হবে।

    ছ. দশমিকের পর যত ঘর প্রিন্ট করতে বলা হয়েছে তার থেকে বেশি বা কম করা। সাধারণত আমরা যদি %lf দিয়ে প্রিন্ট করি, তাহলে দশমিকের পর ছয় ঘর প্রিন্ট হয়। সমস্যাতে যদি এর থেকে বেশি বা কম চায় তাহলে আমাদের সেভাবেই প্রিন্ট করতে হবে। যেমন দশমিকের পর দুই ঘর প্রিন্ট করতে বললে আমরা %.2lf দিয়ে প্রিন্ট করব।

  • ওভারফ্লো: অনেক সময়ই আমরা ভ্যারিয়েবলের টাইপ বাছাই করার সময় ভুল করে থাকি। যেমন একটি বর্গক্ষেত্রের ক্ষেত্রফল নির্ণয় করতে দিলে তুমি হয়তো int টাইপে ধত্বধ নামের ভ্যারিয়েবল ডিক্লেয়ার করবে। কিন্তু যদি বর্গক্ষেত্রের বাহুর দৈর্ঘ্য দেওয়া হয় ১০০০০০, তখন কিন্তু তার ক্ষেত্রফল হবে এক এর পর দশটি শূন্য, যে মানটি রহঃ টাইপের ভ্যারিয়েবলে রাখা সম্ভব হয় না। এর জন্য দরকার হয় long long int টাইপের ভ্যারিয়েবল।

  • প্রিসিশন %.ii: ভগ্নাংশ টাইপের মান নিয়ে কাজ করার সময় অনেক সময় প্রিসিশন এররের সম্মুখীন হতে হয়। এর অর্থ হলো তোমার আউটপুট খুব কাছাকাছি, কিন্তু হয়তো দশমিকের পর কোনো একটা ঘরে ভুল আসছে। এ জন্য আমাদের সব সময় এ ধরনের প্রোগ্রামে float ব্যবহার না করে double ব্যবহার করা উচিত।

২. Time Limit Exceeded

এই বিচারের অর্থ হলো তোমার প্রোগ্রামটি হয়তো ঠিক আউটপুট দিচ্ছে, কিন্তু সেটি আউটপুট দিতে খুব বেশি দেরি করে ফেলছে। সাধারণত প্রতিটি সমস্যার সমাধান প্রোগ্রামের জন্য একটি নির্দিষ্ট সময় বরাদ্দ থাকে। সেটি ৫০০ মিলিসেকেন্ড থেকে শুরু করে ১০/১৫ সেকেন্ড পর্যন্তও হতে পারে। তুমি যে প্রোগ্রামটি লিখবে, সেটি এই নির্দিষ্ট সময়ের মধ্যে কাজ শেষ না করতে পারলে তুমি এই বিচার পাবে। Time Limit Exceed বিচারটি না পাওয়ার জন্য নিচের পদ্ধতিগুলো কাজে লাগতে পারে:

  • আমাদের প্রোগ্রামের সবচেয়ে বেশি টাইম লাগার কারণ হলো লুপ বেশিবার ঘোরা। কাজেই হয়তো আমাদের যতবার লুপ না ঘোরানো দরকার, তার থেকে বেশিবার ঘোরানো হয়েছে।

  • হয়তো কিছু কাজ আমরা লুপ না ঘুরিয়ে সহজেই গাণিতিকভাবে সমাধান করতে পারি। এভাবে করলে আমাদের সময় অনেক কম লাগবে। যেমন তোমাকে যদি ১ থেকে N পর্যন্ত সংখ্যার যোগফল বের করতে বলা হয়, তাহলে লুপ না ঘুরিয়ে তুমি লিখতে পারো N(N-1)/2। এভাবে করার ফলে তুমি অনেক সময় কমাতে পারবে।

  • এর বাইরে ডেটা স্ট্রাকচার ও অ্যালগরিদম ব্যবহার করে আমাদের পক্ষে সময় বাঁচানো সম্ভব।

৩. Runtime Error

এই বিচার পাওয়ার অর্থ হলো তোমার প্রোগ্রামটি চালাতে গেলে সেটি ঠিকমতো চালানো সম্ভব হয় না। প্রোগ্রামে অনেক ধরনের ভুলের কারণেই Runtime Error আসতে পারে:

  • কোনো সংখ্যাকে শূন্য দিয়ে ভাগ করার চেষ্টা করলে হতে পারে।

  • ঋণাত্মক সংখ্যাকে বর্গমূল করতে গেলে হতে পারে।

  • অ্যারেতে ঋণাত্মক ইনডেক্স ব্যবহার করতে গেলে হতে পারে।

  • অ্যারেতে এমন ইনডেক্স ব্যবহার করতে যাওয়া যা অ্যারের সাইজ থেকে বড়।

৪. Compile Error

এই বিচার পাওয়া যায় তখনই, যখন তোমার প্রোগ্রামটি ঠিকমতো সিনট্যাক্স মেনে লেখা হয়নি। মনে রাখতে হবে, বিভিন্ন অপারেটিং সিস্টেমে সি/সি++ কম্পাইলার ভিন্ন আচরণ করে থাকে। আমাদের স্বয়ংক্রিয় বিচারক লিনাক্স অপারেটিং সিস্টেম এবং gcc কম্পাইলার ব্যবহার করে থাকে। কাজেই এমনভাবে প্রোগ্রাম লিখতে হবে যেন ওই অপারেটিং সিস্টেম এবং gcc কম্পাইলারে ঠিকমতো কম্পাইল করা যায়। না হলে তোমাকে Compile Error দেখানো হবে।

আশা করি, তোমরা লেখাটি পড়ে তোমাদের ভুলগুলো শুধরে নেবে। যদি এখানে বলা পরামর্শগুলো মনে রাখতে পারো, তাহলে তোমাদের ভুল করার সম্ভাবনা অনেক কমে যাবে। কাজেই বেশি বেশি অনুশীলন করো আর চলে আসো ‘জাতীয় হাইস্কুল প্রোগ্রামিং প্রতিযোগিতা’য়। সবাইকে অনেক অনেক শুভকামনা।