Buchladen

Buchladen

Mittel

Anleitung

Um mehr Verkäufe verschiedener Bücher aus einer beliebten fünfteiligen Buchreihe anzukurbeln, hat sich eine Buchhandlung entschieden, beim Kauf mehrerer Bücher Rabatte zu gewähren.

Ein Exemplar eines der fünf Bücher kostet $8.

Wenn du jedoch zwei verschiedene Bücher kaufst, bekommst du 5 % Rabatt auf diese beiden Bücher.

Wenn du 3 verschiedene Bücher kaufst, bekommst du 10 % Rabatt.

Wenn du 4 verschiedene Bücher kaufst, bekommst du 20 % Rabatt.

Wenn du alle 5 kaufst, bekommst du 25 % Rabatt.

Beachte: Wenn du vier Bücher kaufst, von denen 3 verschiedene Titel sind, bekommst du 10 % Rabatt auf die 3, die zu einer Gruppe gehören, aber das vierte Buch kostet weiterhin $8.

Deine Aufgabe ist es, Code zu schreiben, der den Preis für jeden erdenklichen Einkaufskorb berechnet (der nur Bücher derselben Reihe enthält) und dabei den größtmöglichen Rabatt gewährt.

Wie viel kostet zum Beispiel dieser Korb voller Bücher?

  • 2 Exemplare des ersten Buches
  • 2 Exemplare des zweiten Buches
  • 2 Exemplare des dritten Buches
  • 1 Exemplar des vierten Buches
  • 1 Exemplar des fünften Buches

Eine Möglichkeit, diese 8 Bücher zu gruppieren, ist:

  • 1 Gruppe von 5 (1., 2., 3., 4., 5.)
  • 1 Gruppe von 3 (1., 2., 3.)

Das ergibt insgesamt:

  • 5 Bücher mit 25 % Rabatt
  • 3 Bücher mit 10 % Rabatt

Daraus ergibt sich:

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

Das macht $51.60.

Eine andere Möglichkeit, diese 8 Bücher zu gruppieren, ist jedoch:

  • 1 Gruppe von 4 Büchern (1., 2., 3., 4.)
  • 1 Gruppe von 4 Büchern (1., 2., 3., 5.)

Das ergibt insgesamt:

  • 4 Bücher mit 20 % Rabatt
  • 4 Bücher mit 20 % Rabatt

Daraus ergibt sich:

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

Das macht $51.20.

Und $51.20 ist der Preis mit dem größten Rabatt.

WebAssembly-spezifische Hinweise

Die Funktionssignatur für den WebAssembly-Export total sieht wie folgt aus:

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

Die beiden Parameter $basketOffset und $basketLength geben den Basis-Offset und die Länge eines Arrays aus 32-Bit-Ganzzahlen an. Der Längenparameter bemisst sich nach der Anzahl der Elemente im Array, nicht nach Bytes. Bevor diese Funktion aufgerufen wird, schreibt der Aufrufer dieses Array in den linearen Speicher von WebAssembly, beginnend bei Offset $basketOffset. Der lineare Speicher von WebAssembly wird immer in Little-Endian dargestellt.

Zum Beispiel würde der Aufrufer den Warenkorb [1,2] als die folgende Byte-Folge aus acht Bytes kodieren.

| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
WebAssembly Exercism

Bereit, mit Buchladen zu starten?

Melde dich bei Exercism an, um WebAssembly mit 87 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.