سلسلة حل المشكلات (Problem Sloving) اليوم العشرين

التحدي رقم 20 لليوم رقم 20 من رمضان

اولا
كل عام و انتم بخير و اعاده الله عليكم بالمن و بالخير و البركه
لا تنشغل بالحل كثيرا كي لا تهمل عباداتك الاصليه
و لا تنسي تجديد نيتك فأن طلب العلم عباده
لا تنسوني و اخي المعتقل سياسيا من جميل دعائكم

وصف التحدي :

متنساش تدعي لخواتنا ف غزه لو لسه عندك قلب و شوية دم

**مستوي التحدي : **
فوق متوسط (رياضيا+برمجيا)

قم بكتابة دالة اسمها: longestArithmeticSubstring تستقبل مصفوفة من الأعداد الصحيحة من نوع list[int]. تقوم هذه الدالة بإيجاد أطول سلسلة فرعية تكون متتالية وبفارق ثابت (متتابعة حسابية).
بمعنى أن الفارق بين كل عددين متتاليين في السلسلة الفرعية يجب أن يكون ثابتًا.

  • إذا كانت القائمة خالية أو تحتوي على عنصر واحد فقط، يمكن إعادة 0 كطول أطول سلسلة.
  • إذا وُجدت عدة سلاسل فرعية متساوية في الطول، يمكنك إعادة الاولي منهم.

ملحوظه : كلمة مصفوفة يعني ليست ← [,]

ملحوظه : تقدر تحل التحدي و تتحقق من صحته من خلال الموقع هنا اهو :
موقع سلسلة حل المشكلات (Problem Sloving)
بس خد بالك لو هتحل ع الموقع لازم اسم الداله يكون زي الاسم اللي موجود في وصف التحدي

أضغط لرؤية المخرجات المتوقعة عشان تتيست الكود بتاعك

الاختبار 1
المدخلات (Inputs)
arr = [1, 3, 5, 7, 9, 2, 4, 6, 8]
المخرجات (Outputs)
[1, 3, 5, 7, 9]

الاختبار 2
المدخلات (Inputs)
arr = [10, 7, 4, 1, -2, 0, 2, 4, 6]
المخرجات (Outputs)
[10, 7, 4, 1, -2]

الاختبار 3
المدخلات (Inputs)
arr = [5, 5, 5, 5, 5]
المخرجات (Outputs)
[5, 5, 5, 5, 5]

الاختبار 4
المدخلات (Inputs)
arr = [1, 2, 4, 7, 10, 13]
المخرجات (Outputs)
[4, 7, 10, 13]

حل التحدي

def longestArithmeticSubstring(nums):
    if len(nums) < 2:
        return []

    max_length = 0
    current_length = 2
    common_diff = nums[1] - nums[0]
    start_index = 0
    best_subarray = []

    for i in range(2, len(nums)):
        if nums[i] - nums[i - 1] == common_diff:
            current_length += 1
        else:
            if current_length > max_length:
                max_length = current_length
                best_subarray = nums[start_index:i]
            # لا نضيف السلسلة إذا كان طولها نفس طول السلسلة السابقة
            common_diff = nums[i] - nums[i - 1]
            current_length = 2
            start_index = i - 1

    if current_length > max_length:
        best_subarray = nums[start_index:]
        
    return best_subarray


إعجابَين (2)


ده الخرج اللي طلع معايا لما شغلت الكود اللي حضرتك كتبته و ده نفس الخرج اللي طلع معايا لما شغلت الكود اللي كتبته انا

إعجاب واحد (1)


و ده حلي و شكرا علي مراجعة الأفكار الجديدة

إعجابَين (2)

اسف معلش هعدل المخرجات في السؤال المخرجات اللي طلعالك هي الصح فعلا
معلش اعذروني لاني مضغوط جدا الفتره دي فا بكتب الحاجات بسرعه
اصلا كنت عايز اكتب ان دا هيكون اخر تحدي بس قولك لا انا وعدت انه 30 فا هحاول اكملهم 30 ان شاء الله
شكرا علي الملاحظه , الكود بتاعك هراجعه ان شاء الله بس مش دلوقت يعني

إعجاب واحد (1)

اسف معلش هعدل المخرجات في السؤال المخرجات اللي طلعالك هي الصح فعلا
معلش اعذروني لاني مضغوط جدا الفتره دي فا بكتب الحاجات بسرعه
اصلا كنت عايز اكتب ان دا هيكون اخر تحدي بس قولك لا انا وعدت انه 30 فا هحاول اكملهم 30 ان شاء الله
شكرا علي الملاحظه , الكود بتاعك هراجعه ان شاء الله بس مش دلوقت يعني

إعجابَين (2)

