دانه

دانه

آسان

مقدمه

روزی روزگاری، خدمتکار دانایی بود که جانِ شاهزاده‌ای را نجات داد. پادشاه وعده داد هر آنچه خدمتکار به ذهنش برسد، بپردازد. خدمتکار که می‌دانست پادشاه عاشق شطرنج است، به پادشاه گفت که دانه‌های گندم می‌خواهد. یک دانه روی خانه‌ی اول صفحه‌ی شطرنج و در هر خانه‌ی بعدی، تعداد دانه‌ها دو برابر می‌شود.

دستورالعمل‌ها

تعداد دانه‌های گندم روی یک صفحه‌ی شطرنج را محاسبه کنید.

یک صفحه‌ی شطرنج ۶۴ خانه دارد. خانه‌ی ۱ یک دانه دارد، خانه‌ی ۲ دو دانه دارد، خانه‌ی ۳ چهار دانه دارد و به همین ترتیب، هر بار دو برابر می‌شود.

کدی بنویسید که این موارد را محاسبه کند:

  • تعداد دانه‌های روی یک خانه‌ی مشخص
  • تعداد کل دانه‌ها روی صفحه‌ی شطرنج

GNU awk و محاسبات با دقت دلخواه

به‌طور پیش‌فرض، اعداد در awk به‌صورت اعداد اعشاری شناور با دقت مضاعف نمایش داده می‌شوند. این ۵۳ بیت دقت فراهم می‌کند (به جدول ۱۶٫۳ در راهنما نگاه کنید). متأسفانه این برای کامل کردن این تمرین کافی نیست (هشدار لو دادن مطلب: یکی از testها به ۶۳ بیت دقت نیاز دارد).

«دقت ناکافی» چنین چیزی است:

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

GNU awk این قابلیت را دارد که از اعداد با دقت دلخواه استفاده کند، به شرط آنکه کتابخانه‌های مربوطه در فایل اجرایی 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

اگر awk من گزینه‌ی -M را نداشته باشد چه؟ باید یک برنامه‌ی بیرونی را فراخوانی کنید که بتواند محاسبات با دقت دلخواه انجام دهد، مثل bc. برای نمونه‌ای از این کار، بخش استفاده از getline برای خواندن از یک لوله در یک متغیر را ببینید.

مطالعه‌ی بیشتر: محاسبات با دقت دلخواه

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
AWK Exercism

آماده‌اید دانه را شروع کنید؟

در Exercism ثبت‌نام کنید تا AWK را همراه با 3 مفهوم92 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.