書店

書店

中級

説明

人気の全5冊シリーズの本をもっとたくさん売るために、ある書店はまとめ買いの割引を提供することにしました。

5冊のうちどの本でも、1冊の値段は$8です。

ただし、異なる2冊を買うと、その2冊に5%の割引が適用されます。

異なる3冊を買うと、10%の割引になります。

異なる4冊を買うと、20%の割引になります。

5冊すべてを買うと、25%の割引になります。

4冊買う場合で、そのうち3冊が異なるタイトルであれば、セットを構成する3冊には10%の割引が適用されますが、4冊目は$8のままであることに注意してください。

今回のミッションは、考えうるどんな買い物かご(同じシリーズの本だけが入っているもの)の値段も、できるだけ大きな割引になるように計算するコードを書くことです。

たとえば、次の本のかごはいくらになるでしょうか?

  • 1冊目の本が2冊
  • 2冊目の本が2冊
  • 3冊目の本が2冊
  • 4冊目の本が1冊
  • 5冊目の本が1冊

この8冊をまとめる方法の1つは、次のとおりです。

  • 5冊のグループが1つ(1冊目、2冊目、3冊目、4冊目、5冊目)
  • 3冊のグループが1つ(1冊目、2冊目、3冊目)

これで合計は次のようになります。

  • 25%の割引で5冊
  • 10%の割引で3冊

その結果は次のとおりです。

  • 5 × (100% - 25%) × $8 = 5 × $6.00 = $30.00、さらに
  • 3 × (100% - 10%) × $8 = 3 × $7.20 = $21.60

合計は$51.60になります。

ただし、この8冊をまとめる別の方法もあります。

  • 4冊のグループが1つ(1冊目、2冊目、3冊目、4冊目)
  • 4冊のグループが1つ(1冊目、2冊目、3冊目、5冊目)

これで合計は次のようになります。

  • 20%の割引で4冊
  • 20%の割引で4冊

その結果は次のとおりです。

  • 4 × (100% - 20%) × $8 = 4 × $6.40 = $25.60、さらに
  • 4 × (100% - 20%) × $8 = 4 × $6.40 = $25.60

合計は$51.20になります。

そして、$51.20が最も大きな割引が適用された価格です。

WebAssembly固有の注意点

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,
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
WebAssembly Exercism

書店を始める準備はできましたか?

Exercismに登録すれば、87個の演習、そして本物の人間によるメンタリングとともに、WebAssemblyを学んでマスターできます。すべて無料です。