التحدي رقم 29 لليوم رقم 29 من رمضان
اولا
كل عام و انتم بخير و اعاده الله عليكم بالمن و بالخير و البركه
بالامس كنا نقول رمضان اهلا و اليوم نقول رمضان مهلا فاللهم اغفر لنا ما مضي و اصلح لنا ما بقي واختم لنا رمضان بخير و انت راض عنا
و لا تنسي تجديد نيتك فأن طلب العلم عباده
لا تنسوني و اخي المعتقل سياسيا من جميل دعائكم في هذه الليالي العشر
وصف التحدي :
متنساش تدعي لخواتنا ف غزه لو لسه عندك قلب و شوية دم
**مستوي التحدي : **
اعلي من (متوسط برمجيا)
قُم بكتابة دالة اسمها: isInterleave
تستقبل ثلاث مُدخلات تحتوي قيم نصية A
, B
, C
. تقوم هذه الدالة بإرجاع القيمة True
فقط في حال كانت قيمة C
عبارة عن أجزاء مُرتبة من القيمتين A
و B
. في حال كانت القيمة C
تحتوي على جزء غير متواجد في القيمتين A
و B
، أو متواجد بترتيب لا يتوافق مع الترتيب الأصلي في A
و B
، تقوم الدالة بإرجاع القيمة False
.
مثال للتوضيح
A
= abc
, B
= dca
,C
= abdcca
عند التفصيل في القيمة C
نلاحظ أن القيمة ab
تم اجتزائها من A
، ومن ثم القيمة dc
اُجتزئت من B
، ومن ثم c
من A
مره أخرى، وأخيراً a
من B
. لا يهم الاجتزاء من أي قيمة يبدأ، ولا كمية الاجتزاء، المهم انه بنفس الترتيب المُتبع في القيمة الأصلية، ولا يزيد أو ينقص عن مجموع المتواجد في القيمتين A
و B
.
ملحوظه : تقدر تحل التحدي و تتحقق من صحته من خلال الموقع هنا اهو :
موقع سلسلة حل المشكلات (Problem Sloving)
بس خد بالك لو هتحل ع الموقع لازم اسم الداله يكون زي الاسم اللي موجود في وصف التحدي
أضغط لرؤية المخرجات المتوقعة عشان تتيست الكود بتاعك
الاختبار 1
المدخلات (Inputs)
A = ‘wysn’
B = ‘showus’
C = ‘shwysowuns’
المخرجات (Outputs)
true
الاختبار 2
المدخلات (Inputs)
A = ‘hsbxib’
B = ‘ywssg’
C = ‘hsywbxsisgb’
المخرجات (Outputs)
true
الاختبار 3
المدخلات (Inputs)
A = ‘zh2g’
B = ‘wts’
C = ‘shwt2gs’
المخرجات (Outputs)
false
الاختبار 4
المدخلات (Inputs)
A = ‘hsyhag’
B = ‘2b12’
C = ‘hsy2bhag1’
المخرجات (Outputs)
false
الاختبار 5
المدخلات (Inputs)
A = ‘USfMSU’
B = ‘5YgZ9N5mR6ppfggzbzh7HTox85MwFtaIQDHfzJW8vc2G’
C = ‘5YgUSZf9NM5SmR6Uppfggzbzh7HTox84MwFtaIQDHfzJW8vc2G’
المخرجات (Outputs)
false
حل التحدي
#29
def isInterleave(A, B, C):
# لو طول C مش بيساوي مجموع أطوال A و B، يبقى مستحيل يكونوا متداخلين
if len(C) != len(A) + len(B):
return False
memo = {} # لتخزين النتائج المؤقتة (i, j)
def dfs(i, j):
# لو وصلنا لنهاية A و B، يبقى نجحنا
if i == len(A) and j == len(B):
return True
# نشوف لو كنا حسبنا النتيجة قبل كده
if (i, j) in memo:
return memo[(i, j)]
k = i + j # المؤشر الحالي في C
ans = False
# لو الحرف الحالي في A هو نفسه الحرف الحالي في C، نجرب نكمل
if i < len(A) and A[i] == C[k]:
if dfs(i + 1, j):
ans = True
# لو ملقيناش حل من A، نجرب B
if not ans and j < len(B) and B[j] == C[k]:
if dfs(i, j + 1):
ans = True
memo[(i, j)] = ans
return ans
return dfs(0, 0)