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

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

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

وصف التحدي :

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

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

قم بكتابة دالة اسمها: longestAlternatingSubstring تستقبل قيمة نصية من نوع string. تقوم هذه الدالة بإيجاد أطول سلسلة فرعية بالتناوب بين أعداد فردية وأعداد زوجية. والمعنى من ذلك أن يجب ان تكون السلسلة مكونة من عدد زوجي ويتليه عدد فردي.. ولا يشترط في ذلك ان تبدأ السلسلة بعدد زوجي. فمن الممكن أن تبدأ بعدد زوجي أو فردي.

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

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

الاختبار 1
المدخلات (Inputs)
digits = ‘2105787220351146’
المخرجات (Outputs)
‘2105’

الاختبار 2
المدخلات (Inputs)
digits = ‘1263654081858902’
المخرجات (Outputs)
‘8185890’

الاختبار 3
المدخلات (Inputs)
digits = ‘334090830025543’
المخرجات (Outputs)
‘090’

الاختبار 4
المدخلات (Inputs)
digits = ‘6769423178839463’
المخرجات (Outputs)
‘67694’

حل التحدي

def longestAlternatingSubstring(digits):
    max_substring = ""
    current_substring = digits[0]

    for i in range(1, len(digits)):
        if (int(digits[i-1]) % 2 == 0 and int(digits[i]) % 2 == 1) or (int(digits[i-1]) % 2 == 1 and int(digits[i]) % 2 == 0):
            current_substring += digits[i]
        else:
            if len(current_substring) > len(max_substring):
                max_substring = current_substring
            current_substring = digits[i]

    if len(current_substring) > len(max_substring):
        max_substring = current_substring

    return max_substring


7 إعجابات

سؤال معلش في الاختبار الثاني ليه الخرج مش 1263654
رغم أن دول سبع ارقام زي دول و الارقام اللي كتبتها انا جت الاول

3 إعجابات

عشان السلسه اللي المفروض تطلع لازم تكون رقم فردي او زوجي بعده عكسه بعده عكسه و هكذا
اما اللي انتي كاتباها :
1
بعده
2
لحد هنا تمام
بس بعد الا 2 في 6 يعني زوجي وراه زوجي

هو تحدي رخم صراحة

3 إعجابات


كان حلو التحدي ده بس مش اصعب من بتاع يوم 16

4 إعجابات

لا بالعكس دا اصعب من بتاع 16, للاسف حلك غلط حاولي تاني

4 إعجابات

طب ايه الغلط اللي فيه انا جربت كل الاختبارات و طالعة مظبوطة

إعجابَين (2)
  1. طريقة توليد السلاسل الفرعية:
    أنتي بتولدي كل السلاسل الفرعية الممكنة بغض النظر عن طولها وبعدين بتشيكي على كل سلسلة لو فيها التناوب المطلوب … الطريقة دي منطقها صح لكن فيها مجهود زيادة لأننا بنشيك على سلاسل فرعية صغيرة حتى لو هي جزء من سلسلة أطول صحيحة
  2. اختيار السلسلة النهائية:
    المفروض إنك بتدوري على أطول سلسلة متناوبة لكن بسبب وجود سلاسل فرعية متداخلة ممكن ما توصلش للحل الأمثل لو ركزتي على التنقل مباشرةً على السلسلة الأساسية والتحقق منها بشكل متتالي هتضمن تجيبي أطول سلسلة متناوبة بشكل مباشر

اما عن تخريج الاوتبوت الصح بتاع ال 4 اختبارات فا دا عادي ممكن نخرجه لو عملنا داله نقولها لو لقيت المدخل كذا اعمل ريتيرن لكذا بمعني انهم مش عشان تتشيك الكود بس عشان تتشيك طريقة فهمك فا ممكن الكود يكون مظبوط بالصدفه مع دول اما مع مدخلات تانيه يبقي مش مظبوط زي مثلا المدخل دا :

9876543210

هيطلعلنا الاوتبوت دا :

987654321

غلي الرغم من انه دا :

9876543210
4 إعجابات

بص دا تعديل كودك عشان يبقي مظبوط ان شاء الله :



def longest_substring(s):
    substrings = []
    candidates = []

    # تعديل 1: خلت البداية من i + 2 بدل i + 1 
    # عشان نتأكد إن السلسلة الفرعية طولها على الأقل 2، لأن سلسلة طولها 1 مش هتنفع متناوبة
    for i in range(len(s)):
        for j in range(i + 2, len(s) + 1):  # تعديل هنا لتبدأ من طول 2 بدلًا من 1
            substrings.append(s[i:j])

    for substring in substrings:
        valid = True
        for i in range(1, len(substring)):
            if (int(substring[i]) % 2 == 1 and int(substring[i-1]) % 2 == 0) or (int(substring[i]) % 2 == 0 and int(substring[i-1]) % 2 == 1):
                continue
            else:
                valid = False
                break
        if valid:
            candidates.append(substring)

    # تعديل: التأكد من وجود سلاسل قبل محاولة العثور على الأطول
    # تعديل 2: اتأكدنا الأول إن فيه سلاسل (candidates) قبل ما نستخدم max()
    # لأن لو السلاسل فاضيين هتطلع غلطة، فبنرجع "" في الحالة دي
    if candidates:
        return max(candidates, key=len)
    else:
        return ""
        


