مسیرها
/
Common Lisp
Common Lisp
/
تمرین‌ها
/
نگاشتگر باشکوه لوسی
نگاشتگر باشکوه لوسی

نگاشتگر باشکوه لوسی

تمرین یادگیری

مقدمه

نگاشت

«نگاشت» به اعمال یک تابع روی هر عنصر از یک دنباله برای تولید یک دنباله‌ی جدید اشاره دارد.

این کار را می‌توان به‌راحتی روی یک لیست با تابع mapcar انجام داد. فرض کنید تابعی به اسم double داریم که آرگومانش را در 2 ضرب می‌کند:

(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)

توجه کنید که آرگومان اول تابعی است که باید فراخوانی شود. #' یک روش نگارش خاص برای نقل‌قول است که یک تابع را مشخص می‌کند.

double ابتدا با عنصر اول فراخوانی شد، سپس با عنصر دوم و به همین ترتیب. نتیجه‌ها در لیستی جمع‌آوری شدند که همان مقداری است که عبارت به آن ارزیابی می‌شود.

پالایش

«پالایش» فرایندی است که با کپی کردن تمام عناصر دنباله‌ی اصلی به‌جز برخی از آن‌ها، دنباله‌ای تازه از آن می‌سازد. انتخاب اینکه کدام عناصر در دنباله‌ی جدید گنجانده شوند می‌تواند با یک «تابع محمول» (تابعی که به یک «مقدار منطقی» ارزیابی می‌شود) یا با برابری با یک شیء مشخص انجام شود.

حذف با یک محمول

remove-if تابعی است که یک تابع محمول و یک دنباله را به‌عنوان آرگومان می‌گیرد و دنباله‌ای برمی‌گرداند که تنها شامل عناصری است که محمول برای آن‌ها به «غلط» ارزیابی کرده است. به عبارت دیگر، همه‌ی عناصری از دنباله را که محمول برای آن‌ها به «درست» ارزیابی می‌شود «حذف» می‌کند. با این حال، توجه کنید که این تابع دنباله‌ی اصلی را تغییر نمی‌دهد! در عوض، دنباله‌ی جدیدی بدون همان عناصر برمی‌گرداند. اگر محمول برای همه‌ی مقادیر «درست» بوده باشد، دنباله‌ی خالی برگردانده می‌شود.

(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5))      ; => ()

حذف یک عنصر مشخص

اگر بخواهید عنصر مشخصی را از یک دنباله حذف کنید، می‌توانید از remove استفاده کنید که عنصر موردنظر برای حذف و یک دنباله را می‌گیرد. همه‌ی مقادیری از دنباله که با عنصر موردنظر برای حذف برابر نیستند برگردانده می‌شوند. نکته: برابری به‌صورت پیش‌فرض با eql، یعنی محمول برابری عام، بررسی می‌شود.

(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello")      ; => "heo"

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

لوسی، موجود فضایی Lisp، عددها را دوست دارد و به نظرشان بعضی از آن‌ها «باشکوه» هستند.

از شما می‌خواهند کمکشان کنید تا توابعی بنویسند که عددها را باشکوه‌تر کنند.

اینکه از نظر لوسی چه چیزی یک عدد را باشکوه می‌کند می‌تواند تغییر کند، بنابراین توابع باید انعطاف‌پذیر باشند.

1. باشکوه بسازید

برای تبدیل یک فهرست از عددها به فهرستی از عددهای باشکوه‌تر، باید تابعی به اسم make-magnificent-maybe بنویسید که یک تابع برای اعمال روی عددها و یک فهرست از عددها می‌گیرد. نتیجه‌ی آن باید فهرستی از عددها باشد که (بر اساس تابعی که داده شده) باشکوه‌تر هستند.

(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3))     ; => (2 3 4)

2. فقط بهترین

پس از اینکه (به امید موفقیت) عددها را باشکوه‌تر کردید، لوسی می‌خواهد فقط عددهایی را ببیند که واقعاً باشکوه‌اند.

آن‌ها مطمئناً می‌دانند که 1 هرگز باشکوه نیست، بنابراین باید آن را حذف کنید.

اما جز این، لوسی گاهی نظرش را عوض می‌کند، بنابراین دوباره تابعی به شما می‌دهند که می‌گوید یک عدد باشکوه است یا نه.

باید تابعی به اسم only-the-best بنویسید که یک تابع و یک فهرست از عددها می‌گیرد و فقط بهترین عددها را برمی‌گرداند (نه 1 و نه عددهایی که تابع برای آن‌ها به «درست» ارزیابی می‌شود).

(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5))    ; => ()
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Common Lisp Exercism

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

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