人気の全5冊シリーズの本をもっとたくさん売るために、ある書店はまとめ買いの割引を提供することにしました。
5冊のうちどの本でも、1冊の値段は$8です。
ただし、異なる2冊を買うと、その2冊に5%の割引が適用されます。
異なる3冊を買うと、10%の割引になります。
異なる4冊を買うと、20%の割引になります。
5冊すべてを買うと、25%の割引になります。
4冊買う場合で、そのうち3冊が異なるタイトルであれば、セットを構成する3冊には10%の割引が適用されますが、4冊目は$8のままであることに注意してください。
今回のミッションは、考えうるどんな買い物かご(同じシリーズの本だけが入っているもの)の値段も、できるだけ大きな割引になるように計算するコードを書くことです。
たとえば、次の本のかごはいくらになるでしょうか?
この8冊をまとめる方法の1つは、次のとおりです。
これで合計は次のようになります。
その結果は次のとおりです。
合計は$51.60になります。
ただし、この8冊をまとめる別の方法もあります。
これで合計は次のようになります。
その結果は次のとおりです。
合計は$51.20になります。
そして、$51.20が最も大きな割引が適用された価格です。
WebAssemblyのエクスポートtotalの関数シグネチャは、次のとおりです。
(func (export "total")
(param $basketOffset i32)
(param $basketLength i32)
(result i32)
)
2つの仮引数$basketOffsetと$basketLengthは、32ビット整数の配列のベースオフセットと長さを表します。長さの仮引数は、バイト数ではなく配列の要素数で表されます。この関数を呼び出す前に、呼び出し側はこの配列を、オフセット$basketOffsetから始まるWebAssemblyの線形メモリに書き込みます。WebAssemblyの線形メモリは、常にリトルエンディアンで表されます。
たとえば、呼び出し側はバスケット[1,2]を、次の8バイトの並びとしてエンコードします。
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,