Για να ενθαρρύνει τις πωλήσεις διαφορετικών βιβλίων από μια δημοφιλή σειρά 5 βιβλίων, ένα βιβλιοπωλείο αποφάσισε να προσφέρει εκπτώσεις σε αγορές πολλών βιβλίων.
Ένα αντίτυπο από οποιοδήποτε από τα πέντε βιβλία κοστίζει $8.
Αν όμως αγοράσεις δύο διαφορετικά βιβλία, παίρνεις έκπτωση 5% σε αυτά τα δύο βιβλία.
Αν αγοράσεις 3 διαφορετικά βιβλία, παίρνεις έκπτωση 10%.
Αν αγοράσεις 4 διαφορετικά βιβλία, παίρνεις έκπτωση 20%.
Αν αγοράσεις και τα 5, παίρνεις έκπτωση 25%.
Σημείωσε ότι αν αγοράσεις τέσσερα βιβλία, από τα οποία τα 3 είναι διαφορετικοί τίτλοι, παίρνεις έκπτωση 10% στα 3 που αποτελούν μέρος ενός σετ, αλλά το τέταρτο βιβλίο κοστίζει ακόμα $8.
Η αποστολή σου είναι να γράψεις κώδικα που να υπολογίζει την τιμή οποιουδήποτε νοητού καλαθιού αγορών (που περιέχει μόνο βιβλία της ίδιας σειράς), δίνοντας τη μεγαλύτερη δυνατή έκπτωση.
Για παράδειγμα, πόσο κοστίζει αυτό το καλάθι με βιβλία;
Ένας τρόπος να ομαδοποιήσεις αυτά τα 8 βιβλία είναι:
Αυτό θα έδινε ένα σύνολο:
Δηλαδή:
Που ισούται με $51.60.
Ωστόσο, ένας διαφορετικός τρόπος να ομαδοποιήσεις αυτά τα 8 βιβλία είναι:
Αυτό θα έδινε ένα σύνολο:
Δηλαδή:
Που ισούται με $51.20.
Και τα $51.20 είναι η τιμή με τη μεγαλύτερη έκπτωση.
Αυτή η άσκηση ορίζει έναν Υποτύπο που ονομάζεται Book, για φυσικούς αριθμούς από το 1 έως το 5.
Μπορείς να σκεφτείς έναν Υποτύπο ως ένα ζεύγος ⟨x, h⟩, όπου το x είναι η τιμή και το h είναι η απόδειξη της εγκυρότητάς του.
Μπορείς να έχεις πρόσβαση στην τιμή μέσα σε έναν Υποτύπο (στο x, στην περίπτωση αυτή) χρησιμοποιώντας το .val, για παράδειγμα, x.val.
Μπορείς να έχεις πρόσβαση και στην απόδειξή του χρησιμοποιώντας το .property, για παράδειγμα, x.property.
Και στα δύο μπορείς επίσης να έχεις πρόσβαση μέσω αντιστοίχισης προτύπων, όπως συνήθως.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Lean με 100 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.