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

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

اولا
كل عام و انتم بخير و اعاده الله عليكم بالمن و بالخير و البركه

بالامس كنا نقول رمضان اهلا و اليوم نقول رمضان مهلا فاللهم اغفر لنا ما مضي و اصلح لنا ما بقي واختم لنا رمضان بخير و انت راض عنا

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

وصف التحدي :

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

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

قم بكتابة دالة اسمها: convert_number_format التي تستقبل متغيرًا من نوع string يحتوي على رقم إما بنظام العد الثنائي (binary) أو النظام العشري (decimal).
الدالة يجب أن تقوم بتحديد نوع الرقم (هل هو عشري أم ثنائي) ثم تعكس تنسيقه.

  • إذا كان الرقم بنظام العد الثنائي، تقوم بتحويله إلى النظام العشري.
  • إذا كان الرقم بنظام العد العشري، تقوم بتحويله إلى النظام الثنائي.
  • الدالة تُرجع القيمة المعكوسة للنظام العددي المدخل

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

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

الاختبار 1
المدخلات (Inputs)
number = “1010”
المخرجات (Outputs)
“10”

الاختبار 2
المدخلات (Inputs)
number = “1101”
المخرجات (Outputs)
“13”

الاختبار 3
المدخلات (Inputs)
number = “255”
المخرجات (Outputs)
“11111111”

الاختبار 4
المدخلات (Inputs)
number = “xyz”
المخرجات (Outputs)
“Invalid input”

حل التحدي بمميزات بايثون

def convert_number_format_binary(s):
    if all(c in '01' for c in s):
        return str(int(s, 2))
    elif s.isdigit():
        return bin(int(s))[2:]
    else:
        return "Invalid input"

حل التحدي بدون استخدام مميزات بايثون
def is_binary(s):
    i = 0
    while i < len(s):
        if s[i] != '0' and s[i] != '1':
            return False
        i += 1
    return True

def is_decimal(s):
    i = 0
    while i < len(s):
        if not ('0' <= s[i] <= '9'):
            return False
        i += 1
    return True

def binary_to_decimal(binary):
    decimal = 0
    power = 1
    i = len(binary) - 1
    while i >= 0:
        decimal += (ord(binary[i]) - ord('0')) * power
        power *= 2
        i -= 1
    result = ""
    while decimal > 0:
        result = chr((decimal % 10) + ord('0')) + result
        decimal //= 10
    return result if result else "0"

def decimal_to_binary(decimal):
    num = 0
    i = 0
    while i < len(decimal):
        num = num * 10 + (ord(decimal[i]) - ord('0'))
        i += 1
    if num == 0:
        return "0"
    binary = ""
    while num > 0:
        binary = chr((num % 2) + ord('0')) + binary
        num //= 2
    return binary

def convert_number_format_binary(s):
    if is_binary(s):
        return binary_to_decimal(s)
    elif is_decimal(s):
        return decimal_to_binary(s)
    else:
        return "Invalid input"

6 إعجابات

لا يوجد طريقة لمعرفة ما اذا كان هذا الرقم 1001 بالنظام الثنائي ام بالنظام العشري إلا اذا قمت انت بتحديد ذلك
فهذا الرقم يصح ان يكون من النظام العشري و من النظام الثنائي معاً

5 إعجابات

لا
الرقم اللي انت عاطي بيه المثال تمام ماشي انما في العادي تقدر تعرف بعض الارقام يعني
زي ان النظام الثنائي مفهوش الا 0 و 1 و بتالي اي رقم هيبقي فيه حاجه غيرهم هيبقي غير ثنائي

بس فا انت اغمل الداله لو الرقم بيتكون من 0 و 1 بس يبقي اكيد ثنائي
ودا بسبب ان التحدي بيقول كدا ( بمعني كلامك ينطبق علي الحياه العاديه بس في حالة حل المشكله دي كلامك غير دقيق ! ليه ؟ عشان في الطبيعي انت كا مبرمج لما بيطلب منك دالة ليها مهمه خاصه فا اكيد انا مش هستخدم الداله دي في كل حاجه بل للمهمه دي بس بعمني ان طلاما نص التحدي علي ان المدخل اما ثنائي او عشري فااذا اي رقم مش هيتكون الا من 1 و 0 فهو 100 ف 100 ثنائي )

