Книгарня

Книгарня

Середня

Вказівки

Щоб заохотити до більших продажів різних книг із популярної серії з 5 книг, книгарня вирішила пропонувати знижки на купівлю кількох книг одночасно.

Один примірник будь-якої з пʼяти книг коштує $8.

Якщо ж ми купуємо дві різні книги, знижка на ці дві книги становить 5%.

Якщо ми купуємо 3 різні книги, знижка становить 10%.

Якщо ми купуємо 4 різні книги, знижка становить 20%.

Якщо ми купуємо всі 5, знижка становить 25%.

Зауважмо, що якщо ми купуємо чотири книги, з яких 3 різні за назвою, знижка 10% діє на ті 3, що утворюють набір, але четверта книга все одно коштує $8.

Ваше завдання - написати код, який обчислює ціну будь-якого можливого кошика покупця (що містить лише книги однієї серії) і дає якомога більшу знижку.

Наприклад, скільки коштує такий кошик книг?

  • 2 примірники першої книги
  • 2 примірники другої книги
  • 2 примірники третьої книги
  • 1 примірник четвертої книги
  • 1 примірник пʼятої книги

Ці 8 книг можна згрупувати, наприклад, так:

  • 1 група з 5 книг (1-ша, 2-га, 3-тя, 4-та, 5-та)
  • 1 група з 3 книг (1-ша, 2-га, 3-тя)

Це дало б такий підсумок:

  • 5 книг зі знижкою 25%
  • 3 книги зі знижкою 10%

Що дає:

  • 5 × (100% - 25%) × $8 = 5 × $6.00 = $30.00, плюс
  • 3 × (100% - 10%) × $8 = 3 × $7.20 = $21.60

Що дорівнює $51.60.

Однак ці самі 8 книг можна згрупувати й інакше:

  • 1 група з 4 книг (1-ша, 2-га, 3-тя, 4-та)
  • 1 група з 4 книг (1-ша, 2-га, 3-тя, 5-та)

Це дало б такий підсумок:

  • 4 книги зі знижкою 20%
  • 4 книги зі знижкою 20%

Що дає:

  • 4 × (100% - 20%) × $8 = 4 × $6.40 = $25.60, плюс
  • 4 × (100% - 20%) × $8 = 4 × $6.40 = $25.60

Що дорівнює $51.20.

І $51.20 - це ціна з найбільшою знижкою.

Примітки, специфічні для WebAssembly

Сигнатура функції для експорту WebAssembly total така:

(func (export "total")
    (param $basketOffset i32)
    (param $basketLength i32)
    (result i32)
)

Два параметри $basketOffset і $basketLength задають базове зміщення та довжину масиву 32-бітних цілих чисел. Параметр довжини вимірюється кількістю елементів у масиві, а не байтами. Перед викликом цієї функції код, який її викликає, записує цей масив у лінійну памʼять WebAssembly, починаючи зі зміщення $basketOffset. Лінійна памʼять WebAssembly завжди представлена в порядку little-endian.

Наприклад, код, який викликає функцію, закодував би кошик [1,2] як таку послідовність із восьми байтів.

| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
WebAssembly Exercism

Час розпочати Книгарня?

Зареєструйтеся на Exercism, щоб вивчати й опановувати WebAssembly, а також 87 вправ та справжнє наставництво від людей, і все це безкоштовно.