All Your Base

All Your Base

متوسط

مقدمه

شما همین تازه به عنوان استاد ریاضیات استخدام شده‌اید. هفته‌ی اول خوب پیش رفت، اما در هفته‌ی دوم یک جای کار می‌لنگد. مشکل این است که هر پاسخی که دانشجویانتان می‌دهند غلط است! خوشبختانه مهارت‌های ریاضی‌تان به شما کمک کرده تا مشکل را پیدا کنید: پاسخ‌های دانشجویان درست هستند، اما همه‌شان در مبنای ۲ (دودویی) نوشته شده‌اند! شگفت‌آور است که معلوم شده هر هفته دانشجویان از مبنای دیگری استفاده می‌کنند. برای اینکه بتوانید سریع پاسخ‌های دانشجویان را بررسی کنید، ابزاری می‌سازید که بین مبناها تبدیل انجام می‌دهد.

دستورالعمل‌ها

دنباله‌ای از رقم‌ها در یک مبنا را، که نماینده‌ی یک عدد است، به دنباله‌ای از رقم‌ها در مبنای دیگر تبدیل کنید، به‌گونه‌ای که نماینده‌ی همان عدد باشد.

Note

تبدیل را خودتان پیاده‌سازی کنید. برای انجام تبدیل، از راه دیگری استفاده نکنید.

درباره‌ی نمایش مکانی

در نمایش مکانی، یک عدد در مبنای b را می‌توان به‌صورت ترکیب خطی توان‌های b فهمید.

عدد ۴۲، در مبنای ۱۰، یعنی:

(4 × 10¹) + (2 × 10⁰)

عدد ۱۰۱۰۱۰، در مبنای ۲، یعنی:

(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)

عدد ۱۱۲۰، در مبنای ۳، یعنی:

(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)

بله. آن سه عدد بالا دقیقاً یکسان‌اند. تبریک!

نکته‌های مخصوص WebAssembly

امضای تابع برای خروجی WebAssembly یعنی convert به شرح زیر است:

(func (export "convert")
    (param $arrOffset i32)
    (param $arrLength i32)
    (param $inputBase i32)
    (param $outputBase i32)
    (result i32 i32 i32)
)

دو پارامتر اول $arrOffset و $arrLength، آفست پایه و طول یک آرایه از اعداد صحیح ۳۲بیتی علامت‌دار را بیان می‌کنند. پارامتر طول بر حسب تعداد عناصر آرایه بیان می‌شود، نه بر حسب بایت. پیش از فراخوانی این تابع، فراخوانی‌کننده این آرایه را در حافظه‌ی خطی WebAssembly، از آفست $arrOffset به بعد می‌نویسد. حافظه‌ی خطی WebAssembly همیشه به‌صورت little-endian بیان می‌شود.

بنابراین فراخوانی‌کننده آرایه‌ی [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 است که برای مدیریت خطا به کار می‌رود.

اگر مقدار بازگشتی سوم بیانگر یک حالت خطا باشد، آزمون‌های واحد دو مقدار بازگشتی اول را نمی‌خوانند.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
WebAssembly Exercism

آماده‌اید All Your Base را شروع کنید؟

در Exercism ثبت‌نام کنید تا WebAssembly را همراه با 87 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.