اتمني تكون فهمت فكره حل المشكلات

5 إعجابات

الحل :

def birany_convert (converting, type_text = "Auto"):
    convert_to_binary = lambda decimal: format (int(decimal), "b") if decimal.isdigit () else "Invalid input"
    convert_from_binary = lambda binary: int(binary, 2) if set(converting).issubset({'0', '1'}) else "Invalid input"
    if type_text == "Auto": type_text = "Binary" if set(converting).issubset({'0', '1'}) else "Decimal"
    return str(convert_to_binary(converting) if type_text == "Decimal" else convert_from_binary(converting)) if converting.isdigit () else "Invalid input"

الحل فيه ميزة إنك تقدر تخصص نوع المدخل عشان نتجنب المشكلة بتاعت إن رقم زي (1100) هو رقم ثنائي وفي نفس الوقت عشري، وفي قيمة إفتراضية ليها لو لم يتم التحديد وهي (Auto)

ولو أنا هعمل نسخة من غير تسهيلات بايثون غالباً هتكون بعد العيد إن شاء الله.

وكل عام وأنتم بخير :heart:

5 إعجابات

هذه الدالة تقوم بتحويل الرقم من النظام العشري الى الثنائي:

def binary_system (number):
    binary_number = ""
    while True:
        binary_number += str (number %2)
        number = number // 2
        if number == 0:
            break 
    return binary_number [::-1]



print (binary_system (100))

و هذه الدالة تقوم بتحويل الرقم من النظام الثنائي الى العشري:

def decimal_system (number):
    number = str (number)[::-1]
    decimal = 0
    power = 0
    for i in number:
        decimal += (int(i)*(2**power))
        power += 1
    return decimal 
print (decimal_system (1000))        
        

هذا الحل بدون تسهيلات بايثون

4 إعجابات

حاولت أحل المشكل وحدي فلم أستطع , جئت للحل للي انت كاتبه فلم أفهم فيه شيئا … ياريت تشرح الدالتين الأثنتين حتى أخذ فكرة على طريقة الحل

4 إعجابات

ابحث علي اليوتيوب عن كيفية تحويل رقم من النظام العشري الى النظام الثنائي بطريقة القسمة ثم سوف تفهم كيفية عمل الدالة

و عن طريقة تحويل رقم من النظام الثنائي الى العشري بطريقة الضرب

لاني استغرقت وقت حتى افهم طريقة التحويل بين النظام العشري و الثنائي و بعدها قمت بتمثيل خطوات التحويل باوامر برمجية

3 إعجابات

حدا عندو فكرة عن الثيم او السمة اللي حاطها المستر ابراهيم عاوز نفسها :upside_down_face: (اللي بتلون الكود :moai::new_moon_face:)

إعجابَين (2)

إعجابَين (2)


و ده حل بدون تسهيلات بايثون

إعجابَين (2)

الحل مظبوت لاكن فيه مشكلة صغيرة في الجزء ده :

for char in string:
    if char in ["1","0"]:
        valid = True 
    else:
        valid = False

المشكلة هي إن لو string كان يساوي مثلا “61”، هيحصل لوب، هيشوف هل (6) في (1,0)؟ الناتج (لا)، اذا سيجعل قيمة valid يساوي False، ثم سيعيد نفس الشيء في الرقم التالي (1)، هيشوف هل 1 في (1,0)؟ الناتج (نعم)، اذا سيجعل قيمة valid يساوي True، وثم يتوقف اللوب لان السلسلة النصية انتهت. عندما يكمل تنفيذ باقي الكود سيعتبر أن العدد هو عدد ثنائي لأن valid يساوي True وهذا غير صحيح!
ما الحل؟ الحل هو إضافة break عندما يكون الرقم ليس في (1, 0).

أنا كتبت كل ده عشان اقول نضيف break ههه :joy:

الجزء بعد الإصلاح :

for char in string:
    if char in ["1","0"]:
        valid = True 
    else:
        valid = False
        break 
إعجابَين (2)