التحدي رقم 26 لليوم رقم 26 من رمضان
اولا
كل عام و انتم بخير و اعاده الله عليكم بالمن و بالخير و البركه
بالامس كنا نقول رمضان اهلا و اليوم نقول رمضان مهلا فاللهم اغفر لنا ما مضي و اصلح لنا ما بقي واختم لنا رمضان بخير و انت راض عنا
و لا تنسي تجديد نيتك فأن طلب العلم عباده
لا تنسوني و اخي المعتقل سياسيا من جميل دعائكم في هذه الليالي العشر
وصف التحدي :
متنساش تدعي لخواتنا ف غزه لو لسه عندك قلب و شوية دم
**مستوي التحدي : **
متوسط برمجيا ← برمجة ديناميكية
نص ما قبل التحدي :
خلال شهر رمضان، تُقام حملات تبرعات في أوقات مختلفة من اليوم لدعم المشاريع الخيرية. في بعض الأحيان، تتداخل هذه الفترات الزمنية أو تتلاصق، مما يجعل من الصعب معرفة إجمالي الوقت الذي تظل فيه حملات التبرعات نشطة دون احتساب الوقت المكرر.
نص التحدي
قم بكتابة دالة اسمها: calculateActiveDonationMinutes
تستقبل مصفوفة من الفترات الزمنية، حيث يتم تمثيل كل فترة على شكل سلسلة نصية بصيغة "start-end"
. هنا يمثل start
و end
الدقائق التي تبدأ وتنتهي فيها الحملة بعد منتصف الليل.
على سبيل المثال، إذا كانت إحدى الفترات هي "60-120"
وأخرى "110-180"
, فينبغي دمجهما ليصبحا فترة واحدة تمتد من الدقيقة 60 إلى الدقيقة 180، بحيث لا يتم احتساب الدقيقة المشتركة مرتين.
مثال عملي
مثال 1
- المدخلات:
مصفوفة الفترات:["60-120", "110-180"]
- العملية:
- الفترة الأولى تغطي الدقائق من 60 إلى 120 (60 دقيقة).
- الفترة الثانية تغطي الدقائق من 110 إلى 180 (70 دقيقة).
- عند الدمج، تكون الفترة المشتركة من الدقيقة 110 إلى 120، لذا تصبح الفترتان مدمجتين إلى فترة واحدة تمتد من 60 إلى 180 دقيقة.
- الناتج:
إجمالي الدقائق النشطة = 180 - 60 = 120 دقيقة.
مثال 2
- المدخلات:
مصفوفة الفترات:['60-120', '130-150']
- العملية:
- الفترة الأولى تغطي الدقائق من 60 إلى 120 (60 دقيقة).
- الفترة الثانية تغطي الدقائق من 130 إلى 150 (20 دقيقة).
- هنا لن ندمغ الفترتين لانهما لم يتشاركوا في اي فترة .
- الناتج:
إجمالي الدقائق النشطة = 20 + 60 = 80 دقيقة.
ملحوظه : كلمة مصفوفة يعني ليست ← [,]
ملحوظه : تقدر تحل التحدي و تتحقق من صحته من خلال الموقع هنا اهو :
موقع سلسلة حل المشكلات (Problem Sloving)
بس خد بالك لو هتحل ع الموقع لازم اسم الداله يكون زي الاسم اللي موجود في وصف التحدي
أضغط لرؤية المخرجات المتوقعة عشان تتيست الكود بتاعك
الاختبار 1
المدخلات (Inputs)
intervals = [‘60-120’]
المخرجات (Outputs)
60
الاختبار 2
المدخلات (Inputs)
intervals = [‘60-120’, ‘110-180’]
المخرجات (Outputs)
120
الاختبار 3
المدخلات (Inputs)
intervals = [‘60-120’, ‘130-150’]
المخرجات (Outputs)
80
الاختبار 4
المدخلات (Inputs)
intervals = [‘0-30’, ‘25-50’, ‘45-60’]
المخرجات (Outputs)
60
حل التحدي
def calculateActiveDonationMinutes(intervals):
# بنحول الفترات النصية لأزواج أرقام
intervals = [list(map(int, interval.split('-'))) for interval in intervals]
# بنرتب الفترات حسب البداية
intervals.sort(key=lambda x: x[0])
# مصفوفة عشان نحفظ الفترات اللي دمجناها
merged_intervals = []
for start, end in intervals:
# لو مفيش تداخل مع اخر فترة مدمجة يبقي هنضيف فترة جديدة
if not merged_intervals or start > merged_intervals[-1][1]:
merged_intervals.append([start, end])
else:
# لو في تداخل أو الفترات لازقة في بعض يبقي نعمل دمج ليهم
merged_intervals[-1][1] = max(merged_intervals[-1][1], end)
#هنا بنحسب إجمالي الوقت النشط
active_minutes = sum(end - start for start, end in merged_intervals)
return active_minutes