কম্পিটিটিভ প্রোগ্রামিং শিখতে ইচ্ছুক কিন্তু কি করতে হবে, কোথা থেকে শিখতে হবে সেটা বুঝতে পারছেন না? একেকজনের একেক কথায় মাথার ভিতর জটলা পাকিয়ে গেছে? মাথার চুল ছিড়ে ফেলতে মন চায়? আর নয় হতাশা, আর নয় চিল্লাচিল্লি। নিচের ধাপগুলো নিজের জীবনে প্রয়োগ করে দেখতে পারেন, কাজে লাগলেও লাগতে পারে। পাশাপাশি, আমি যে লেভেলের কোডার, তার থেকে বড় লেভেলের কোন টিপস দেয়া আমার পক্ষে সম্ভব না। তাই মোটামুটি বিগিনার থেকে সেমি-ইন্টারমিডিয়েট লেভেল পর্যন্ত কীভাবে আগানো লাগবে সেটার একটা ধারনা দেয়ার চেষ্টা করবো।
[ Tips I got from Tasmeem Reza vy once ]
Learn a programming language, C recommended
প্রোগ্রামিং ল্যাঙ্গুয়েজ একটা শিখলেই হয় আসলে। কম্পিটিটিভ প্রোগ্রামিংয়ের জন্য সাধারনত লোকজন C, C++, JAVA, Python, C#, Kotlin আরো কিছু কিছু ব্যাবহার করে তবে আমার জানামতে C++ সবথেকে বেশি পপুলার, তার অনেকগুলো কারন আছে। আমি দরকার মতো পরে আসবো এটা নিয়ে। পাইথন দিয়ে শুরু করা যেতে পারে, কিন্তু আমি যেভাবে বলবো সেভাবে চলতে চাইলে C দিয়ে শুরু করেন।
C এর নিচের জিনিসগুলো সম্পর্কে মোটামুটি ভালোভাবে একটু শিখে নিনঃ
-
Basic Syntax
-
Input-output
-
conditional logic
-
loops
-
array
-
string
-
functions
-
some টুকটাক জিনিসপত্র
সবকিছু একসাথে পেতে চাইলে এখানকার টপিকগুলো শেষ করুন। শেষের দুটি চ্যাপ্টার (কম্পিউটারের মেমরি আর পয়েন্টার) পড়ার দরকার নাই আপাতত। এগুলো শিখতে একেকজনের একেক সময় লাগতে পারে। আপনি যদি ক্লাস নাইন বা তার থেকে বড় লেভেলের হন তাহলে ১-২ মাসের বেশি সময় লাগবেনা।
Solve some basic problems
এই ধাপে আপনি C এর ব্যাসিক সিন্ট্যাক্স ভালোই পারেন। এবার কিছু প্রব্লেম সলভ করতে হবে। প্রথমেই এখান থেকে ১০-১২ টা প্রব্লেম সল্ভ করুন, জাস্ট C টা হাতে এসেছে কিনা চেক করার জন্য। মোটেই এই প্রব্লেমগুলো সবগুলো সল্ভ করতে যাবেননা, সময় নষ্ট হবে। একটু হাত সাফাই করার পর যাবেন CODEMARSHAL এ, ওখানে Problemset এ দেখবেন কিছু কিছু প্রব্লেম আপনি সলভ করতে পারছেন। ২০-২৫ টার মতো প্রব্লেম আছে, সবগুলো পারবেন না, তবে বেশিরভাগ গুলোই পারা সম্ভব। করে ফেলুন। এখন যান URI ONLINE JUDGE এ। এখানেও সেইম, বিগিনার সেকশন থেকে ২০-৩০ টা প্রব্লেম সল্ভ করে ফেলেন। একটু হাত চালু হবে। মোটামুটি নেস্টেড লুপ, 2d-3d অ্যারে এগুলা বুঝে যাবেন। তারপর LIGHTOJ তে গিয়ে বিগিনার সেকশনের প্রব্লেমগুলো সল্ভ করা শুরু করেন। সত্যি কথা বলতে প্রব্লেম গুলা খুবই ভালো মানের। যদিও বিগিনার লেভেল, কিন্তু আসলে ওগুলা সল্ভ করতে ভালো observation skill এবং mathematics লাগে। puzzle solving, critical thinking, basic geometry এইসবেরও কিছু প্রব্লেম পাবেন। যতগুলো পরেন সল্ভ করে ফেলেন।
Things are getting complicated
আপনি বেসিক প্রব্লেমগুলো সল্ভ করতে গিয়ে একটা সমস্যায় পরবেন, দেখা যাবে সলিউশন মাথায় আসছে না। সবকিছু complicated লাগা শুরু হবে। যেহেতু আপনি কেবল প্রব্লেম সল্ভিং শুরু করেছেন, তাই আপনার কখনোই হাল ছাড়া উচিৎ হবেনা। হুট করে সলিউশনও দেখে ফেলা যাবেনা। নিজে নিজে চেষ্টা করতে হবে। মনে রাখবেন, প্রব্লেম সলভিংয়ের এই সময়ে মোটেই ১-২ ঘন্টা চেষ্টা করার পর সলিউশন দেখার পেছনে দৌড়ানো যাবেনা। ২-৩-১০-২০ দিন করে লাগলেও নিজে চেষ্টা করে যেতে হবে। এটা করলে অনেকগুলো সুবিধা পাবেন সুদুর ভবিষ্যতে। সেগুলো পরে বলছি। এই সময়ে অনেকের Depression ভর করে। এটা একদম স্বাভাবিক, সবারই হয়। এখানে এসে সল্ভিং ছেড়ে দিলে আপনি নক আউট হয়ে যাবেন। টাটা বাইবাই হয়ে যাবেন। তাই এটি করা যাবেনা।
I can solve basic problems, watto do next?
ওকে, আমি ধরে নিচ্ছি আপনি এখন C এর বেসিক জানেন, পাশাপাশি উপরের যেখান যেখান থেকে প্রব্লেম সল্ভ করতে বলেছি সেগুলো সল্ভ করে ফেলেছেন। যার মানে আপনার আপাতদৃষ্টিতে ব্যাসিক ক্লিয়ার। যাই হোক, এখন আপনাকে দুটি জিনিস একসাথে চালানো শুরু করতে হবে।
-
Programming
-
Mathematics
ম্যাথ প্র্যাকটিস না করেই কম্পিটিটিভ প্রোগ্রামিং করা আর জলজ্যান্ত মানুষের মাথা কেটে বাদ দিয়ে দেয়া একই জিনিস। আপনি ম্যাথ ভালো না পারলে আগাতে পারবেননা। ম্যাথ সলভ করতে হবে প্রতিদিন। নিচের বইগুলো কিনে ফেলুনঃ
-
The Art and craft of problem solving
-
কম্বিনেটরিক্সের হাতেখড়ি
-
গনিত অলিম্পিয়াডের স্বপ্নযাত্রা।
-
Ming’s combinatorics book
-
Olympiad Combinatorics
-
Concrete Abstract Algebra
-
Number Theory
বইগুলো কিনে পড়া শুরু করেন। আর পাশাপাশি গুগলে সার্চ করে ম্যাথ অলিম্পিয়াডের প্রব্লেম সল্ভ করা শুরু করে দেন। প্রতিদিন ম্যাথ সলভ করতে হবে। আর আমি নিচে আর যা যা করতে বলবো, সবকিছুর সাথে এই ম্যাথ প্র্যাকটিসটা চালিয়ে যেতে হবে। তবে ম্যাথ প্র্যাকটিস সত্যি কথা বলতে সরাসরি লাগেনা খুব বেশি। আসলে লাগে, বাট যাই হোক ভয় পাওয়ার কিছু নেই, এতো হার্ডকোর কিছু আপাতত করা লাগবেনা। কিন্তু number theory, combinatorics, basic geometry, puzzle solving, mathematical problem solving এগুলা নিয়ে যত পড়বেন তত লাভ। প্রতিদিন ২০-৩০ মিনিট করে ম্যাথ প্র্যাকটিস করলেই হবে। আবারও বলছি, বইগুলোর সবকিছু পড়া জরুরি না। পড়তে ইচ্ছা হলে পড়বেন, নাইলে না, এরকম আরকি। টুকটাক জানা থাকলে ভালোই হয়।
I can solve basic problems and practicing mathematics regularly, watto do next
ওকে, এখন আপনার C++ শেখার সময় এসে গেছে। আমি সাধারনত C++ শেখার জন্য Teach Yourself C++ বইটা সাজেস্ট করি, কিন্তু কাহিনি হলো ওখানে আগেই Class, structure নিয়ে উরাধুরা কাজকর্ম শুরু করে দেয়া হয়েছে, যেগুলো সত্যি কথা বলতে competitive programming এ তেমন একটা কাজে আসবেনা, আসলেও খুব কম, পরে শেখা যাবে। C++ এর জন্য আপনাকে জাস্ট নিচের জিনিসটা আপাতত জানা থাকতে হবে। (আমি ধরে নিচ্ছি আপনি ব্যাসিক প্রব্লেম সলভিং আর C এর সিনট্যাক্স জানেন)
#include<bits/stdc++.h>
using namespace std;
int main(){
// the code
return 0;
}
এখানে জাস্ট মনে রাখবেন কোনো একটা কারনে using namespace std;
এই লাইনটা দিতে হয়। আর C++ এর জন্য জাস্ট ওই একটা হেডার ফাইল দিলেই হয়ে যায়। ওই হেডার ফাইলেই কম্পিটিটিভ প্রোগ্রামিং করতে যা যা হেডার লাগে সব দেয়া আছে। তাই আর কোন হেডার ফাইল নিয়ে চিন্তা করার দরকার নাই। এই ব্যাপারগুলো একটু পরে ডিটেইলস শিখবেন। আপাতত লাগবেনা। যাই হোক, আপনি array, string (C এর ক্যারেক্টারের অ্যারে) শিখে ফেলেছেন। এখন আরও কিছু ডাটা স্ট্রাকচার শেখা লাগবে। ওগুলার নাম নিচে দিয়ে দিচ্ছি। ওগুলা গুগল করে শিখে নিবেন। মানে, কোনটার নাম কি, কোনটার কাজ কি, কোনটার কি কি লাইব্রেরি ফাংশন আছে আর কোনটা কখন ব্যাবহার করতে হয় সেগুলো একটু শিখে ফেলেনঃ
-
Vector
-
String (C++ string)
-
Queue
-
Stack
-
List
-
Pair
-
Deque
-
priority_queue
-
Set
এগুলা শিখলেই হবে আপাতত। শিখলে বলতে আমি বোঝাচ্ছি আপাতত ব্যাবহার করতে পারলেই হলো। এখন আপনাকে আরো দারুন দারুন কঠিন(?) প্রব্লেম সল্ভ করা শুরু করতে হবে। তার জন্য আপনি এখন থেকে codeforces আর atcoder এর প্রব্লেমগুলা সল্ভ করা শুরু করেন। অবশ্যই সবগুলো পারবেননা। আমিও সবগুলা পারিনা, বলা যায় বেশিরভাগই পারিনা। codeforces এ division-2/3 এর যে কন্টেস্টগুলা হয় ওগুলাতে পার্টিসিপেট করা শুরু করেন। A,B সল্ভ করা শুরু করেন। এখন পর্যন্ত যা যা পারেন তা দিয়ে এগুলা সল্ভ করতে পারবেন। আর atcoder এর ডিভিশন-2 এর A,B,C সল্ভ করতে থাকেন। এভাবে সল্ভ করতে থাকেন। codeforces এ অন্তত 50 টা A আর 100 টা B সলভ করেন। এভাবে ১-২ মাস সল্ভ করতে থাকেন। তারপর শাফায়েত ব্লগ এ যান এবং জিনিসগুলো পড়া শুরু করেন। ওটা পড়া শুরু করার আগে সুবিন ভাইয়ের কম্পিউটার প্রোগ্রামিং পার্ট-২ পড়ে ফেলেন, কাজে লাগবে। তারপর শাফায়াত ভাইয়ের ব্লগ পড়া শুরু করেন, তাহলে আশা করি উপরের যেগুলো না বুঝে শিখতে বললাম ওগুলা বুঝে যাবেন সবকিছু। ব্লগ পড়তে থাকুন, পাশাপাশি নিচের বই দুইটা কিনে ফেলেন এবং পড়া শুরু করেন।
-
Programming Contest - Data Structure And Algorithm
-
Graph Algorithm (Shafayet Ashraf)
এগুলা জোগাড় করে পড়া শুরু করেন, পাশাপাশি প্রব্লেম সল্ভিল আর ম্যাথ সল্ভিং করতে থাকবেন। তারপর অ্যালগো-ডাটা স্ট্রাকচার শিখে, ওই রিলেটের প্রব্লেমগুলো সল্ভ করতে থাকবেন, lightoj, codeforces, atcoder, spoj, codechef এরকম আরো অনেক আছে। এই পর্যন্ত করতে থাকুন, বাকি জিনিসপত্র পরে লেখার চেষ্টা করবো। আর হ্যা, অনেক কিছুই না বুঝে শিখতে বলেছি, তার পিছনে কারন আছে আলাদা। তবে এই পোস্টের শেষ ধাপে যদি এসে থাকেন তাহলে অলরেডি সবকিছু ক্লিয়ার হয়ে যাওয়ার কথা। টাটা বাইবাই :)