Libreria

Libreria

Medio

Istruzioni

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?

  • 2 copie del primo libro
  • 2 copie del secondo libro
  • 2 copie del terzo libro
  • 1 copia del quarto libro
  • 1 copia del quinto libro

Un modo di raggruppare questi 8 libri è:

  • 1 gruppo di 5 (1°, 2°, 3°, 4°, 5°)
  • 1 gruppo di 3 (1°, 2°, 3°)

Questo darebbe un totale di:

  • 5 libri con uno sconto del 25%
  • 3 libri con uno sconto del 10%

Il che dà come risultato:

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

Che equivale a $51.60.

Tuttavia, un modo diverso di raggruppare questi 8 libri è:

  • 1 gruppo di 4 libri (1°, 2°, 3°, 4°)
  • 1 gruppo di 4 libri (1°, 2°, 3°, 5°)

Questo darebbe un totale di:

  • 4 libri con uno sconto del 20%
  • 4 libri con uno sconto del 20%

Il che dà come risultato:

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

Che equivale a $51.20.

E $51.20 è il prezzo con lo sconto più grande.

Note specifiche per WebAssembly

La firma della funzione per l'export total di WebAssembly è la seguente:

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

I due parametri $basketOffset e $basketLength esprimono l'offset di base e la lunghezza di un array di numeri interi a 32 bit. Il parametro della lunghezza è indicato in numero di elementi dell'array, non in byte. Prima di chiamare questa funzione, il chiamante scrive questo array nella memoria lineare di WebAssembly a partire dall'offset $basketOffset. La memoria lineare di WebAssembly è sempre espressa in little-endian.

Ad esempio, il chiamante codificherebbe il paniere [1,2] come la seguente sequenza di otto byte.

| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
WebAssembly Exercism

Vuoi iniziare Libreria?

Iscriviti a Exercism per imparare e padroneggiare WebAssembly con 87 esercizi e il mentoring di persone reali, tutto gratis.