كان هناك خادم حكيم أنقذ حياة أمير. وعد الملك بأن يمنحه كل ما يمكن أن يطلبه. ولأن الخادم كان يعلم أن الملك يحب الشطرنج، أخبره أنه يود الحصول على حبات من القمح. حبة واحدة على المربع الأول من رقعة الشطرنج، ويتضاعف عدد الحبات في كل مربع يليه.
احسب عدد حبات القمح على رقعة شطرنج.
تحتوي رقعة الشطرنج على 64 مربعًا. يحتوي المربع 1 على حبة واحدة، ويحتوي المربع 2 على حبتين، ويحتوي المربع 3 على أربع حبات، وهكذا، مع مضاعفة العدد في كل مرة.
اكتب كودًا يحسب:
بشكل افتراضي، تُمثَّل الأعداد في 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 لإسناد قيمة إلى متغير من أنبوب للاطّلاع على مثال يوضّح كيفية ذلك.
قراءة إضافية: الحساب ذو الدقة الاعتباطية
سجّل في Exercism لتتعلّم وتتقن AWK عبر 3 مفاهيم92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.