اولا
كل عام و انتم بخير و اعاده الله عليكم بالمن و بالخير و البركه
بالامس كنا نقول رمضان اهلا و اليوم نقول رمضان مهلا فاللهم اغفر لنا ما مضي و اصلح لنا ما بقي واختم لنا رمضان بخير و انت راض عنا
و لا تنسي تجديد نيتك فأن طلب العلم عباده
لا تنسوني و اخي المعتقل سياسيا من جميل دعائكم في هذه الليالي العشر
وصف التحدي :
متنساش تدعي لخواتنا ف غزه لو لسه عندك قلب و شوية دم
**مستوي التحدي : ** متوسط برمجيا
قم بكتابة دالة اسمها: convert_number_format التي تستقبل متغيرًا من نوع string يحتوي على رقم إما بنظام العد الثنائي (binary) أو النظام العشري (decimal).
الدالة يجب أن تقوم بتحديد نوع الرقم (هل هو عشري أم ثنائي) ثم تعكس تنسيقه.
إذا كان الرقم بنظام العد الثنائي، تقوم بتحويله إلى النظام العشري.
إذا كان الرقم بنظام العد العشري، تقوم بتحويله إلى النظام الثنائي.
الدالة تُرجع القيمة المعكوسة للنظام العددي المدخل
ملحوظه : تقدر تحل التحدي و تتحقق من صحته من خلال الموقع هنا اهو : موقع سلسلة حل المشكلات (Problem Sloving)
بس خد بالك لو هتحل ع الموقع لازم اسم الداله يكون زي الاسم اللي موجود في وصف التحدي
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"
لا يوجد طريقة لمعرفة ما اذا كان هذا الرقم 1001 بالنظام الثنائي ام بالنظام العشري إلا اذا قمت انت بتحديد ذلك
فهذا الرقم يصح ان يكون من النظام العشري و من النظام الثنائي معاً
لا
الرقم اللي انت عاطي بيه المثال تمام ماشي انما في العادي تقدر تعرف بعض الارقام يعني
زي ان النظام الثنائي مفهوش الا 0 و 1 و بتالي اي رقم هيبقي فيه حاجه غيرهم هيبقي غير ثنائي
بس فا انت اغمل الداله لو الرقم بيتكون من 0 و 1 بس يبقي اكيد ثنائي
ودا بسبب ان التحدي بيقول كدا ( بمعني كلامك ينطبق علي الحياه العاديه بس في حالة حل المشكله دي كلامك غير دقيق ! ليه ؟ عشان في الطبيعي انت كا مبرمج لما بيطلب منك دالة ليها مهمه خاصه فا اكيد انا مش هستخدم الداله دي في كل حاجه بل للمهمه دي بس بعمني ان طلاما نص التحدي علي ان المدخل اما ثنائي او عشري فااذا اي رقم مش هيتكون الا من 1 و 0 فهو 100 ف 100 ثنائي )
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)
ولو أنا هعمل نسخة من غير تسهيلات بايثون غالباً هتكون بعد العيد إن شاء الله.
هذه الدالة تقوم بتحويل الرقم من النظام العشري الى الثنائي:
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))
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 ههه
الجزء بعد الإصلاح :
for char in string:
if char in ["1","0"]:
valid = True
else:
valid = False
break