لقد تم تعيينك للتو أستاذًا للرياضيات. سار أسبوعك الأول على ما يرام، لكن هناك شيء غريب في أسبوعك الثاني. المشكلة أن كل إجابة يقدّمها طلابك خاطئة! لحسن الحظ، مكّنتك مهاراتك في الرياضيات من تحديد المشكلة: إجابات الطلاب صحيحة فعلًا، لكنها جميعًا بالأساس 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⁰)
نعم. هذه الأعداد الثلاثة أعلاه متطابقة تمامًا. تهانينا!
توقيع الدالة لتصدير WebAssembly المسمى convert هو كما يلي:
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
المعاملان الأولان $arrOffset و$arrLength يعبّران عن إزاحة الأساس وطول مصفوفة من الأعداد الصحيحة الموقّعة ذات 32 بت. معامل الطول يُقاس بعدد العناصر في المصفوفة، وليس بالبايتات. قبل استدعاء هذه الدالة، يكتب المستدعي هذه المصفوفة في ذاكرة WebAssembly الخطية بدءًا من الإزاحة $arrOffset. يُعبَّر عن ذاكرة WebAssembly الخطية دائمًا بترتيب النهاية الصغرى.
وهكذا يشفّر المستدعي المصفوفة [1,2] على هيئة تسلسل البايتات الثمانية التالي.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
المعاملان $inputBase و$outputBase لا يتعلقان بالذاكرة الخطية.
نوع النتيجة هو (i32 i32 i32). القيمتان الأوليان هما offset وlength لمخرجاتك في الذاكرة الخطية. إذا اخترت ذلك، يمكنك الكتابة فوق عناوين الذاكرة الخطية المستخدمة للإدخال. القيمة الثالثة المُرجَعة هي رمز حالة من نوع i32 يُستخدم لمعالجة الأخطاء.
إذا عبّرت القيمة الثالثة المُرجَعة عن حالة خطأ، فإن اختبارات الوحدة لا تقرأ القيمتين المُرجَعتين الأوليين.
سجّل في Exercism لتتعلّم وتتقن WebAssembly عبر 87 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.