All Your Base

All Your Base

Середня

Вступ

Нас щойно найняли на посаду професора математики. Перший тиждень минув добре, але на другому тижні щось не так. Проблема в тому, що кожна відповідь, яку дають наші студенти, неправильна! На щастя, наші математичні навички допомогли нам зрозуміти, у чому річ: відповіді студентів справді правильні, але всі вони записані в системі з основою 2 (двійковій)! Дивовижно, але виявляється, що кожного тижня студенти використовують іншу основу. Щоб допомогти собі швидко перевіряти відповіді студентів, ми створимо інструмент для переведення між основами.

Вказівки

Перетворіть послідовність цифр в одній системі числення, що представляє число, на послідовність цифр в іншій системі числення, що представляє те саме число.

Note

Спробуйте реалізувати перетворення самостійно. Не використовуйте щось інше, щоб виконати перетворення за вас.

Про позиційну систему числення

У позиційній системі числення число з основою 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

Сигнатура функції для експорту 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 завжди подається у порядку 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 вправ та справжнє наставництво від людей, і все це безкоштовно.