Librairie

Librairie

Moyen

Instructions

Pour tenter d'encourager les ventes des différents livres d'une série à succès en cinq tomes, une librairie a décidé d'accorder des remises sur l'achat de plusieurs livres.

Un exemplaire de l'un des cinq livres coûte 8 $.

Si, en revanche, tu achètes deux livres différents, tu bénéficies d'une remise de 5 % sur ces deux livres.

Si tu achètes 3 livres différents, tu bénéficies d'une remise de 10 %.

Si tu achètes 4 livres différents, tu bénéficies d'une remise de 20 %.

Si tu achètes les 5, tu bénéficies d'une remise de 25 %.

Note que si tu achètes quatre livres dont 3 sont des titres différents, tu bénéficies d'une remise de 10 % sur les 3 qui font partie d'un même ensemble, mais le quatrième livre coûte toujours 8 $.

Ta mission est d'écrire du code pour calculer le prix de n'importe quel panier d'achat imaginable (ne contenant que des livres de la même série), en accordant la remise la plus importante possible.

Par exemple, combien coûte ce panier de livres ?

  • 2 exemplaires du premier livre
  • 2 exemplaires du deuxième livre
  • 2 exemplaires du troisième livre
  • 1 exemplaire du quatrième livre
  • 1 exemplaire du cinquième livre

Une façon de regrouper ces 8 livres est la suivante :

  • 1 groupe de 5 (1er, 2e, 3e, 4e, 5e)
  • 1 groupe de 3 (1er, 2e, 3e)

Cela donnerait un total de :

  • 5 livres avec une remise de 25 %
  • 3 livres avec une remise de 10 %

Ce qui donne :

  • 5 × (100 % - 25 %) × 8 $ = 5 × 6,00 $ = 30,00 $, plus
  • 3 × (100 % - 10 %) × 8 $ = 3 × 7,20 $ = 21,60 $

Ce qui fait 51,60 $.

Cependant, une autre façon de regrouper ces 8 livres est la suivante :

  • 1 groupe de 4 livres (1er, 2e, 3e, 4e)
  • 1 groupe de 4 livres (1er, 2e, 3e, 5e)

Cela donnerait un total de :

  • 4 livres avec une remise de 20 %
  • 4 livres avec une remise de 20 %

Ce qui donne :

  • 4 × (100 % - 20 %) × 8 $ = 4 × 6,40 $ = 25,60 $, plus
  • 4 × (100 % - 20 %) × 8 $ = 4 × 6,40 $ = 25,60 $

Ce qui fait 51,20 $.

Et 51,20 $ est le prix avec la plus grosse remise.

Notes spécifiques à WebAssembly

La signature de la fonction pour l'export WebAssembly total est la suivante :

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

Les deux paramètres $basketOffset et $basketLength expriment le décalage de base et la longueur d'un tableau d'entiers 32 bits. Le paramètre de longueur est exprimé en nombre d'éléments du tableau, et non en octets. Avant d'appeler cette fonction, l'appelant écrit ce tableau dans la mémoire linéaire de WebAssembly à partir du décalage $basketOffset. La mémoire linéaire de WebAssembly est toujours exprimée en little-endian.

Par exemple, l'appelant encoderait le panier [1,2] sous la forme de la séquence de huit octets suivante :

| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
WebAssembly Exercism

Prêt à commencer Librairie ?

Inscris-toi sur Exercism pour apprendre et maîtriser WebAssembly avec 87 exercices, et un vrai mentorat humain, le tout gratuitement.