نفّذ ترميز الكمية المتغيرة الطول وفك ترميزها.
هدف هذا التمرين هو تنفيذ ترميز VLQ وفك ترميزه.
باختصار، هدف هذا الترميز هو ترميز قيم صحيحة بطريقة توفّر البايتات. أول 7 بتات فقط من كل بايت هي ذات دلالة (محاذاة إلى اليمين؛ نوعًا ما مثل بايت ASCII). لذلك، إذا كانت لديك قيمة بطول 32 بت، فعليك تفكيكها إلى تسلسل من البايتات ذات 7 بتات. بالطبع، سيكون لديك عدد متغير من البايتات اعتمادًا على العدد الصحيح الذي لديك. لتحديد آخر بايت في التسلسل، تترك البت رقم 7 مساويًا للصفر. وفي كل البايتات السابقة، تضبط البت رقم 7.
إذن، إذا كان العدد الصحيح بين 0-127، فيمكن تمثيله ببايت واحد.
على الرغم من أن VLQ يمكنه التعامل مع أعداد بأحجام اعتباطية، فإننا في هذا التمرين سنقتصر على الأعداد التي تتسع لها قيمة صحيحة بدون إشارة بطول 32 بت فقط.
فيما يلي أمثلة على أعداد صحيحة كقيم بطول 32 بت، والكميات المتغيرة الطول التي تقابلها:
NUMBER VARIABLE QUANTITY
00000000 00
00000040 40
0000007F 7F
00000080 81 00
00002000 C0 00
00003FFF FF 7F
00004000 81 80 00
00100000 C0 80 00
001FFFFF FF FF 7F
00200000 81 80 80 00
08000000 C0 80 80 00
0FFFFFFF FF FF FF 7F
أحيانًا يلزمك رفع استثناء. وعندما تفعل ذلك، ينبغي أن تُضمّن دائمًا رسالة خطأ ذات معنى تشير إلى مصدر الخطأ. فهذا يجعل الكود أكثر قابلية للقراءة ويساعد كثيرًا في تصحيح الأخطاء. أما في الحالات التي تعرف فيها أن مصدر الخطأ سيكون من نوع معيّن، فيمكنك أن تختار رفع أحد أنواع الأخطاء المضمّنة، لكن يجب أن تُضمّن معه رسالة ذات معنى.
هذا التمرين تحديدًا يتطلب منك استخدام عبارة الرفع لـ"طرح" ValueError إذا كان التسلسل المراد فك ترميزه أو ترميزه غير مكتمل. ولن تنجح الاختبارات إلا إذا استخدمت raise مع exception وأدرجت معه رسالة.
ولرفع ValueError مع رسالة، اكتب الرسالة كوسيط لنوع exception:
# if the sequence is incomplete
raise ValueError("incomplete sequence")
سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.