DEV Community

Cover image for Competitive Programming
Shihab Mahamud
Shihab Mahamud

Posted on

Competitive Programming

Competitive Programming (CP) কি?

Competitive Programming (CP) হলো মানসিক খেলা যা ইন্টারনেট এবং স্থানীয় ভাবে অনুষ্ঠিত হয়। এখানে অংশ গ্রহন কারিদেরকে নির্দিষ্ট সংখ্যক সমস্যা দেওয়া হয়, নির্দিষ্ট সময়ে সমাধান করার জন্য। যে বা যে দল সব থেকে বেশি সমস্যা সমাধান করতে পারে বা দুই দল সমান সংখ্যক সমস্যা সমাধান করলে যারা আগে করতে পারে, তারা বিজয়ী হয়।

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

CP এবং Problem Solving এর মধ্যে পার্থক্য কি?

আনেকেই CP এবং Problem Solving কে একই জিনিস মনে করে। চিন্তাটা অনেকটা সত্য হলেও পুরোপুরি সত্য নয়। এই বিষয়টা একটি উদাহরনের মাধ্যেমে বুঝা যাক। ধরুন, আপনি বাইক কিনলেন, এখন আবশ্যই বাইক চালনো শিখবেন, বাইক চালানো শেখার পর আপনি নিয়মিত বাইক চালান। এখন আমি এই বাইক চালানো শেখা এবং নিয়মিত বাইক চালানোকে Problem Solving এর সাথে তুলনা করতে পারেন। তবে এখন প্রশ্ন আসে CP এখানে কোথায়? এখন যদি আপনি ঔ বাইকটা নিয়ে বিভিন্ন বাইক রেসিং প্রতিযোগিতায় অংশ নিতে যান তখন এটাকে তুলনা করা যায় CP এর সাথে। তাহলে একথায় বললে, Problem Solving হলো বাইক চালানো আর Competitive Programming হলো সেই বাইন নিয়ে Racing করা। এখন পাঠকের কাছে প্রশ্ন হচ্ছে, যে বাইক Racing করে তার বাইক চালানোর Skill কতোটা হবে।

উল্লেখযোগ্য Programming Contests:

উল্লেখযোগ্য Onsite প্রোগ্রামিং প্রোতিযােগিতা:

  1. Google Code Jam: 2003 থেকে Google এটি আয়োজন করে আসছে। এখানে বিজয়িকে 15 হাজার ডলার পুরস্কার দেয়া হয়। এটার ফাইনাল Google এর অফিসে হলেও বর্তমানে করোনা ভাইরাসের কারনে অনলাইনেই অনুষ্ঠিত হচ্ছে।
  2. Facebook Hacker Cup: 2011 সাল থেকে Facebook এটি আয়োজন করে আসছে।
  3. International Collegiate Programming Contest (ICPC): এটি University পর্যায়ের সব থেকে বড় প্রতিযােগিতা। এই প্রতিযােগিতায় অংশ নিতে হলে অবশ্যই তাকে University শিক্ষার্থী হতে হয় এবং তিনজনের টিম করতে হয়, সাথে থাকে একজন কোর্চ। এটিকে প্রোগ্রামিংয়ের বিশ্বকাপও বলা হয়।
  4. International Olympiad in Informatics (IOI): এটি হাই স্কুল পর্যায়ের প্রতিযােগিতা।

উল্লেখযোগ্য Online প্রোগ্রামিং প্রোতিযােগিতা:

  1. Codeforces: এটি বিশ্বের সব থেকে জনপ্রিয় Competitive Programming platform। এখানে প্রতি সপ্তাহেই contests থাকে। এই web site এর রেটিং ব্যবস্থা আছে। প্রতিটি কন্টেস্টের performance এর উপর ভিত্তি করে রেটিং বাড়ে কমে।
  2. Codechef: এটিও অন্যতম জনপ্রিয় platform। এটিরও Codeforces এর মত রেটিং সিস্টেম আছে।
  3. Atcoder: এটি একটি জাপানিজ web site। এখানে Beginner দের জন্য ভালো Contest হয়।
  4. LeetCode: এখানেও এখন সাপ্তাহিক কন্টেস্ট হয়। তবে এটি Interview preparation এর জন্য বেশি ব্যবহার করা হয়।

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

Competitive Programming শুরু করার জন্য পূর্বশর্ত হচ্ছে যেকোন একটি প্রোগ্রামিং ভাষার মৌলিক বিষয়গুলো (variable, data type, if else, loop, array, function) জানা। প্রোগ্রামিং ভাষার মৌলিক বিষয় জানা হয়ে গেলে এখন শুরু করতে হবে সমস্যা সমাধান (problem solving) করা। এখন প্রশ্ন হচ্ছে কোন Online Judge এ সমস্যা সমাধান করবো? যেকোন OJ তেই সমস্যা সমাধান করলে হয়, তবে আমি বলবো URI Online Judge থেকে শুরু করতে। এই OJ এর সমস্যা গুলো তুলনামূলক অনেক সহজ, এখানে অনুশীলন করলে প্রোগ্রামিং ভাষাটির উপর শক্ত ভিত্তি তৈরি হয়ে যাবে। এখানে কিছুদিন অনুশীলন করার পর বিভিন্ন OJ তে প্রচেস্টা করা যেতে পারে (যেমন: Codeforces, Codechef, Atcoder, LightOJ, etc.)। এই OJ গুলোতে 50-60 টি সমস্যা সমাধান করার পর শুরু করা উচিত Contest দেয়া। Competitive Programming করার আসল সাধ এর মাধ্যেমেই পাওয়া যাবে। এখন 150-200 সমস্যা সমাধান করা হয়ে গেলে Data Structure and Algorithm শেখা শুরু করা উচিত। এই পর্যন্ত কেউ আসতে পারলে এর পর কি করতে হবে তা অটোমেটিকই যেনে যাবে।

কিছু গুরুত্বপূর্ন Data Structure and Algorithm:

  • Binary Search
  • Sorting (Merge Sort, Quick Sort, etc)
  • Graph Theory (BFS/DFS, Shortest Part, Articulation Point, Max/Min Flow, etc)
  • Strings (KMP, Z Algorithm, Finite Automata, etc)
  • Greedy
  • Constructive Algorithm (Merge Sort logic, Two pointers, Backtracking, etc)
  • Dynamic Programming
  • Bit Manipulation
  • Game Theory
  • Number Theory
  • Stack, Queue, Link list
  • Tree, Segment Tree,
  • Heap and maps
  • Disjoint Set Union, Trie, etc

Learning Resources

Top comments (0)