মান লিজিয়ে আমরা একটি ডেটা স্ট্রাকচার ডেভেলপ করতে চাই যা এক্সপায়ার টাইম দিয়ে বিল্ড আপ হবে এবং একটি ফাংশন সাপোর্ট করবে যা ইউজার আইডি এবং একটি টাইমস্ট্যাম্প নিবে। এই ফাংশনটি চেক করবে যে দেওয়া ইউজার আইডি এবং টাইমস্ট্যাম্পে রিকোয়েস্ট ফেইল হবে কিনা। রিকোয়েস্টটি শুধু তখন ফেইল হবে যখন ইউজারটি এক্সপায়ার টাইমের কম সময় আগে সফল রিকোয়েস্ট করেছে থাকে।
উদাহরণস্বরূপ, ইনপুট যদি expire = 6 হয়, তবে একটি অবজেক্ট obj কন্সট্রাক্ট করুন এবং ফাংশনগুলো কল করুন: obj.limit(0,10), obj.limit(0,16), obj.limit(0,17) এবং obj.limit(1,20)। আউটপুট হবে False, False, True এবং False। কারণ ইউজার 0-র জন্য প্রাথমিক রিকোয়েস্ট ছিল না সেজন্য false, তারপর টাইম 16-এ এক্সপায়ার টাইম 6 লাস্ট রিকোয়েস্ট 10-র চেয়ে বড় নয়, কিন্তু 17-এ true, এবং লাস্ট রিকোয়েস্ট ইউজার 1-র জন্য সেজন্য প্রাথমিক রিকোয়েস্ট false।
এটি সমাধান করার জন্য নিচের ধাপগুলো অনুসরণ করব:
কন্সট্রাক্টর ডিফাইন করুন। এটি expire নিবে।
- lastCall := একটি ডিকশনারি তৈরি করুন যার ডিফল্ট ভ্যালু -1
- limit() ফাংশন ডিফাইন করুন। এটি uid, timestamp নিবে।
- last := lastCall[uid]
- যদি last == -1 বা (last + expire) <= timestamp হয়, তবে
- lastCall[uid] := timestamp
- False রিটার্ন করুন
- True রিটার্ন করুন
উদাহরণ
নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালো বুঝতে:
from collections import defaultdict
class RateLimit:
def __init__(self, expire):
self.expire = expire
self.lastCall = defaultdict(lambda: -1)
def limit(self, uid, timestamp):
last = self.lastCall[uid]
if last == -1 or last + self.expire <= timestamp:
self.lastCall[uid] = timestamp
return False
return True
expire = 6
obj = RateLimit(expire)
print(obj.limit(0,10))
print(obj.limit(0,16))
print(obj.limit(0,17))
print(obj.limit(1,20))ইনপুট
RateLimit(6) obj.limit(0,10) obj.limit(0,16) obj.limit(0,17) obj.limit(1,20)
আউটপুট
False False True False