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

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

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

وصف التحدي :

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

**مستوي التحدي : **
اعلي من متوسط برمجيا

قُم بكتابة دالة اسمها: similarOrdered تستقبل قيمتين نصية. تقوم الدالة بترتيب القيمتين النصية أبجدياً وإرجاع أطول حد تشابه بين القيمتين النصية . يتم أيضاً إزالة الأحرف المكررة في حد التشابه والإكتفاء بحرف واحد. في حال لم يُوجد تشابه بين القيمتين النصية، سيتم إرجاع القيمة No matches found .

اضغط لرؤية مثال لتتضح الفكره

word1= xcbacbwdwa , word2 = xcefwdfecxd
تقوم الدالة بترتيب هذه الكلمتين أبجدياً وحذف الحروف المتكررة منها لتصبح
word1=abcdwx , word2=cdefwx
ستقوم الدالة بإرجاع أطول أول تشابه بين الكلمتين هذه cd . نلاحظ تم تجاهل التشابه wx لأن التشابه ac ظهر قبله.

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

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

الاختبار 1
المدخلات (Inputs)
word1 = ‘washing’
word2 = ‘waiting’
المخرجات (Outputs)
‘ag’

الاختبار 2
المدخلات (Inputs)
word1 = ‘me’
word2 = ‘meet’
المخرجات (Outputs)
‘em’

الاختبار 3
المدخلات (Inputs)
word1 = ‘Reem’
word2 = ‘Nouf’
المخرجات (Outputs)
‘No matches found’

الاختبار 4
المدخلات (Inputs)
word1 = ‘abcdefggghi’
word2 = ‘abcdefghirr’
المخرجات (Outputs)
‘abcdefghi’

حل التحدي
def similarOrdered(word1,word2):
    def process(word):
        """
        الداله دي بترجع الكلمه بعد ما تظبطها من تحويل لحروف صغيره و ترتيبها ابجديا و مسح للتكرار 
        """
        return "".join(sorted(set(word.lower())))
    
    s1 = process(word1)
    s2 = process(word2)
    
    max_sub = ""
    for i in range(len(s1)):
        for j in range(i + 1, len(s1) + 1):
            candidate = s1[i:j]
            if candidate in s2:
                if len(candidate) > len(max_sub):
                    max_sub = candidate
    return max_sub if max_sub else "No matches found"

4 إعجابات

الحل :

def similar_ordered(str1, str2):
    str1, str2 = "".join(sorted(set(str1.lower()))), "".join(sorted(set(str2.lower())))
    return max((str1[i:j] for i in range(len(str1)) for j in range(i + 1, len(str1) + 1) if str1[i:j] in str2), key=len, default="No matches found")
إعجاب واحد (1)

def similar_ordered(word1,word2):
word1_list=
word2_list=
substrings_list=
match=
longest_substrings=

for char in word1:
word1_list.append(char)
for char in word2:
word2_list.append(char)

word1_list=list(set(word1_list))
word2_list=list(set(word2_list))

word1_list.sort()
word2_list.sort()
w1=“”.join(word1_list)
w2=“”.join(word2_list)

for i in range(len(w1)):
for j in range(i+1,len(w1)+1):
substrings_list.append(w1[i:j])

for substring in substrings_list:
if substring in w2:
match.append(substring)
if match:
longest=max(match,key=len)
for l in longest:
longest_substrings.append(l)

  longest_substrings=list(set(longest_substrings))
  pure_longest="".join(longest_substrings)
  return pure_longest[::-1]

else:
q=“No matches found”
return q

print(similar_ordered(“me”,“meet”))

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

كانت مشكلة صعبة فعلا النهارده بس سؤال هل لو فيه فكرا معينة معرفتش اكودها لوحدي و بحثت علشان اشوف تتكود ازاي ده غلط ولا عادي اني يكون فيه حاجات مش عارفه اكودها لوحدي

إعجابَين (2)

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

3 إعجابات

بص اول حاجة عملتها خدت الكلمتين و حطيت كل كلمة في list و رتبتهم و شلت الحروف المكررة في كل كلمة و الlists دي هي word 1_list و word2_list

تاني حاجة عملت join لل lists دي في W1 و w2

ثالث حاجة عملت nested loop علشان تطلع كل المقاطع الممكنة من الكلمة الأولي و حطيتهم في substrings _list و دي الخطوة اللي معرفتش نهائي اعملها لوحدي

رابع حاجة عملت for loop علي substrings _list و حطيت جوالها شرط أنه لو المقطع موجود في الكلمة التانية يحطه في الlist اللي اسمها match

خامس حاجة حطيت if else لو ال match فيها مقاطع استخدمت دالة max علشان اطلع اطول مقطع و حطيت اطول مقطع ده في list قسمته لحروف و طبقت عليه أمر set علشان اتأكد أنه مفيش تكرار ثم عملتله join تاني و عكسته و رجعته
و لو match فاضيه هيرجع ليا no matches found

إعجابَين (2)

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

3 إعجابات

انا طبقت set في الاخر علشان أشيل التكرار من المقطع الاطول

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

انا زودت أمر sort بعد امر set الاخير علشان يترتبوا و شلت الreverse اللي في ال return لأن فعلا كان احيانا الخرج يطلع بدون ترتيب

إعجابَين (2)