تصحيح كودك بالمره بقا :
هو ما شاء الله الكود جميل جدا بس ناقصه تركتين هيظبطوه و هيخلوا الموقع بتاعنا يطلعلك الحل صح لانك لو كتبته كدا الموقع هيقولك الحل غلط

اول حاجه نضيف الشرط دا :

if len(sequence) < 2:
    return []

عشان لو المصفوفه فيها اقل من عنصرين مش هيعرف يعمل العمليات اللي تحت فا هيطلعلك خطأ index out of range

و الحاجه التانيه في السطر دا :

max_sequence = current_sequence

انتي هنا في الحقيقة مش بتاخد نسخة جديدة من current_sequence لكن بتخلي max_sequence تشير لنفس العنوان في الذاكرة
بمعنى إنه لو حصل أي تعديل على current_sequence بعد كده التعديل ده هيأثر على max_sequence برضه وده مش المطلوب

لذلك ممكن نستخدم النسخ بالطريقة دي :

max_sequence = current_sequence[:]

لو مش فاهمه حاجه من اللي انا وضحته قوليلي اقولهاك بتفصيل ان شاء الله

الكود المتصلح هيبقي كدا :


def longest_arithmetic_list(sequence):
    if len(sequence) < 2:
        return []  # إرجاع قائمة فاضيه اذا احتوت المصفوفة على أقل من عنصرين

    current_sequence = [sequence[0], sequence[1]]
    max_sequence = []

    for i in range(2, len(sequence)):
        if sequence[i] - sequence[i - 1] == current_sequence[-1] - current_sequence[-2]:
            current_sequence.append(sequence[i])
        else:
            if len(current_sequence) > len(max_sequence):
                max_sequence = current_sequence[:]  # هنا ننسخ الليست بدل ما نشير اليها زي ما وضحنا فوق السبب 
            current_sequence = [sequence[i - 1], sequence[i]]

    if len(current_sequence) > len(max_sequence):
        max_sequence = current_sequence

    return max_sequence


إعجابَين (2)

تمام بحثت و فهمت حضرتك و شكرا علي المعلومة الجديدة بس انا عندي ملحوظة في الشرط بتاع
If len(sequence) أقل من 2 المفروض تكون أقل من أو يساوي لأن لو مفيش غير عنصرين مش هيكون فيه حاجة تقارن بيها الفرق ما بينهم ولا إيه رأي حضرتك

إعجابَين (2)

ملاحظه جميله و لكن رياضيا خطأ ليه ؟
لان رياضيا اي عددين ليهم فرق ثابت ينفع يكونوا متتابعة حسابيه ودا لأن أي عددين بيكوّنوا متتابعة حسابية بفارق ثابت بينهم فاهمه
و بتالي لو فيها عددين بس يبقي ينفع نعتبرها كلها كا اطول متتابعة حسابية موجودة

إعجابَين (2)

طب معلش هو فرق ثابت بالنسبة لايه إذا كان هو الفرق الوحيد الموجود

إعجاب واحد (1)

انتي عارفه يعني ايه مصفوفه او متتابعة حسابيه ؟
يعني ارقام بين القوسين دول [ , ] متسلسلين بطريقة او باخري
فاكر اكمل بنفس التسلسل بتاع ابتدائي مش كنا نشوف الرقم الاول زاد ولا قل بمقدار كام عن الرقم التاني و التاني عن التالت و كدا هو حرفيا المتتابعات هي كدا و بتالي لما يبقي المتتابعة فيها رقمين بس ف اقدر اطرح الرقمين من بعض و اقول انها متتابعة بحيث كل رقم اقل بمقدار الطرح من اللي بعده

هديكي مثال نفهم منه :

لو عندي متتابعة كدا : [5, 10]
دلوقت ناتج فرقهم او طرحهم : 10 - 5 = 5

اذا اقدر اقول انها متتابعه بحيث ان كل رقم بيزيد بمقدار 5 عن اللي قبله يهني لو قولتلك كملها بنفس التسلسل تقدر تكتب 15 هتبقي صح

فهمت الفكره و لا اوضح اكتر

انصحك لو عندك وقت فاضي راجع المصفوفات و التكامل و التفاضل بتاع ثانويه عامله لو انت مخلص ثانويه يعني لو لسه مخلصتش فا اما تسبقهم و تثقف نفسك بس الموضوع صعب مش سهل او تستني كدا كدا هتاخدها ان شاء الله

و بعد ما تخلص بتاع ثانوي ابقا شوف الناس الي بتشرح مجال التكامل و التفاضل لعلوم الحاسبوب علي يوتيوب مثلا :
قناة 1
قناة 2
او غيرهم بقا يعني

3 إعجابات

تمام فهمت شكرا لحضرتك و انا اصلا مهندسة و دراسه رياضة بس مجال شغلي مكنش قريب اوي من الرياضة كعلم فنسيت و شكرا كمان مرة علي تعب حضرتك معايا

إعجاب واحد (1)