Para tentar incentivar mais vendas de títulos 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, você comprar dois livros diferentes, ganha 5% de desconto nesses dois livros.
Se você comprar 3 livros diferentes, ganha 10% de desconto.
Se você comprar 4 livros diferentes, ganha 20% de desconto.
Se você comprar os 5, ganha 25% de desconto.
Repare que, se você comprar quatro livros, dos quais 3 são títulos diferentes, ganha 10% de desconto nos 3 que formam um conjunto, mas o quarto livro ainda custa $8.
Sua missão é escrever código para calcular o preço de qualquer cesta de compras imaginável (contendo apenas livros da mesma série), dando o maior desconto possível.
Por exemplo, quanto custa esta cesta de livros?
Uma forma de agrupar esses 8 livros é:
Isso daria um total de:
Resultando em:
O que dá $51.60.
No entanto, outra forma de agrupar esses 8 livros é:
Isso daria um total de:
Resultando 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 WebAssembly total é a seguinte:
(func (export "total")
(param $basketOffset i32)
(param $basketLength i32)
(result i32)
)
Os dois parâmetros $basketOffset e $basketLength expressam o deslocamento base e o comprimento de um array de inteiros de 32 bits. O parâmetro de comprimento é medido em número de elementos do array, não em bytes. Antes de chamar essa função, o chamador grava esse array na memória linear do WebAssembly a partir do deslocamento $basketOffset. A memória linear do WebAssembly é sempre expressa em little-endian.
Por exemplo, o chamador codificaria a cesta [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,
Crie sua conta no Exercism para aprender e dominar WebAssembly com 87 exercícios e mentoria humana de verdade, tudo de graça.