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 ?
Une façon de regrouper ces 8 livres est la suivante :
Cela donnerait un total de :
Ce qui donne :
Ce qui fait 51,60 $.
Cependant, une autre façon de regrouper ces 8 livres est la suivante :
Cela donnerait un total de :
Ce qui donne :
Ce qui fait 51,20 $.
Et 51,20 $ est le prix avec la plus grosse remise.
Cet exercice définit un sous-type appelé Book, pour les entiers naturels de 1 à 5.
On peut voir un sous-type comme un couple ⟨x, h⟩, où x est la valeur et h la preuve de sa validité.
On peut accéder à la valeur contenue dans un sous-type (x, dans ce cas) en utilisant .val, par exemple x.val.
On peut accéder à sa preuve en utilisant .property, par exemple x.property.
On peut aussi accéder aux deux par filtrage par motif, comme d'habitude.
Inscris-toi sur Exercism pour apprendre et maîtriser Lean avec 100 exercices, et un vrai mentorat humain, le tout gratuitement.