Para intentar fomentar más ventas de diferentes libros de una popular serie de 5 libros, una librería ha decidido ofrecer descuentos en la compra de varios libros a la vez.
Un ejemplar de cualquiera de los cinco libros cuesta 8 $.
Sin embargo, si compras dos libros diferentes, obtienes un descuento del 5 % en esos dos libros.
Si compras 3 libros diferentes, obtienes un descuento del 10 %.
Si compras 4 libros diferentes, obtienes un descuento del 20 %.
Si compras los 5, obtienes un descuento del 25 %.
Ten en cuenta que si compras cuatro libros, de los cuales 3 son títulos diferentes, obtienes un descuento del 10 % en los 3 que forman parte de un conjunto, pero el cuarto libro sigue costando 8 $.
Tu misión es escribir código que calcule el precio de cualquier cesta de la compra imaginable (que solo contenga libros de la misma serie), aplicando el mayor descuento posible.
Por ejemplo, ¿cuánto cuesta esta cesta de libros?
Una forma de agrupar estos 8 libros es:
Esto daría un total de:
Lo que da como resultado:
Lo que equivale a 51,60 $.
Sin embargo, hay otra forma de agrupar estos 8 libros:
Esto daría un total de:
Lo que da como resultado:
Lo que equivale a 51,20 $.
Y 51,20 $ es el precio con el mayor descuento.
La firma de la función exportada total de WebAssembly es la siguiente:
(func (export "total")
(param $basketOffset i32)
(param $basketLength i32)
(result i32)
)
Los dos parámetros $basketOffset y $basketLength expresan el desplazamiento base y la longitud de un array de números enteros de 32 bits. El parámetro de longitud se mide en número de elementos del array, no en bytes. Antes de llamar a esta función, el código que la llama escribe este array en la memoria lineal de WebAssembly comenzando en el desplazamiento $basketOffset. La memoria lineal de WebAssembly siempre se expresa en little-endian.
Por ejemplo, el código que llama codificaría la cesta [1,2] como la siguiente secuencia de ocho bytes.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Regístrate en Exercism para aprender y dominar WebAssembly con 87 ejercicios y mentoría humana real, todo gratis.