بيتزا باي

بيتزا باي

تمرين تعلّمي

مقدمة

في Common Lisp، كما في لغات كثيرة، تأتي الأعداد بعدة أنواع، وأبسط نوعين منها هما:

الأعداد الصحيحة

مثل لغات كثيرة، يحتوي Common Lisp على أعداد صحيحة. وهي أعداد كاملة بلا فاصلة عشرية (مثل -6 و0 و25 و1234 وغيرها).

لا يفرض Common Lisp أي حدود على مقدار الأعداد الصحيحة. فيمكن أن تكون الأعداد الصحيحة كبيرة بأي مقدار (أو صغيرة إذا كانت سالبة).

وبشكل عام، إذا كنت تتعامل مع أعداد كاملة فقط، فالأفضل أن تفضّل الأعداد الصحيحة، لأنها لا تعاني من فقدان الدقة الذي تعانيه الأعداد العشرية بعد حسابات كثيرة.

الأعداد العشرية

ومثل لغات كثيرة، يحتوي Common Lisp على أعداد عشرية. وهي أعداد كسرية أو كاملة تتضمن فاصلة عشرية (مثل 3.14 و-1.7 و99.99 و2048.0).

العمليات الحسابية

يستخدم Common Lisp عوامل حسابية معتادة في معظم العمليات، لكنه يتميز بعض الشيء باستخدامه "الترميز البادئي" بدلًا من "الترميز البيني" الأكثر ألفة.

ولنرَ ذلك بشكل أوضح:

;; Infix-notation (non-lisp languages)
1 + 2 + 3 + 4 + 5 ; => 15
;; Prefix-notation (lisp languages)
(+ 1 2 3 4 5)     ; => 15

ومع أن الترميز البادئي يحوّل عمليات مثل 2 + 2 إلى الصيغة (+ 2 2) غير المألوفة بعض الشيء، فإنه يسهّل كثيرًا العمل على أكثر من عدد في وقت واحد.

أساسيات الرياضيات

يمتلك Common Lisp كل الدوال المعتادة: + و- و* و/ للجمع والطرح والضرب والقسمة.

وعند التفكير في القسمة، قد ترغب في معرفة باقي القسمة، وهذا ما تفعله دالة mod (اختصارًا لكلمة modulo) التي تأخذ عددًا ومقسومًا عليه كوسيطين:

(mod 4 2)  ; => 0
(mod 2 4)  ; => 2
(mod 10 3) ; => 1

مقارنة الأعداد

وأخيرًا، قد يفيدك مقارنة أعداد مختلفة باستخدام دوال مثل = (يساوي) و/= (لا يساوي) و>= (أكبر من أو يساوي). وعندما تكون هذه المقارنات صحيحة (كما في (= 1 1))، فإنها تُرجع T، وعندما لا تكون كذلك (كما في (> 0 1))، فإنها تُرجع NIL.

التعليمات

تعشق Lilly، الكائن الفضائي الخاص بـ Lisp، الطهي. تريد إقامة حفلة بيتزا مع أصدقائها، لكنها تريد أن تعرف بدقة كمية كل مكوّن ستحتاج إليه قبل أن تبدأ، حتى تستفيد من مكوّناتها إلى أقصى حد.

لحلّ هذه المشكلة، أعدّت Lilly مسودة برنامج لأتمتة جزء من التخطيط، لكنها تحتاج مساعدتك لإكماله. هل ستساعد Lilly في إقامة حفلة بيتزا مثالية التناسب؟

1. نسبة العجينة

أولًا وقبل كل شيء، كل بيتزا رائعة تبدأ بعجينة لذيذة!

Lilly من محبّي البيتزا الرقيقة المقرمشة ذات القشرة السميكة. العجينة اللازمة للوسط ثابتة عند 200 غرام، لكن كل 20 سم من القشرة تتطلب 45 غرامًا من العجينة.

لحسن الحظ، حسبت Lilly المعادلة التي تعطي غرامات العجينة (g) انطلاقًا من عدد البيتزا (n) وقطرها (d):

g = n * (((45 * pi * d) / 20) + 200)

تحتاج Lilly إلى دالة:

  • تأخذ عدد البيتزا (n) وقطرها (d)
  • وتُرجع كمية العجينة اللازمة مقرّبة إلى أقرب غرام (g).

على سبيل المثال، لصنع 4 بيتزات بقطر 30 سم:

(dough-calculator 4 30) ; => 1648

2. رشة من الصلصة

Lilly دقيقة في وضع صلصتها، لكن حجم بيتزاتها قد يكون غير متّسق.

لمعرفة القطر (d)، تستخدم المعادلة التالية حيث كمية الصلصة المستخدمة (s) متغير:

d = square-root of ((40 * s) / (3 * pi))

تحتاج Lilly إلى دالة تحسب قطر البيتزا (d) من كل مليلتر من الصلصة المستخدمة (s).

على سبيل المثال، إذا استخدمت Lilly 250 مل من الصلصة:

(size-from-sauce 250) ; => 32.57

3. بعض الجبن، من فضلك

على كوكب Lilly، يأتي كل الجبن على شكل مكعبات مثالية ويُباع حسب الحجم. (ماذا كنت تتوقع؟ إنه كوكب فضائي في النهاية...)

ومرة أخرى، حسبت Lilly معادلة لعدد البيتزا (n) بقطر ما (d) التي يمكن صنعها من مكعب جبن طول ضلعه (l):

n = (2 * (l^3)) / (3* pi * (d^2))

أنشئ دالة:

  • تأخذ طول ضلع مكعب الجبن (l) وقطر البيتزا (d)،
  • وتُرجع عدد البيتزا (n) مع التقريب للأسفل.

على سبيل المثال، بوجود مكعب جبن 25x25x25 سم وبيتزا بقطر 30 سم:

(pizzas-per-cube 25 30) ; => 3

4. نصيب عادل

أخيرًا، تريد Lilly أن تُقسَّم كل بيتزا إلى 8 شرائح وتُوزَّع بالتساوي بين أصدقائها.

أنشئ دالة:

  • تأخذ عدد البيتزا وعدد الأصدقاء
  • وتُرجع T إذا كانت البيتزا ستتوزّع بالتساوي بين الأصدقاء، وNIL بخلاف ذلك.

على سبيل المثال:

;; For splitting 3 pizzas between 4 friends
(fair-share-p 3 4) ; => T
;; For splitting 2 pizzas between 3 friends
(fair-share-p 2 3) ; => NIL
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Common Lisp Exercism

مستعد لبدء بيتزا باي؟

سجّل في Exercism لتتعلّم وتتقن Common Lisp عبر 27 مفهومًا92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.