Livraria

Livraria

Médio

Instruções

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?

  • 2 exemplares do primeiro livro
  • 2 exemplares do segundo livro
  • 2 exemplares do terceiro livro
  • 1 exemplar do quarto livro
  • 1 exemplar do quinto livro

Uma forma de agrupar esses 8 livros é:

  • 1 grupo de 5 (1º, 2º, 3º, 4º, 5º)
  • 1 grupo de 3 (1º, 2º, 3º)

Isso daria um total de:

  • 5 livros com 25% de desconto
  • 3 livros com 10% de desconto

Resultando em:

  • 5 × (100% - 25%) × $8 = 5 × $6.00 = $30.00, mais
  • 3 × (100% - 10%) × $8 = 3 × $7.20 = $21.60

O que dá $51.60.

No entanto, outra forma de agrupar esses 8 livros é:

  • 1 grupo de 4 livros (1º, 2º, 3º, 4º)
  • 1 grupo de 4 livros (1º, 2º, 3º, 5º)

Isso daria um total de:

  • 4 livros com 20% de desconto
  • 4 livros com 20% de desconto

Resultando em:

  • 4 × (100% - 20%) × $8 = 4 × $6.40 = $25.60, mais
  • 4 × (100% - 20%) × $8 = 4 × $6.40 = $25.60

O que dá $51.20.

E $51.20 é o preço com o maior desconto.

Subtipos

Este exercício define um Subtipo chamado Book, para os números naturais de 1 a 5. Um Subtipo pode ser pensado como um par ⟨x, h⟩, em que x é o valor e h é a prova de sua validade.

O valor dentro de um Subtipo (x, neste caso) pode ser acessado usando .val, por exemplo, x.val. Sua prova pode ser acessada usando .property, por exemplo, x.property. Os dois também podem ser acessados por pattern matching, como de costume.

Editar via GitHub O link abre em uma nova janela ou aba
Lean Exercism

Tudo pronto para começar Livraria?

Crie sua conta no Exercism para aprender e dominar Lean com 100 exercícios e mentoria humana de verdade, tudo de graça.