الحبوب

الحبوب

سهل

مقدمة

كان هناك خادم حكيم أنقذ حياة أمير. وعد الملك بأن يمنحه كل ما يمكن أن يطلبه. ولأن الخادم كان يعلم أن الملك يحب الشطرنج، أخبره أنه يود الحصول على حبات من القمح. حبة واحدة على المربع الأول من رقعة الشطرنج، ويتضاعف عدد الحبات في كل مربع يليه.

التعليمات

احسب عدد حبات القمح على رقعة شطرنج.

تحتوي رقعة الشطرنج على 64 مربعًا. يحتوي المربع 1 على حبة واحدة، ويحتوي المربع 2 على حبتين، ويحتوي المربع 3 على أربع حبات، وهكذا، مع مضاعفة العدد في كل مرة.

اكتب كودًا يحسب:

  • عدد الحبات على مربع معيّن
  • العدد الإجمالي للحبات على رقعة الشطرنج

GNU awk والحساب ذو الدقة الاعتباطية

بشكل افتراضي، تُمثَّل الأعداد في awk كأعداد عشرية عائمة ذات دقة مزدوجة. وهذا يوفّر دقة مقدارها 53 بتًا (انظر الجدول 16.3 في الدليل). وللأسف، هذا لا يكفي لإتمام هذا التمرين (تنبيه بحرق الأحداث: أحد الاختبارات يتطلب دقة مقدارها 63 بتًا).

تبدو رسالة «الدقة غير كافية» هكذا:

$ gawk 'BEGIN {
  n = 2 ^ 54
  if (n == n + 1)
    print "not enough precision"
  else
    print "OK"
}'
not enough precision

تستطيع awk من GNU استخدام أعداد ذات دقة اعتباطية، إذا كانت المكتبات اللازمة قد ضُمّنت في الملف التنفيذي لـ awk. تحقّق من إصدار awk وابحث عن "GNU MPFR":

$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
...

إذا كان موجودًا، فعّل هذه الإمكانية باستخدام الخيار -M:

$ gawk -M 'BEGIN {
  n = 2 ^ 54
  if (n == n + 1)
    print "not enough precision"
  else
    print "OK"
}'
OK

ماذا لو لم يكن الخيار -M متاحًا في awk لديّ؟ سيتعيّن عليك استدعاء برنامج خارجي قادر على إجراء حسابات ذات دقة اعتباطية، مثل bc. راجع قسم استخدام getline لإسناد قيمة إلى متغير من أنبوب للاطّلاع على مثال يوضّح كيفية ذلك.

قراءة إضافية: الحساب ذو الدقة الاعتباطية

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
AWK Exercism

مستعد لبدء الحبوب؟

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