Per provare a incoraggiare più vendite di libri diversi di una popolare serie di 5 libri, una libreria ha deciso di offrire sconti sull'acquisto di più copie.
Una copia di uno qualsiasi dei cinque libri costa $8.
Se però acquisti due libri diversi, ottieni uno sconto del 5% su quei due libri.
Se acquisti 3 libri diversi, ottieni uno sconto del 10%.
Se acquisti 4 libri diversi, ottieni uno sconto del 20%.
Se li acquisti tutti e 5, ottieni uno sconto del 25%.
Nota che se acquisti quattro libri, di cui 3 sono titoli diversi, ottieni uno sconto del 10% sui 3 che fanno parte di un gruppo, ma il quarto libro costa comunque $8.
La tua missione è scrivere il codice per calcolare il prezzo di qualsiasi cesto della spesa immaginabile (contenente solo libri della stessa serie), applicando lo sconto più grande possibile.
Per esempio, quanto costa questo cesto di libri?
Un modo di raggruppare questi 8 libri è:
Questo darebbe un totale di:
Il che dà come risultato:
Che equivale a $51.60.
Tuttavia, un modo diverso di raggruppare questi 8 libri è:
Questo darebbe un totale di:
Il che dà come risultato:
Che equivale a $51.20.
E $51.20 è il prezzo con lo sconto più grande.
Questo esercizio definisce un sottotipo chiamato Book, per i numeri naturali da 1 a 5.
Un sottotipo può essere pensato come una coppia ⟨x, h⟩, dove x è il valore e h è la prova della sua validità.
Si può accedere al valore all'interno di un sottotipo (x, in questo caso) usando .val, ad esempio x.val.
Si può accedere alla sua prova usando .property, ad esempio x.property.
Ad entrambi si può accedere anche tramite pattern matching, come al solito.
Iscriviti a Exercism per imparare e padroneggiare Lean con 100 esercizi e il mentoring di persone reali, tutto gratis.