Βιβλιοπωλείο

Βιβλιοπωλείο

Μέτριο

Οδηγίες

Για να ενθαρρύνει τις πωλήσεις διαφορετικών βιβλίων από μια δημοφιλή σειρά 5 βιβλίων, ένα βιβλιοπωλείο αποφάσισε να προσφέρει εκπτώσεις σε αγορές πολλών βιβλίων.

Ένα αντίτυπο από οποιοδήποτε από τα πέντε βιβλία κοστίζει $8.

Αν όμως αγοράσεις δύο διαφορετικά βιβλία, παίρνεις έκπτωση 5% σε αυτά τα δύο βιβλία.

Αν αγοράσεις 3 διαφορετικά βιβλία, παίρνεις έκπτωση 10%.

Αν αγοράσεις 4 διαφορετικά βιβλία, παίρνεις έκπτωση 20%.

Αν αγοράσεις και τα 5, παίρνεις έκπτωση 25%.

Σημείωσε ότι αν αγοράσεις τέσσερα βιβλία, από τα οποία τα 3 είναι διαφορετικοί τίτλοι, παίρνεις έκπτωση 10% στα 3 που αποτελούν μέρος ενός σετ, αλλά το τέταρτο βιβλίο κοστίζει ακόμα $8.

Η αποστολή σου είναι να γράψεις κώδικα που να υπολογίζει την τιμή οποιουδήποτε νοητού καλαθιού αγορών (που περιέχει μόνο βιβλία της ίδιας σειράς), δίνοντας τη μεγαλύτερη δυνατή έκπτωση.

Για παράδειγμα, πόσο κοστίζει αυτό το καλάθι με βιβλία;

  • 2 αντίτυπα του πρώτου βιβλίου
  • 2 αντίτυπα του δεύτερου βιβλίου
  • 2 αντίτυπα του τρίτου βιβλίου
  • 1 αντίτυπο του τέταρτου βιβλίου
  • 1 αντίτυπο του πέμπτου βιβλίου

Ένας τρόπος να ομαδοποιήσεις αυτά τα 8 βιβλία είναι:

  • 1 ομάδα των 5 (1ο, 2ο,3ο, 4ο, 5ο)
  • 1 ομάδα των 3 (1ο, 2ο, 3ο)

Αυτό θα έδινε ένα σύνολο:

  • 5 βιβλία με έκπτωση 25%
  • 3 βιβλία με έκπτωση 10%

Δηλαδή:

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

Που ισούται με $51.60.

Ωστόσο, ένας διαφορετικός τρόπος να ομαδοποιήσεις αυτά τα 8 βιβλία είναι:

  • 1 ομάδα 4 βιβλίων (1ο, 2ο, 3ο, 4ο)
  • 1 ομάδα 4 βιβλίων (1ο, 2ο, 3ο, 5ο)

Αυτό θα έδινε ένα σύνολο:

  • 4 βιβλία με έκπτωση 20%
  • 4 βιβλία με έκπτωση 20%

Δηλαδή:

  • 4 × (100% - 20%) × $8 = 4 × $6.40 = $25.60, συν
  • 4 × (100% - 20%) × $8 = 4 × $6.40 = $25.60

Που ισούται με $51.20.

Και τα $51.20 είναι η τιμή με τη μεγαλύτερη έκπτωση.

Σημειώσεις ειδικά για το WebAssembly

Η υπογραφή συνάρτησης για το εξαγόμενο total του WebAssembly είναι η εξής:

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

Οι δύο παράμετροι $basketOffset και $basketLength εκφράζουν τη βασική μετατόπιση και το μήκος ενός πίνακα από 32-bit ακέραιους. Η παράμετρος μήκους μετριέται σε αριθμό στοιχείων του πίνακα, όχι σε bytes. Πριν καλέσει αυτή τη συνάρτηση, ο καλών γράφει αυτόν τον πίνακα στη γραμμική μνήμη του WebAssembly, ξεκινώντας από τη μετατόπιση $basketOffset. Η γραμμική μνήμη του WebAssembly εκφράζεται πάντα σε little-endian.

Για παράδειγμα, ο καλών θα κωδικοποιούσε το καλάθι [1,2] ως την ακόλουθη ακολουθία οκτώ byte.

| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
WebAssembly Exercism

Έτοιμος να ξεκινήσεις την άσκηση Βιβλιοπωλείο;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις WebAssembly με 87 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.