Competitive Programming কিভাবে/কোথা থেকে শুরু করবো?

[লিখাটা মূলত BRAC University এর CSE ছাত্র-ছাত্রীদের কথা চিন্তা করে লিখা। আর যারা ভার্সিটিতে ভর্তির আগে প্রোগ্রামিং কিংবা কন্টেস্ট সম্পর্কে কিছুই জানতো তাদের জান্য ]

“কম্পিটিটিভ প্রোগ্রামিং”, “কন্টেস্ট” এই ধরনের বেশকিছু শব্দ দেখে প্রথমদিকের ছাত্র-ছাত্রীরা বেশ উৎসাহ,কৌতূহল বোধ করে। এরপর এই কৌতূহল দমন করতে গিয়ে দিশেহারা হয়ে যায়। কোথা থেকে শুরু করবে? প্রতিটা বিশ্ববিদ্যালয়ে ট্রেইনার থাকে না যে তাকে সঠিকভাবে গাইড করবে। তবে এই ইন্টারনেটের যুগে গাইডেন্স  না পাওয়ার অজুহাতটা ধোঁপে টিকবে না।

প্রোগ্রামিং কন্টেস্ট সম্পর্কে জানতে এই লিখাটা পড়তে পারো – প্রোগ্রামিং কন্টেস্ট

CSE110(Programming Language 1) ব্র্যাকের প্রোগ্রামিং রিলেটেড ফার্স্ট কোর্স। মিড পরীক্ষার আগ পর্যন্ত লজিক বিল্ড-আপ করার উপর জোর দেয়া হয়। বিভিন্ন ধরনের ফ্লো-চার্ট শেখানোর মাধ্যমে। How To Solve It By Computer by Dromey বইতে বেশকিছু প্রবলেম আছে ভালো। যেগুলো অনুশীলনের মাধ্যমে লজিকাল চিন্তাধারণা ভালোভাবে ডেভেলপ করা সম্ভব। মিডের পরে বেসিক লেভেলের কোড করানো হয় জাভাতে। ল্যাবেও টুকটাক টাস্ক থাকে – স্টার ল্যাবসহ আরো কিছু। এই সময়টাতে  Uri Online Judge (ব্র্যাকের CSE এর ফ্রেশারদের জন্যে এইটাই সবচেয়ে সেরা সাইট, প্রবলেম সল্ভিং প্র্যাকটিস করার জন্য। অন্য কোথাও অন্য অনেক অনলাইন জাজের কথা উল্লেখ থাকতে পারে) এ প্র্যাকটিস শুরু করে দেয়া সর্বোত্তম। অনলাইন জাজ সম্পর্কে যাদের ধারণা নেই তারা এই লিখাটা পড়ে আসতে পারো  অনলাইন জাজ সিরিজ – ১ [অনলাইন জাজ পরিচিতি]

একাউন্ট খোলার পরে/লগ ইন করার পরে Home(Dash Board) এ গেলে বেশকিছু অপশন দেখতে পাবো Problems, Rank, Universities etc.  তো আমরা Problems সিলেক্ট করবো। এরপর সেখানে আবার অনেকগুলি অপশন দেখতে পাবো Beginner, Adhoc , String etc. আমরা Beginner সিলেক্ট করবো। এরপর বিভিন্ন প্রবলেম নামের একটা লম্বা লিস্টের প্রথম পাতা দেখতে পাবো। এখানে একটা প্রবলেম সিলেক্ট করলাম। সবার প্রথম প্রবলেমটা হলো – 1001 Extremly Basic এইখানে আমাকে একটা কোড লিখতে হবে যার কাজ হবে দুইটা নাম্বার ইনপুট নিয়ে তাদের যোগফল প্রিন্ট করা। যারা কোন একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ জানে তারা সবাই এইটা খুব সহজেই করতে পারবে। এইখানে একটা ব্যাপার আছে। ক্লাসে আমরা বিভিন্ন প্রোগ্রামে ইনপুট নেয়ার আগে “Please, Enter a number.” এই ধরনের একটা লাইন প্রিন্ট করে ইউজারের কাছ থেকে ইনপুট নিয়ে থাকি। কিন্তু যেকোন অনলাইন জাজে এই কাজটা করলে “Wrong Answer” verdict দেখাবে। এইসব ক্ষেত্রে যতটুকু কাজ করতে বলছে তার থেকে বেশি করলেই তোমার কোডকে ভুল বলবে। তোমাকে যদি যোগফল প্রিন্ট করতে বলে তাহলে যেভাবে প্রিন্ট করতে বলছে সেভাবেই করতে হবে। যেমন URI1001 প্রবলেমে দুইটা নাম্বারের যোগফল প্রিন্ট করতে হবে একটি X এরপরে সেপ্স দিয়ে একটা সমান চিহ্ন এরপর আরেকটা স্পেস এরপর যোগফলটা। ‘এক্স’ ক্যাপিটালের জায়গায় স্মল হলেই Wrong Answer বলবে। এইসব দিক ভালো করে লক্ষ্য করে প্রবলেমের সলিউশন সাবমিট করতে হবে। আরেকটা ব্যাপার হলো – জাভাতে কোড সাবমিশনের ক্ষেত্রে class name “Main” রাখতে হয় প্রায় প্রতিটা অনলাইন জাজেই। তাছাড়াও প্রতিটা অনলাইন জাজের নিজস্ব কিছু নিয়ম থাকে জাভাতে প্রবলেম সলভ করার ক্ষেত্রে যেমন class টা কি পাব্লিক হবে নাকি পাব্লিক উল্লেখ করা যাবে না এইসব।

