Para tentar incentivar mais vendas de livros diferentes de uma popular série de 5 livros, uma livraria decidiu oferecer descontos na compra de vários livros.
Um exemplar de qualquer um dos cinco livros custa $8.
Se, no entanto, comprares dois livros diferentes, recebes um desconto de 5% nesses dois livros.
Se comprares 3 livros diferentes, recebes um desconto de 10%.
Se comprares 4 livros diferentes, recebes um desconto de 20%.
Se comprares os 5, recebes um desconto de 25%.
Repara que, se comprares quatro livros, dos quais 3 são títulos diferentes, recebes um desconto de 10% nos 3 que fazem parte de um conjunto, mas o quarto livro continua a custar $8.
A tua missão é escrever código que calcule o preço de qualquer cesto de compras imaginável (que contenha apenas livros da mesma série), dando o maior desconto possível.
Por exemplo, quanto custa este cesto de livros?
Uma forma de agrupar estes 8 livros é:
Isto daria um total de:
O que resulta em:
O que dá $51.60.
No entanto, há outra forma de agrupar estes 8 livros:
Isto daria um total de:
O que resulta em:
O que dá $51.20.
E $51.20 é o preço com o maior desconto.
A assinatura da função para a exportação total do WebAssembly é a seguinte:
(func (export "total")
(param $basketOffset i32)
(param $basketLength i32)
(result i32)
)
Os dois parâmetros $basketOffset e $basketLength indicam o deslocamento base e o comprimento de um array de inteiros de 32 bits. O parâmetro de comprimento é expresso em número de elementos do array, e não em bytes. Antes de chamar esta função, quem a chama escreve este array na memória linear do WebAssembly, começando no deslocamento $basketOffset. A memória linear do WebAssembly é sempre expressa em little-endian.
Por exemplo, quem chama a função codificaria o cesto [1,2] como a seguinte sequência de oito bytes.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Inscreve-te no Exercism para aprenderes e dominares WebAssembly com 87 exercícios, e mentoria humana real, tudo grátis.