4 إعجابات

تمام فهمت حضرتك المفروض بدل ما اعمل loop علي الsubstrings الصغيرة اعمله علي string الاصلي و احقق الشرط هجرب تاني و إن شاء الله يظبط

4 إعجابات

هو فيه حاجه كمان نسيت اقولها في الكود اللي انا كتبته هو هيطلع اطول string لاني قلت key=len فكدا أعتقد أنه مش هيكون جزء من سلسلة اطول ولا ايه راي حضرتك مع الأخذ في الاعتبار طبعا أنه ايوا هي فيها مجهود زيادة

4 إعجابات

اه فعلا عند حق ما شاء الله

5 إعجابات

معلش تاعبه حضرتك معايا بس ياريت تفهمني ايه الفرق ما بين استخدام continue و pass في الكود ده و بعتذر لو كنت مثقلة علي حضرتك و ده هيكون اخر سؤال إن شاء الله

4 إعجابات

تااع

[details=“اضغط هنا للاختبار”]
اختبار اخفاء نصوص
اختبار
تل
هلهل[/details]

3 إعجابات

شرحهم الاستاذ إبراهيم قبل كدا
ابحثي على اليوتيوب عن حلقة بعنوان continue and break

Pass دي أمرها سهل شوفيها من مصدر تاني

3 إعجابات

انا لسه شايف السؤال دلوقت والله عشان جالي اشعار حد عملي لايك .
اولا اسألي براحتك عادي انا كدا كدا مش بفتح الموقع الا لما اكون فاضي اني ارد او اعمل بوست و كدا

الفرق بينهم :
ال continue بتستخدم داخل الحلقات for او while
و الغرض منها هي تخطي حلقه واحده مثلا عشان نفهم :

for i in range(5):
    if i == 2:
        continue 
    print(i)

هنا كدا لما ياجي عند الرقم 2 هيلاقيني عامله كونتينيو يعني بقوله تخطي الحلقه اللي انت فيها و هات اللي بعدها
يعني اكني بقوله حرفيا لما تلاقي الرقم 2 ارجع كمل اللوب و فكك من اللي تحتها

يعني الناتج هيبقي كدا :

0
1
3
4

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

def ex():
    pass

هنا عملت ايه الطبيعي اني مينفعش اسيب الفراغ بتاع الداله كدا بدوون اي تعليمات فا هيروح عالمي ايرور لما اجي اجرب الكود حتي لو مش هستخدم الفانكشن دي في التيست بتاعي
وهنا بقا ياجي دورها انها بتملئ الفراغ دا عشان ميطلعلكش ايرور وانت بتيست الكود مثلا
بنستخدمها :
لما بكون مثلا حسب الخطة بتاعة الابلكيشن اللي هعمله عندي 3 فانكشنز فا بروح عشان منساش : اعمل التلاته
و اكتب تحت كل واحده فيهم pass عشان لو مكتبتش حاجه الكود هيبقي فيه ايرور و انا اكيد مثلا هبقي عايز اتيست الكود بدون ما اكتب الفانكشنز اللي تحت بمعني اني بستخدمها لما يبقي عندي في سطر معين فيه فراغ و المفروض حسب السينتاكس بتاع اللغه انه ميبقاش هنا في فراغ و انا مش عايز بايثون يديله اهتمام فا بقوله تخطي الفراغ السينتاكسي دا

فاهمه الفرق ؟

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

و البالمناسبه بقا ال break
و دي شغاله زي ال كونتينيو بس الكونتينيو بتخلي الكود يتخطاها و يكمل بعدها ( الحلقه اللي بعدها يعني ) اما البريك بتوقف تنفيذ كل الحلقات من بعد الشرط اللي انت حاطه يعني لما خدنا نفس مثال فوق و بدل كونتينيو كتبنا بريك هيطبع
0
1
بس مش هيطبع اي حاجه تاني

و في الاخير أكد انك ابقا اسأل عادي معنديش مشكله ممكن بس ابقا ادعيلي ربنا يظبطلي دنيتي كدا و يفك كرب و اسر اخويا مش عايز اكتر من كدا

5 إعجابات

والله بدعيلكم انتم الاثنين في صلاة القيام ربنا يفك كربه و يوفق حضرتك و يرزقكم خير الدنيا والآخرة يارب

إعجابَين (2)