প্রতিযোগিতামূলক প্রোগ্রামিং বলতে সাধারণত উপযুক্ত ডেটা স্ট্রাকচার ব্যবহার করে দক্ষ অ্যালগরিদম লিখাকে বোঝায়। এখানে প্রোগ্রামারদের দক্ষতা অনেক লেভেলে টেস্ট করা হয়।
অ্যালগরিদম এবং ডেটা স্ট্রাকচারের সাহায্যে আপনাকে একটি কাল্পনিক প্রোগ্রামিং সমস্যা সমাধান করতে হয় বিভিন্ন লজিক প্রয়োগ করে। আপনাকে শুধু সমস্যা সমাধান করতেই হবে না, বরং খুব দক্ষ সমাধান খুঁজে বের করতে হবে, যেটির ভালো টাইম এবং স্পেস কমপ্লেক্সিটি থাকে।
প্রতিযোগিতামূলক প্রোগ্রামিং সমস্যা স্টেটমেন্টের উদাহরণ হতে পারে:
আপনাকে একটি স্ট্রিং s দেওয়া আছে যার দৈর্ঘ্য n এবং এতে শুধু ছোট হাতের ল্যাটিন অক্ষর রয়েছে।
একটি স্ট্রিংয়ের সাবস্ট্রিং হলো সেই স্ট্রিংয়ের একটি সংলগ্ন সাবসিকোয়েন্স। তাই "forces" হলো "codeforces"-এর সাবস্ট্রিং, কিন্তু "coder" নয়।
আপনার কাজ হলো স্ট্রিংয় থেকে ঠিক একটি সাবস্ট্রিং রিমুভ করার কতটি উপায় আছে যাতে বাকি সব ক্যারেক্টার একই হয় (বিভিন্ন ক্যারেক্টার এর সংখ্যা শূন্য বা এক)।
গ্যারান্টি করা আছে যে s-এ কমপক্ষে দুটি ভিন্ন ক্যারেক্টার রয়েছে।
নোট করুন, আপনি পুরো স্ট্রিংটি রিমুভ করতে পারেন এবং সেটি সঠিক। আরো নোট করুন, আপনাকে কমপক্ষে একটি ক্যারেক্টার রিমুভ করতে হবে।
উপরের সমস্যা সমাধানের জন্য আপনি আপনার পছন্দের যেকোনো প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করতে পারেন।
এখন প্রশ্ন ওঠে, কেন প্রতিযোগিতামূলক কোডিং-এ পাইথন?
গতি (Speed)
পাইথন বেছে নেওয়ার একটি কারণ হলো এটি আপনার কোড লেখার সময় رادিক্যালি কমিয়ে দেয়, বরং আপনি প্রশ্নের জন্য প্রয়োজনীয় লজিক চিন্তা করতে সময় বয়চান।
এই ধরণের প্রতিযোগিতায় সময়ই মূল, প্রোগ্রামার যত দ্রুত সমাধান লিখতে পারেন তত ভালো। তাই এখানে গতি বলতে পাইথন ল্যাঙ্গুয়েজের গতি বোঝানো হয়নি, বরং প্রোগ্রামার কোড লেখার গতি।
বিশাল লাইব্রেরি সংগ্রহ
পাইথন বিপুল মাত্রায় স্ট্যান্ডার্ড লাইব্রেরির সাথে আসে এবং এগুলো প্রতিযোগিতামূলক প্রোগ্রামিং-এ খুব ভালোভাবে ব্যবহার করা যায়।
নিচে প্রতিযোগিতামূলক কোডিং-এ পাইথন বেছে নেওয়ার অন্যান্য সাধারণ কারণগুলো দেওয়া হলো:
i. সাধারণ বিল্ট-ইন ফাংশন:
- পাইথন count, min, max, sorted ইত্যাদি ਵぁっшы সেট অফ কমন ফাংশন প্রদান করে। এই বিল্ট-ইন ফাংশনগুলো খুব হ্যান্ডি, কোডারদের এই তुच্ছ প্রোসিজার্সের জন্য কোড লিখতে হয় না যেগুলো প্রায়শই খুব কাজে আসে। এছাড়া পাইথন ফাংশনগুলো তাদের ফাংশনগুলোর জন্য সেরা অ্যালগরিদম ব্যবহার করে। উদাহরণস্বরূপ, sorted() ফাংশন Timsort অ্যালগরিদম ব্যবহার করে, যা ওয়ার্স্ট কেসে O(nlogn)-এ স্টেবল সর্টিং প্রদান করে। এটি সেরা সর্টিং অ্যালগরিদমগুলোর একটি যা 베스트 কেসে O(1) বা কনস্ট্যান্ট রান টাইম দেয়।
কোড
#abs()
print(abs(-7))
#max()
print(max(2, 13, 4, 20))
#memoryview()
print(memoryview(bytes(9)))
#object()
o = object(); print(type(o))
#pow()
print(pow(2,6))
#reversed
a = reversed([3, 13, 2, 1]); print(a)
#sorted()
print(sorted([9, 2, 4, 13, 7]))
#sum()
print(sum([2, 9, 12, 19]))
# type()
print (type([]))
print (type({}))
#zip()
print(set(zip([1,2],[3,4,5])))
ii. লিস্ট কম্প্রিহেনশন (List Comprehensions):
- পাইথন সেরা লিস্ট কম্প্রিহেনশন প্রদান করে। এতে সাধারণত ৫-২০ লাইন লাগবে সেটি ১ লাইনে লেখা যায়। লিস্ট কম্প্রিহেনশনে নেস্টেড লুপ এবং কন্ডিশন থাকতে পারে।
কোড
# লিস্ট কম্প্রিহেনশন ব্যবহার করে স্ট্রিংয়ের মাধ্যমে ইটারেট করা l_string = [letter for letter in 'Tutorialspoint'] print(l_string) # লিস্ট কম্প্রিহেনশন বনাম ল্যাম্বডা ফাংশন l_lambda = list(map(lambda x: x, 'Tutorialspoint')) print(l_lambda)
আউটপুট
['T', 'u', 't', 'o', 'r', 'i', 'a', 'l', 's', 'p', 'o', 'i', 'n', 't'] ['T', 'u', 't', 'o', 'r', 'i', 'a', 'l', 's', 'p', 'o', 'i', 'n', 't']
iii. স্ট্যান্ডার্ড লাইব্রেরি (বড় সুবিধা):
- পাইথন খুব ব্যাপক স্ট্যান্ডার্ড লাইব্রেরির সাথে আসে, যেটি বিস্তৃত সুবিধা অফার করে। এই লাইব্রেরিগুলোতে বেশ কিছু ডেটা স্ট্রাকচার থাকে যা ম্যানুয়ালি ইমপ্লিমেন্ট করার প্রয়োজন নেই এবং itertools যেটি লাইব্রেরির খুব গুরুত্বপূর্ণ অংশ।
- উদাহরণস্বরূপ, আপনি একটি লিস্টের সকল সম্ভাব্য পারমুটেশন জেনারেট করতে চান এবং অন্য একটি লিস্টে স্টোর করতে চান, লিস্ট কম্প্রিহেনশন এবং itertools-এর permutation ফাংশন ব্যবহার করে।
পাইথন স্ট্যান্ডার্ড লাইব্রেরি
| Data types | strings | networking | threads |
| Operating System | compression | GUI | arguments |
| CGI | complex numbers | FTP | cryptography |
| testing | multimedia | databases | CSV files |
| calendar | XML | serialization |
iv. বিশাল পরিমাণ ডেটা স্ট্রাকচার:
- পাইথন কোডিং-এ ব্যবহার করার জন্য বড় সেট অফ ডেটা স্ট্রাকচার প্রদান করে, যার মধ্যে ডিকশনারি, সেট, টাপল, লিস্ট এবং আরও অনেক কিছু স্ট্যান্ডার্ড প্যাকেজ হিসেবে থাকে।
v. ব্যবহার সহজতা (Ease of use):
পাইথন সিনট্যাক্স মানব-পাঠযোগ্য এবং পাইথনে কোডিং খুব সহজ এবং দ্রুত। এটি মূলত সিউডোকোডের মত পড়া যায়।
>>> print("hello world!")
hello world!
>>> sum([3, 4, 3,5])
15
>>> max(3, 4, 5, 13,2)
13
>>> min(3, 4, 5, 13, 2)
2