لقد تم تعيينك للتو أستاذًا للرياضيات. سار أسبوعك الأول على ما يرام، لكن هناك شيء غريب في أسبوعك الثاني. المشكلة أن كل إجابة يقدّمها طلابك خاطئة! لحسن الحظ، مكّنتك مهاراتك في الرياضيات من تحديد المشكلة: إجابات الطلاب صحيحة فعلًا، لكنها جميعًا بالأساس 2 (الثنائي)! والمثير للدهشة أن الطلاب يستخدمون أساسًا مختلفًا كل أسبوع. ولمساعدتك على التحقق من إجابات الطلاب بسرعة، ستبني أداة للتحويل بين الأسس.
حوّل متتالية من الأرقام في أساس معيّن، تمثّل عددًا، إلى متتالية من الأرقام في أساس آخر، تمثّل العدد نفسه.
جرّب أن تنفّذ التحويل بنفسك. لا تستخدم شيئًا آخر للقيام بالتحويل نيابةً عنك.
في الترميز الموضعي، يمكن فهم عدد في الأساس b على أنه تركيبة خطية من قوى b.
العدد 42، في الأساس 10، يعني:
(4 × 10¹) + (2 × 10⁰)
العدد 101010، في الأساس 2، يعني:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
العدد 1120، في الأساس 3، يعني:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
نعم. هذه الأعداد الثلاثة أعلاه متطابقة تمامًا. تهانينا!
أحيانًا تحتاج إلى رفع استثناء. وعندما تفعل ذلك، ينبغي أن تُرفق دائمًا رسالة خطأ ذات معنى توضّح مصدر الخطأ. فهذا يجعل الكود أكثر قابلية للقراءة ويساعد كثيرًا في تصحيح الأخطاء. وإذا كنت تعرف أن مصدر الخطأ سيكون من نوع معيّن، فيمكنك اختيار رفع أحد أنواع الأخطاء المدمجة، لكن يجب أن تُرفق معه رسالة ذات معنى أيضًا.
يتطلب هذا التمرين تحديدًا أن تستخدم عبارة raise لـ"طرح" ValueError عند اختلاف أساس الإدخال وأساس الإخراج. ولن تنجح الاختبارات إلا إذا استخدمت raise مع exception وأرفقت به رسالة ذات معنى.
لرفع ValueError مع رسالة، اكتب الرسالة كوسيط لنوع exception:
# for input.
raise ValueError("input base must be >= 2")
# another example for input.
raise ValueError("all digits must satisfy 0 <= d < input base")
# or, for output.
raise ValueError("output base must be >= 2")
سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.