Competitive programming হচ্ছে একটা মেধাভিত্তিক প্রতিযোগিতা। এখানে বিভিন্ন ধরনের সমস্যা দেয়া থাকে। এবং এসব সমস্যার সমধান করতে হয় Programming Language (C, C++, JAVA..) ব্যাবহার করে। এতে একজন programmer এর programming, algorithm, data structure, mathematical skill পরীক্ষা করা হয়। সবচেয়ে বড় কথা হল এখানে মুখস্ত করতে হয় না। প্রোগ্রামিং সমস্যাগুলো বিভিন্ন site (UVA, Lightoj, Codeforces,SPOJ) ইত্যাদিতে থাকে।
মূলত কম্পিউটারে প্রোগ্রাম লিখে সমস্যা সমাধানের জন্য যে প্রতিযোগিতাগুলো হয়ে থাকে সেগুলোই কম্পিটিটিভ প্রোগ্রামিং। এই কম্পিটিটিভ প্রোগ্রামিংকে আমরা কন্টেস্ট বলে থাকি। কম্পিউটার সায়েন্সের সবার কাছে বর্তমান এটি খুবই প্ররিচিত একটি শব্দ। কন্টেস্টগুলোতে একটা নির্দিস্ট সময় বেঁধে দেয়া হয় এবং সে সময়ের মাঝে নির্দিষ্ট সংখ্যক সমস্যার সমাধান লেখার চেষ্টা করেন প্রোগ্রামাররা। কন্টেস্ট হয় দু ধরণেরঃ ১. অনলাইন, ২. অনসাইট। অনলাইন কন্টেস্ট নাম শুনেই বুঝার কথা এই প্রতিযোগিতাটি অনলাইনে হয়। Topcoder, CodeForces, Hackerrank, CodeChef এসব অনলাইন জাজিং প্ল্যাটফর্মে নিয়মিত অনলাইন কন্টেস্ট অনুষ্ঠিত হয়। সারা বিশ্বের যে কেউ যেকোন স্থান থেকে এসব প্রতিযোগিতায় অংশগ্রহণ করতে পারেন। অনসাইট কন্টেস্ট মানে একই জায়গায় সব প্রোগ্রামাররা একই নেটওয়ার্কে বসে কন্টেস্ট করেন। অনসাইটের সময়সীমা অধিকাংশ ক্ষেত্রে ০৫ ঘণ্টা নির্ধারণ করা থাকে। ০৮ টা থেকে ১১ টা সমস্যার সমাধান চাওয়া হয় সাধারণত। অনলাইন কন্টেস্ট এর সময় site অনুযায়ী ভিন্ন ভিন্ন হয়। অনসাইট কন্টেস্টে সাধারনত Team (তিন জনের) নিয়ে জয়েন করতে হয় এবং একজন Coach থাকেন। Contest এর সবচেয়ে মজার জিনিস হচ্ছে Ranklist. কোন Team এর অবস্থা কি বা কোন সমস্যা সমাধান হয়েছে তা Rankilst দেখে বুঝা যায়। এই র্যাঙ্কলিস্টের জন্য প্রোগ্রামরাররা দিনরাতকে এক করে প্র্যাক্টিস করেন, প্রবলেম সলভ করেন। বাংলাদেশে খুবই জনপ্রিয় একটি কন্টেস্ট হলো – ACM ICPC Contest. এই কন্টেস্ট থেকে যে দু/তিন দল ভাল করেন তারা ওয়ার্ল্ড ফাইনালে যাওয়ার সুযোগ পান। বাংলাদেশে Dhaka রিজিওনের আন্ডারে এই কন্টেস্ট আয়োজন করা হয়। এই কন্টেস্টটি সাধারণত নভেম্বরের দিকে অনুষ্ঠিত হয়ে থাকে। এছাড়াও বিশ্ববিদ্যালয়গুলো উদ্যোগে নিয়মিত ন্যাশনাল, রিজিওনাল কন্টেস্ট অনুষ্ঠিত হয়। স্কুল কলেজের ছেলেমেয়েদের জন্য আছে IOI, NHSPC।
কন্টেস্ট প্রোগ্রামিং বা প্রবলেম সলভিংয়ের আসল মজা হলো verdict এ। মানে তুমি যখন কোন একটি সমস্যার সমাধান লেখো তখন সেটি কি সঠিক নাকি ভুল, ভুল হলে কি ধরণের ভুল এসব verdict দেখে বুঝা যায়। বেশ কয়েক রকমের verdict আসতে পারে। Accepted, Wrong Answer, Time Limit Acceded, Memory Limit Exceeded সহ আরো আছে। Accepted মানে তোমার সমাধান পুরোপুরি ঠিক আছে। উত্তর ভুল থাকলে verdict দেখাবে Wrong Answer। নির্দিষ্ট সময়ের মাঝে তোমার সমাধানটি যদি আউটপুট জেনারেট করতে না পারে তাহলে দেখাবে Time Limit Exceeded। তোমার প্রোগ্রাম যদি অতিরিক্ত স্পেস খায় তাহলে দেখাবে Memory Limit Exceeded।
কন্টেস্ট প্রোগ্রামিং কেন করবে এর জন্য ভালো উত্তর কি হতে পারে? কন্টেস্ট প্রোগ্রামিংয়ের নানান দিক আছে। সবচে মজার দিক হলো কন্টেস্ট করে মজা পাওয়া যায়। এটি পুরোপুরি রোমাঞ্চিং এবং এডভেঞ্চারাস। প্রতি মুহূর্তে নিজেকে চ্যালেঞ্জ করার এমন সুযোগ আর কোথায় পাবে তুমি? কন্টেস্ট মানেই কোন সমস্যার নিখুঁত সমধান, সুক্ষ্ম ভুলের কারনেও তুমি রঙ এনসার পেতে পারো। তাই তোমাকে সমস্যা সমাধানে সবসময় সচেতন থাকতে হয়, সবচে বাজে কেস নিয়েও গভীর চিন্তা করতে হয়। প্রোগ্রামার হিসেবে অবশ্যই নন কন্টেস্টেন্ট থেকে দ্রুত, অপটিমাইজড, নির্ভুল কোড লেখার ক্ষমতা তৈরী হবে তোমার। তোমাকে সবসময় আইডিয়া নিয়ে কাজ করতে হবে, চিন্তা করতে হবে, ব্রেইন খাটাতে হবে; এই চর্চা সবসময়ই অন্য আট-দশ জনের চেয়ে তোমাকে আগিয়ে রাখবে। কে জানে, তোমার ছোট্ট একটি আইডিয়া যেকোন মুহূর্তে কম্পিউটার সায়েন্সের টার্নিং হয়ে উঠতে পারে। এছাড়াও কন্টেস্ট তোমার একাডেমিক কাজকর্মে ভালো সাপোর্ট দিবে। কন্টেস্টে কাজ করলে খুব বেশী কিছু শিখতে হয় ব্যাপারটা এমন না কিন্তু। এখানে বাধাধরা কিছু এলগরিদম আছে সেগুলোকে ঘিরেই নানান সমস্যা তৈরি হয়। ওসব নিয়েই কাজ করবে। অথচ ডেভেলপিং সেক্টরে গেলে তোমাকে সবসময় নিত্যনতুন টেকনোলজির সাথে আপডেটেড থাকতে হবে। অন্যান্য সেক্টরের চেয়ে বেশ কিছু ক্ষেত্রে কন্টেস্ট খুবই লাভজনক এবং সহজ একটি পন্থা। এছাড়াও গ্ল্যামারাস কোম্পানি গুগল, ফেসবুক, এমাজনে চাকরির স্বপ্ন তো আছেই। মোটা অঙ্কের বেতন নিয়ে আমি লিখছি না। অধিকাংশ কন্টেস্টেন্ট স্রেফ ভালোবাসার জায়গা থেকে কন্টেস্ট করে থাকেন। আমিও তাই।
এই দীর্ঘ লেখাটি পড়ার পর আমি ধরে নিচ্ছি তুমি কন্টেস্ট প্রোগ্রামিং বা প্রবলেম সলভিং যাত্রা শুরু করতে ইচ্ছুক। প্রশ্ন হলো কিভাবে ? এ নিয়ে গুগলে হাজার হাজার লেখা আছে। তবুও আমি দুয়েকটা লাইন লিখছি। সিনট্যাক্স তো জানা আছে। এবার কাজ হলো প্রবলেম সলভিংয়ে নেমে যাওয়া। এই লিঙ্কে ( https://www.cquestions.com/.../07/c-program-examples.html... ) এরকম বেশ কিছু প্রবলেম পাবে। এখানকার সবগুলো প্রোগ্রাম জানার চেষ্টা করো । এই কাজ শেষ হল । এবার তুমি অনলাইন জাজের সাথে পরিচিত হওয়ার সময় এসেছে। অনলাইন জাজ হলো – এমন একটা সাইট যেখানে অনেকগুলা প্রবলেম দেয়া থাকে – নানা ক্যাটাগরির আর সেগুলো সমাধান করে সল্যুশন পাঠালে অনলাইনেই verdict পাওয়া যায়। মূলত অনলাইন জাজগুলো একেকটি সমস্যা ভাণ্ডার যেখানে চাইলেই তুমি প্র্যাকটিস করতে পারো। বেশ কিছু জনপ্রিয় অনলাইন জাজ হলো – LighOJ, Uva, UriOj, Codeforces, Topcoder, Hackerrank … এছাড়াও আরো অনেক আছে। তোমার যে জাজ ভালো লাগে সেখান থাকে প্রবলেম সল্ভিং শুরু করতে পারো। Uva তে বেশ কিছু ইজি প্রবলেম আছে, সেগুলো সলভ করতে পারো কিংবা আমাদের বাংলাদেশের LightOJ এর বিগিনার ক্যাটাগরির প্রবলেম দিয়েও শুরু করতে পারো। এভাবে কয়েকটা জাজ মিলিয়ে ১০০ প্রবলেম সলভ করা উচিত । প্রবলেম সলভ করার সময়ে basic data structure, basic কিছু algorithm, number theory এসব নিয়ে পড়াশুনা চালিয়ে যেতে থাকো। এক ফাঁকে সি++ এর STL টা দেখে নিলে ভালো হয়, খুবই কাজের জিনিস। শখানেক প্রবলেম সলভ করা হয়ে গেলে এবার ডাটা স্ট্রাকচার আর এলগরদিম রিলেটেড প্রবলেম সলভ করা শুরু করতে পার। রেফারেন্স বুক হিসেবে CLRS এর Introduction to Algorithm দেখা যাতে পারে। এছাড়াও শাফায়েত ব্লগ, জুবায়ের ব্লগ, Topcoder টিউটরিয়াল, ইউটিউবে tushar roy, mycodecschool সহ বাংলা ও ইংরেজিতে অসংখ্য টিউটরিয়াল পাবে যেগুলো পড়লে তুমি নিজেই বুঝতে পারবে কিভাবে কি করতে হবে। গুগল করো, Quora তে যাও, ব্লগ পড়ো, ইউটিউব টিউটরিয়াল দেখো, শেখো এবং a2oj তে গিয়ে টপিক বেইজড প্রবলেম সলভ করা শুরু করতে থাকো। সব কিছুর উপর একটাই কথা, নিয়মিত প্র্যাকটিস চালিয়ে যাও। কন্টেস্ট প্রোগ্রামারদের মাঝে মাঝেই ফ্রাস্টেশন পিরিওড আসে, এসব একটু ধৈর্য্য ধরে সামাল দিতে পারলেই তুমিই হচ্ছো আগামী দিনের ওয়ার্ল্ড ফাইনালিস্ট। কনগ্রেটস ব্রো/সিস!
কতক্ষন কাজ করাবা না করবা এ নিয়ে একটি নিয়মিত প্রশ্ন আসে, শুরুর দিকের সলভারদের কাছ থেকে। আসলে বাধাধরা কাজ করা যায় না। তোমার নিজের ক্ষমতার উপর ডিফেন্ড করবে তোমার কতক্ষণ কাজ করা উচিত। নিয়মিত ৪/৫ তা প্রবলেম সলভ করার মতো কাজ কর, এটি যথেষ্ট মনে হয় আমার কাছে। সবসময়ই নতুন কিছু শেখার চেষ্টা করো। আরেকটি বিষয় কন্টেস্ট মানেই ০৩ জিনের টিম, টিম ওয়ার্ক মাস্ট লাগবে। টিম ওয়ার্ক ছাড়া এগুনো খুবই টাফ। যা শিখবে দল বেঁধে আশপাশকে সাথে নিয়ে শেখো।
#পার্ট : ২
নতুন যারা কম্পিটিটিভ প্রোগ্রামিং শুরু করেছে বা শুরু করতে চায় তাদের সবার কিছু কমন প্রশ্ন থাকে, তা হল কি ভাবে কম্পিটিটিভ প্রোগ্রামিং শুরু করবো এবং কি কি ধাপ ফলো করে সামনের দিকে আগাবো। সবাই একটা গাইডলাইন ফলো করে সামনের দিকে আগাতে চায়। তাই আমি আমার সামান্য অভিজ্ঞতা থেকে যতোটুকু জানি তা আপনাদের উদ্দেশে লিখার চেষ্টা করতেছি আশা করি কিছুটা হলেও উপকার হবে।
ধাপ — ১ :
কম্পিটিটিভ প্রোগ্রামিং শুরু করার আগে আপনাকে যে কোন একটি প্রোগ্রামিং ল্যাঙ্গুয়েজে ভাল দক্ষতা অর্জন করতে হবে ( যেমন : সি/সি++, পাইথন ,জাভা)। আমি মনে করি প্রথমে সি/সি++ দিয়ে কম্পিটিটিভ প্রোগ্রামিং শুরু করা ভাল । কারন প্রোগ্রামিংয়ের মৌলিক বিষয়গুলো বোঝার জন্য সি/সি++ অনেক সহায়ক । আর আমাদের সকল বিশ্ববিদ্যালয়ে প্রথম সেমিস্টারে সি/সি++ কোর্স পড়ানো হয়। তাই মনে করি এটা শিখতে কারও সমস্যা হওয়ার কথা না। আর যদি আপনার প্রোগ্রামিং ল্যাঙ্গুয়েজে সমস্যা থেকে থাকে তাহলে নিচের লিংক গুলো থেকে শিখে নিবেন।
2. https://www.youtube.com/watch?v=J8CImQO0Ogw...
3. https://www.hackerearth.com/practice/codemonk/
4. http://www.fredosaurus.com/notes-cpp/
5. http://shoshikkha.com/archives/category/computer-science/language/সি
ধাপ — ২ :
আশা করি আপনার এখন একটি প্রোগ্রামিং ল্যাঙ্গুয়েজে ভাল দক্ষতা অর্জন হয়েছে, আপনি এখন যেকোন ছোটখাটো প্রবলেম এর সমাধান কোড করে করেতে পারেন। তাহলে এখন আপনি কম্পিটিটিভ প্রোগ্রামিং শুরু করার জন্য প্রস্তুত । এখন আপনাকে একটা অনলাইন জাজ সম্বন্ধে জানতে হবে তাহল URI OJ : www.urionlinejudge.com। এখন বলতে পারও এত জাজ থাকতে URI কেন ? আসলে দেখা যাই যারা নতুন প্রোগ্রামিং শুরু করে তাদের লজিক ও প্রোগ্রামিং ল্যাঙ্গুয়েজের বেসিক এর দুর্বলতার কারনে UVA বা Codeforces প্রবলেমগুলো সল্ভে করতে প্রথম দিকে অনেক সমস্যা পড়ে, যার ফলে তারা ১০-১৫ টা প্রবলেম সল্ভে করার পর আর সামনের দিকে আগাতে পারে না । যার ফলে কম্পিটিটিভ প্রোগ্রামিং তাদের কাছে হার্ড মনে হয় এবং তারা হতাশ হয়ে এই জায়গা থেকে ঝরে পড়ে যায় । তাই আমি মনে করি URI OJ দিয় শুরু করা বিগিনারদের জন্য ভাল। এখন URI OJ রেজিস্ট্রেশন করে ওই জাজ এর বিগিনার ক্যাটাগরির যে প্রবলেম গুলা আছে সে গুলা থেকে মোটামোটি ১০০-১২০ টি প্রবলেম এর সমাধান করতে হবে তাহলে আপনার বেসিক জিনিস গুলো ক্লিয়ার হয়ে যাবে। এছাড়া আরও কিছু অনলাইন জাজ আছে সাথে সেগুলার বিগিনার প্রবলেম গুলো সল্ভ করতে পারও।
Toph OJ : https://toph.co/problems/easy-problems
Dimik OJ : http://cpbook.subeen.com/p/blog-page_11.html (বাংলায় প্রোগ্রামিং সমস্যা )
এছাড়া এগুলোর পাশাপাশি আরও কিছু বিষয় সম্পর্কে জানতে হবে ।
1. Online Judge Verdicts: https://hellohasan.com/2016/07/07/অনলাইন-জাজ-সিরিজ-৪-oj-verdicts/
2. Test Case & EOF : https://hellohasa n.com/2016/07/07/অনলাইন-জাজ-সিরিজ-৬-test-case-eof/
3. প্রোগ্রামিং কনটেস্ট কি : http://subeen.com/what-is-programming-contest/
4. কেন আমি প্রোগ্রামিং শিখবো : http://www.shafaetsplanet.com/planetcoding/?p=1437
ধাপ — ৩ :
আশা করি আপনার কম্পিটিটিভ প্রোগ্রামিং এর বেসিক জিনিস গুলো জানা হয়ে গেছে এবং এখন জানেন কি করে প্রবলেম সল্ভ করতে হয় এবং আপনি বেসিক প্রবলেম গুলোর সমাধান করতে পারেন। তাই এখন আপনাকে আরও কিছু অনলাইন জাজ এর সাথে পরিচিত হতে হবে এবং সেগুলোর প্রবলেম আপনাকে অনুশীলন করতে হবে।এছাড়া কিছু জাজে নিয়মিত অনলাইন প্রোগ্রামিং প্রতিযোগিতার আয়োজন করা হয় সেগুলাতে নিয়মিত অংশগ্রহণ করতে হবে। আমি কিছু অনলাইন জাজ এর সম্বন্ধে বলার চেষ্টা করতেছিঃ
1. http://uva.onlinejudge.org : এই সাইটে অনুশীলনের জন্য প্রচুর সমস্যা দেওয়া আছে নতুন প্রোগ্রামারদের জন্য এটি বেশ ভালো জায়গা । বিগিনারদের জন্য কিছু প্রবলেম লিস্ট আছে সেগুলো দেখে আপনি অনুশীলন করতে পারেন । http://actsj13.blogspot.com/.../uva-some-easy-problems... এছাড়া অনলাইন সার্চ দিলে আরও অনেক গুলো লিস্ট পাবে সে গুলো থেকেও অনুশীলন করতে পারও।
2. http://lightoj.com : এই সাইটে বিগিনারদের জন্য কিছু প্রবলেম দেওয়া আছে সে গুলো অনুশীলন করতে হবে । এই প্রবলেম গুলো অনেক ইন্টারেস্টিং এবং লজিকেল।
3. http://codeforces.com : বর্তমানে সব থেকে জনপ্রিয় অনলাইন জাজ গুলোর অন্যতম হল এটি । এই জাজে নিয়মিত বিভিন্ন ক্যাটাগরির অনলাইন প্রোগ্রামিং প্রতিযোগিতার হয়ে থাকে ( প্রতি মাসে ১০-১২ টি )। বিগিনারদের জন্য আলাদা করে Div2, Div3, Div4 ক্যাটাগরির কন্টেস্ট হয়ে থাকে যেখানে A,B,C প্রবলেম গুলা তুলনামূলক সহজ থাকে । এছাড়া অনুশীলন করার জন্য অনেক প্রবলেম দেওয়া আছে যা বিগিনারদের জন্য অনেক হেল্পফুল।
4. http://www.codechef.com : এটিও প্রোগ্রামিং প্রতিযোগিতার জন্য একটি জনপ্রিয় অনলাইন জাজ । এই জাজে প্রতি মাসে ৩টি প্রোগ্রামিং কন্টেস্ট হয়ে থাকে যার মধ্যে একটি ১০ দিন ব্যাপ্তি হয়ে তাকে এবং অনুশীলন করার জন্য অনেক প্রবলেম দেওয়া আছে ।
এছাড়া আরও অনেক অনলাইন জাজ আছে, আপনারা নিজে নিজে দেখতে পারেন HackerRank, HackerEarth , AtCoder, TopCoder, SPOJ, Aizu ইত্যাদি ।
ধাপ — ৪ :
এখন আপনাকে ডেটা স্ট্রাকচার ও অ্যালগরিদম এর বেসিক বিষয়-গুলো জানতে হবে (Sorting, Searching, Array, Linked List, Stack, Queue, Tree, BFS, DFS) । ডেটা স্ট্রাকচার ও অ্যালগরিদম জানার জন্য বাংলায় সব থেকে ভাল টিউটোরিয়াল হল তামিম শাহরিয়ার সুবিন ভাই এর ডেটা স্ট্রাকচার ও অ্যালগরিদম টিউটোরিয়াল সিরিজ । ডেটা স্ট্রাকচার ও অ্যালগরিদম এর বেসিক বিষয় জানা হয়ে গেলে আপনাকে সি++ এর STL বিষয় জানতে হবে (vector, stack, queue, priority_queue, set, map, iterator etc).
1.ডেটা স্ট্রাকচার ও অ্যালগরিদম : https://www.youtube.com/watch?v=Mz9BlmST31w...
2. ডেটা স্ট্রাকচার ও অ্যালগরিদম : https://www.hackerearth.com/.../data.../arrays/1-d/tutorial/
3. Tanvir’s Blog: C++ STL : https://tanvir002700.wordpress.com/2016/04/15/c-stl-tricks1/
4. শাফায়েতের ব্লগ : http://www.shafaetsplanet.com/
আমি আপনাদের আরও কিছু ইম্পরট্যান্ট ডকুমেন্ট এর লিংক নিচে দিয়ে দিচ্ছি আশা করি আপনাদের উপকারে আসবে ।
1. https://github.com/me-shaon/bangla-programming-resources
2. https://github.com/kamran-11b/Competitive_Programming
3. https://github.com/.../Competitive-programming-resourse-Link
আপনি যদি এই পথটুকু পাড়ি দিয়ে আসতে পারেন তাহলে সামনের দিকে যাওয়ার পথ আপনি নিজে নিজে পেয়ে যাবেন আশাকরি। এই পুরো পোস্টটার মধ্যে অনেক ইনফরমেশন দেওয়া আছে, আর কিছুদিন আগে আমিও ঠিক এই কথা গুলা লিখেই পোস্ট করতে চেয়েছিলাম। এই পোস্ট এর কথাগুলোর মধ্যে, আর আমার চিন্তাভাবনা অনেকটাই এক থাকার কারনে এই পোস্টটা অনেকটাই কালেক্ট করে শেয়ার করলাম।