یک کتابفروشی برای تشویق به خرید بیشتر کتابهای مختلف از یک مجموعهی محبوب پنججلدی، تصمیم گرفته است روی خرید چند کتاب با هم تخفیف بدهد.
هر نسخه از هر یک از این پنج کتاب ۸ دلار قیمت دارد.
اما اگر دو کتاب متفاوت بخرید، روی آن دو کتاب ۵٪ تخفیف میگیرید.
اگر ۳ کتاب متفاوت بخرید، ۱۰٪ تخفیف میگیرید.
اگر ۴ کتاب متفاوت بخرید، ۲۰٪ تخفیف میگیرید.
اگر هر ۵ کتاب را بخرید، ۲۵٪ تخفیف میگیرید.
توجه کنید که اگر چهار کتاب بخرید که ۳ تای آنها عنوانهای متفاوتی داشته باشند، روی آن ۳ کتابی که یک مجموعه را تشکیل میدهند ۱۰٪ تخفیف میگیرید، اما کتاب چهارم همچنان ۸ دلار قیمت دارد.
مأموریت شما این است که کدی بنویسید تا قیمت هر سبد خرید قابلتصوری (که فقط شامل کتابهای همین مجموعه باشد) را محاسبه کند، با بیشترین تخفیف ممکن.
برای مثال، قیمت این سبد کتاب چقدر است؟
یک روش برای گروهبندی این ۸ کتاب این است:
که در مجموع به این نتیجه میرسد:
که حاصل آن این است:
که برابر است با ۵۱٫۶۰ دلار.
اما روش دیگری برای گروهبندی این ۸ کتاب وجود دارد:
که در مجموع به این نتیجه میرسد:
که حاصل آن این است:
که برابر است با ۵۱٫۲۰ دلار.
و ۵۱٫۲۰ دلار قیمتی است که بیشترین تخفیف را دارد.
امضای تابع برای خروجی WebAssembly به اسم total به شکل زیر است:
(func (export "total")
(param $basketOffset i32)
(param $basketLength i32)
(result i32)
)
دو پارامتر $basketOffset و $basketLength، آفست پایه و طول یک آرایه از اعداد صحیح ۳۲ بیتی را بیان میکنند. پارامتر طول بر حسب تعداد عنصرهای آرایه اندازهگیری میشود، نه بر حسب بایت. پیش از فراخوانی این تابع، فراخواننده این آرایه را در حافظهی خطی WebAssembly، از آفست $basketOffset به بعد، مینویسد. حافظهی خطی WebAssembly همیشه به صورت little-endian بیان میشود.
برای مثال، فراخواننده سبد [1,2] را به صورت دنبالهی هشتبایتی زیر کدگذاری میکند.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
در Exercism ثبتنام کنید تا WebAssembly را همراه با 87 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.