سعيًا إلى تشجيع مزيد من مبيعات الكتب المختلفة من سلسلة كتب شهيرة مكوّنة من 5 كتب، قرّر متجر كتب أن يقدّم خصومات على شراء عدة كتب معًا.
تبلغ تكلفة نسخة واحدة من أي من هذه الكتب الخمسة $8.
أما إذا اشتريت كتابين مختلفين، فتحصل على خصم 5% على هذين الكتابين.
وإذا اشتريت 3 كتب مختلفة، فتحصل على خصم 10%.
وإذا اشتريت 4 كتب مختلفة، فتحصل على خصم 20%.
وإذا اشتريت الكتب الخمسة كلها، فتحصل على خصم 25%.
لاحظ أنك إذا اشتريت أربعة كتب، 3 منها بعناوين مختلفة، فتحصل على خصم 10% على 3 كتب منها تشكّل مجموعة، بينما يبقى الكتاب الرابع بسعر $8.
مهمتك هي كتابة كود لحساب سعر أي سلة تسوق يمكن تصورها (تحتوي فقط على كتب من سلسلة الكتب نفسها)، مع منح أكبر خصم ممكن.
على سبيل المثال، كم تبلغ تكلفة سلة الكتب هذه؟
إحدى طرق تجميع هذه الكتب الثمانية هي:
سيكون المجموع:
ما ينتج عنه:
أي ما يساوي $51.60.
لكن هناك طريقة مختلفة لتجميع هذه الكتب الثمانية:
سيكون المجموع:
ما ينتج عنه:
أي ما يساوي $51.20.
و $51.20 هو السعر مع أكبر خصم ممكن.
توقيع الدالة لتصدير WebAssembly total كما يلي:
(func (export "total")
(param $basketOffset i32)
(param $basketLength i32)
(result i32)
)
المعاملان $basketOffset و$basketLength يعبّران عن الإزاحة الأساسية وطول مصفوفة من الأعداد الصحيحة ذات 32 بت. معامل الطول مقاس بعدد العناصر في المصفوفة، وليس بالبايتات. قبل استدعاء هذه الدالة، يكتب المستدعي هذه المصفوفة في ذاكرة 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.