Uri Online Judge এ ১০০ টার মতো প্রবলেম সলভ করতে পারলে তার বেসিক যথেষ্ট ক্লিয়ার হয়ে যাবে। লজিকালি চিন্তা করাও আগের তুলনায় ভালো হবে + কোডিং স্কিলও যথেষ্ট ভালো হবে। এরপর কি করবো?

এরপরের কাজটা হলো নতুন এল্গোরিদম/টেকনিক শিখতে শুরু করা। যেন আগের থেকে কঠিন কিছু প্রবলেম সলভ করা সম্ভব হয়। কারণ প্রোগ্রামিং দুনিয়ায় মানুষ বিভিন্ন ধরনের সমস্যার মুখোমুখি হইছে বিভিন্ন সময় – কোন একটা কাজ/চ্যালেঞ্জ কিভাবে সলভ করা যায় এফিসিয়েন্টলি। যা আগে সলভই করা যাচ্ছিল না, তার এখন একটা গতি হয়েছে। আর একটু কঠিন প্রবলেমগুলোর ক্ষেত্রে Time limit একটা খুব বড় বিষয় হয়ে দাঁড়ায়। তোমার কোডটা রান করে উত্তর জেনারেট করতে কত সময় নিচ্ছে? সেটা যদি এলাউড সময়ের চেয়ে বেশি হয় সেক্ষেত্রে তোমার “Time Limit Exceeded” verdict দিবে। তার মানে তোমার কোড যথেষ্ট এফিসিয়েন্ট না। আরো ভালোভাবে তাড়াতাড়ি এই প্রবলেম সলভ করা যায়।

নিচে কয়েকটা লিংক দিয়ে দিচ্ছে, কি কি শিখতে হবে কোথা থেকে শিখতে হবে –

১. শাফায়েতের ব্লগ – বাংলায় বেশ কিছু টিউটোরিয়াল পাওয়া যাবে এই সাইটে

২. An awesome list for competitive programming! – Father mother of all list. কি কি শিখতে হবে, কোথা থেকে শিখতে হবে,কোথায় কোথায় শেখা যায় – সকল প্রশ্নের সকল উত্তর এক পোস্টেই।

৩. Tushar Roy – এই ইউটিউব চ্যানেলে বেশ কিছু এল্গোরিদমের ভিডিও টিউটরিয়াল পাওয়া যাবে।

৪. HackerEarth – এইখানের প্র্যাকটিস সেকশনে ক্যাটাগরি,টপিক হিসেবে সবকিছু সাজানো + টিউটোরিয়াল আছে। সেই টিউটোরিয়াল পড়ে সেই জ্ঞান দিয়ে প্রবলেম সলভ করার সুযোগও আছে।

আর সি++ এর খুব বেসিক থেকে শেখার জন্য নেটে বহু আর্টিকেল তো অবশ্যই পাওয়া যাবে। তাছাড়াও এই ব্লগেই Catagories এ গিয়ে Tutorial সিলেক্ট করলেও কিছু টিউটোরিয়াল পাওয়া যাবে।

ধন্যবাদ 🙂

Advertisements

One thought on “Competitive Programming কিভাবে/কোথা থেকে শুরু করবো?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s