মান लीজিয়ে আমরা একটি ইটেরেটর ক্লাস ডিফাইন করতে চাই যা রান-লেনথ এনকোডেড একটি লোয়ারকেস স্ট্রিং s দিয়ে কন্সট্রাক্ট করা হবে। এই ইটেরেটরের দুটি ফাংশন আছে:
- next() - এটি ইটেরেটরের পরবর্তী এলিমেন্ট খুঁজে বের করে
- hasnext() - এটি পরবর্তী এলিমেন্ট আছে কিনা তা চেক করে
উদাহরণস্বরূপ, ইনপুট যদি s = "2b1a" হয়, তবে s দিয়ে একটি অবজেক্ট কন্সট্রাক্ট করুন, তারপর next(), hasnext(), next(), next(), hasnext() কল করলে আউটপুট হবে "b", True, "b", "a", False।
এটি সমাধান করার জন্য নিচের ধাপগুলো অনুসরণ করব:
- একটি কন্সট্রাক্টর ডিফাইন করুন। এটি s নিবে।
- output := একটি নতুন তালিকা
- num := খালি স্ট্রিং
- s তালিকার প্রতিটি i এর জন্য:
- যদি i আলফাবেটিক হয়, তবে
- output-র শেষে num যোগ করুন
- output-র শেষে i যোগ করুন
- num := খালি স্ট্রিং
- অন্যথায়,
- num := num + i
- যদি i আলফাবেটিক হয়, তবে
- next() ফাংশন ডিফাইন করুন।
- যদি hasnext() true হয়, তবে
- count := output[0]
- letter := output[1]
- count := count - 1
- যদি count > 0 হয়, তবে
- output[0] := output[0] - 1
- অন্যথায়,
- output := output[২ থেকে শেষ]
- letter রিটার্ন করুন
- hasnext() ফাংশন ডিফাইন করুন।
- যদি output-র সাইজ ০ না হয়, তবে
- True রিটার্ন করুন
- False রিটার্ন করুন
উদাহরণ
নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালো বুঝতে:
class RunLengthIterator:
def __init__(self, s):
self.output = []
num = ""
for i in s:
if i.isalpha():
self.output.append(int(num))
self.output.append(i)
num = ""
else:
num += i
def next(self):
if self.hasnext():
count = self.output[0]
letter = self.output[1]
count -= 1
if count > 0:
self.output[0] -= 1
else:
self.output = self.output[2:]
return letter
def hasnext(self):
if len(self.output) != 0:
return True
return False
s = "2b1a"
obj = RunLengthIterator(s)
print(obj.next())
print(obj.hasnext())
print(obj.next())
print(obj.next())
print(obj.hasnext())ইনপুট
"2b1a" obj = RunLengthIterator(s) obj.next() obj.hasnext() obj.next() obj.next() obj.hasnext()
আউটপুট
b True b a False