الماس

الماس

آسان

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

کاتای الماس یک حرف را به عنوان ورودی می‌گیرد و آن را به شکل یک الماس بیرون می‌دهد. با گرفتن یک حرف، الماسی را چاپ می‌کند که با «A» شروع می‌شود و حرف داده‌شده در پهن‌ترین نقطه‌ی آن قرار می‌گیرد.

الزامات

  • ردیف اول شامل یک «A» است.
  • ردیف آخر شامل یک «A» است.
  • همه‌ی ردیف‌ها، به‌جز ردیف اول و آخر، دقیقاً دو حرف یکسان دارند.
  • در همه‌ی ردیف‌ها، تعداد فاصله‌های انتهایی برابر با تعداد فاصله‌های ابتدایی است. (این تعداد می‌تواند ۰ باشد.)
  • الماس به‌صورت افقی متقارن است.
  • الماس به‌صورت عمودی متقارن است.
  • شکل الماس مربع است (عرض برابر با ارتفاع).
  • حروف یک شکل الماسی می‌سازند.
  • در نیمه‌ی بالایی، حروف به ترتیب صعودی قرار دارند.
  • در نیمه‌ی پایینی، حروف به ترتیب نزولی قرار دارند.
  • چهار گوشه (که فاصله‌ها را در خود دارند) مثلث هستند.

مثال‌ها

در مثال‌های زیر، فاصله‌ها با نویسه‌ی · نشان داده شده‌اند.

الماس برای حرف «A»:

A

الماس برای حرف «C»:

··A··
·B·B·
C···C
·B·B·
··A··

الماس برای حرف «E»:

····A····
···B·B···
··C···C··
·D·····D·
E·······E
·D·····D·
··C···C··
···B·B···
····A····

راهنمایی‌ها

باید تابع diamond را پیاده‌سازی کنید. این تابع یک لوزی چاپ می‌کند که از A شروع می‌شود و کاراکتر داده‌شده در پهن‌ترین نقاط آن قرار دارد. اگر درباره‌ی نوع‌ها مطمئن نیستید می‌توانید از امضای ارائه‌شده استفاده کنید، اما نگذارید این امضا خلاقیتتان را محدود کند:

diamond :: Char -> Maybe [String]

این تمرین با داده‌های متنی کار می‌کند. به دلایل تاریخی، نوع String در Haskell با [Char]، یعنی فهرستی از کاراکترها، هم‌معنی است. برای پردازش کارآمدتر داده‌های متنی می‌توان از نوع Text استفاده کرد.

به‌عنوان یک بخش اختیاری برای این تمرین، می‌توانید

  • درباره‌ی نوع‌های رشته در Haskell بخوانید.
  • - text را به فهرست وابستگی‌هایتان در package.yaml اضافه کنید.
  • Data.Text را به روش زیر وارد کنید:
import qualified Data.Text as T
import           Data.Text (Text)
  • حالا می‌توانید مثلاً diamond :: Char -> Maybe [Text] را بنویسید و به ترکیب‌کننده‌های Data.Text مثلاً با T.pack ارجاع دهید
  • مستندات Data.Text را ببینید
  • سپس می‌توانید همه‌ی موارد String را در Diamond.hs با Text جایگزین کنید:
diamond :: Char -> Maybe [Text]

این بخش کاملاً اختیاری است.


منبع

Seb Roseاین لینک در پنجره یا تب جدیدی باز می‌شود.
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Haskell Exercism

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

در Exercism ثبت‌نام کنید تا Haskell را همراه با 107 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.