Щоб заохотити до більших продажів різних книг із популярної серії з 5 книг, книгарня вирішила пропонувати знижки на купівлю кількох книг одночасно.
Один примірник будь-якої з пʼяти книг коштує $8.
Якщо ж ми купуємо дві різні книги, знижка на ці дві книги становить 5%.
Якщо ми купуємо 3 різні книги, знижка становить 10%.
Якщо ми купуємо 4 різні книги, знижка становить 20%.
Якщо ми купуємо всі 5, знижка становить 25%.
Зауважмо, що якщо ми купуємо чотири книги, з яких 3 різні за назвою, знижка 10% діє на ті 3, що утворюють набір, але четверта книга все одно коштує $8.
Ваше завдання - написати код, який обчислює ціну будь-якого можливого кошика покупця (що містить лише книги однієї серії) і дає якомога більшу знижку.
Наприклад, скільки коштує такий кошик книг?
Ці 8 книг можна згрупувати, наприклад, так:
Це дало б такий підсумок:
Що дає:
Що дорівнює $51.60.
Однак ці самі 8 книг можна згрупувати й інакше:
Це дало б такий підсумок:
Що дає:
Що дорівнює $51.20.
І $51.20 - це ціна з найбільшою знижкою.
Сигнатура функції для експорту 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,
Зареєструйтеся на Exercism, щоб вивчати й опановувати WebAssembly, а також 87 вправ та справжнє наставництво від людей, і все це безкоштовно.