التحدي رقم 22 لليوم رقم 22 من رمضان
اولا
كل عام و انتم بخير و اعاده الله عليكم بالمن و بالخير و البركه
كنا نقول اهلا و الان وداعا يا شهر الخير و العباده
و لا تنسي تجديد نيتك فأن طلب العلم عباده
لا تنسوني و اخي المعتقل سياسيا من جميل دعائكم في هذه الليالي العشر
وصف التحدي :
متنساش تدعي لخواتنا ف غزه لو لسه عندك قلب و شوية دم
**مستوي التحدي : **
فوق متوسط (رياضيا+برمجيا)
قم بكتابة دالة اسمها: longestPrimeDiffSubarray
تستقبل مصفوفة arr
من الأعداد الصحيحة من نوع list[int]
. تقوم الدالة بإيجاد أطول سلسلة فرعية متجاورة (subarray) بحيث يكون الفرق المطلق بين كل عنصرين متتاليين عددًا أوليًا.
ملحوظات :
إذا كانت القائمة الداخله فارغة تعيد الدالة قائمة فارغة.
إذا كانت القائمة تحتوي على عنصر واحد فقط يمكن إعادة القائمة كما هي.
إذا وجدت أكثر من سلسلة فرعية بنفس الطول الأقصى تعيد الدالة أول سلسلة فرعية تظهر في القائمة.
يُمكن اعتبار سلسلتين مكونتين من عنصرين صحيحيتين إذا تحققت العلاقة بينهما.
ملحوظه : كلمة مصفوفة يعني ليست ← [,]
ملحوظه : كلمة
سلسلة فرعية متجاورة (subarray)
يعني العناصر اللي في السلسله لازم يكونوا متسلسلسين نفس تسلسل الي موجودين فيه في المصفوفه الاصليه :
مثال :
المثال علي ال subarray
لو عندي مصفوفه :
[1,2,3,4,5]
فا اقدر اقول علي كل من :
[1,2]
[1,2,3]
[1,2,3,4]
[1,2,3,4,5]
[2,3,4,5]
[2,3,4]
[2,3]
[3,2,1]
انهم مسلسه subarray
وهكذا
انما مثلا ال :
[2,4,5]
مينفعش نقول عليها subarray
ليه ؟
لانه مش مترتبين الترتيب اللي في المصفوفه الاصليه بحيث انهم هنا متخطين الرقم 3
خد بالك هتعمل دالتين
ملحوظه : تقدر تحل التحدي و تتحقق من صحته من خلال الموقع هنا اهو :
موقع سلسلة حل المشكلات (Problem Sloving)
بس خد بالك لو هتحل ع الموقع لازم اسم الداله يكون زي الاسم اللي موجود في وصف التحدي
أضغط لرؤية المخرجات المتوقعة عشان تتيست الكود بتاعك
الاختبار 1
المدخلات (Inputs)
arr = [17, 19, 23, 28, 31, 37]
المخرجات (Outputs)
[23, 28, 31]
الاختبار 2
المدخلات (Inputs)
arr = [2, 3, 5, 7, 11, 13, 17]
المخرجات (Outputs)
[3, 5, 7]
الاختبار 3
المدخلات (Inputs)
arr = [30, 31, 33, 37, 42, 47, 53]
المخرجات (Outputs)
[37, 42, 47]
الاختبار 4
المدخلات (Inputs)
arr = [10, 13, 16, 19, 22, 25, 28]
المخرجات (Outputs)
[10, 13, 16, 19, 22, 25, 28]
حل التحدي
def is_prime(n):
""" دالة تتحقق مما إذا كان العدد n أوليًا """
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def longestPrimeDiffSubarray(arr):
""" دالة لإيجاد أطول سلسلة فرعية يكون الفرق بين عناصرها عددًا أوليًا اللي هي دالة الحل يعني"""
if not arr:
return []
max_subarray = []
current_subarray = [arr[0]]
for i in range(1, len(arr)):
# تحقق من كون الفرق بين العنصر الحالي والسابقة أوليا
if is_prime(abs(arr[i] - arr[i - 1])):
current_subarray.append(arr[i])
else:
if len(current_subarray) > len(max_subarray):
max_subarray = current_subarray[:] # حفظ نسخة من السلسلة الحالية
current_subarray = [arr[i]]
if len(current_subarray) > len(max_subarray):
max_subarray = current_subarray
return max_subarray