آناگرام

آناگرام

متوسط

مقدمه

در یک حراج خانگی، یک ماشین تحریر قدیمی و زیبا را به قیمتی ارزان پیدا می‌کنید! با هیجان به خانه می‌دوید، یک برگ کاغذ در آن می‌گذارید و شروع به تایپ می‌کنید. اما وقتی خروجی را بررسی می‌کنید، هیجانتان فروکش می‌کند: همه‌ی کلمه‌ها به‌هم‌ریخته‌اند! برای مثال، به جای «post» کلمه‌ی «stop» را چاپ می‌کند و به جای «stale» کلمه‌ی «least» را. با دقت دوباره امتحان می‌کنید، اما این بار «spot» و «slate» را چاپ می‌کند. پس از کمی آزمایش، متوجه می‌شوید پیش از چاپ هر حرف، تأخیری تصادفی وجود دارد که ترتیب را به‌هم می‌ریزد. حالا می‌فهمید چرا آن را به این ارزانی فروخته بودند!

متوجه می‌شوید که این ویژگی عجیب به شما امکان می‌دهد «آناگرام» بسازید؛ یعنی کلمه‌هایی که با جابه‌جا کردن حرف‌های یک کلمه‌ی دیگر ساخته می‌شوند. از این کشف خود خوشحال می‌شوید و باقی روز را صرف ساختن صدها آناگرام می‌کنید.

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

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

آنگرام بازآرایی حروف برای ساختن یک کلمه‌ی جدید است: برای مثال "owns" آنگرام "snow" است. یک کلمه آنگرام خودش نیست: برای مثال، "stop" آنگرام "stop" نیست.

کلمه‌ی هدف و گزینه‌ها کلماتی هستند متشکل از یک یا چند نویسه‌ی الفبایی ASCII (A-Z و a-z). حروف کوچک و بزرگ معادل هم‌اند: برای مثال، "PoTS" آنگرام "sTOp" است، اما StoP آنگرام sTOp نیست. مجموعه‌ی آنگرام‌ها زیرمجموعه‌ای از مجموعه‌ی گزینه‌هاست که آنگرام‌های کلمه‌ی هدف هستند (به هر ترتیبی). کلمه‌های موجود در مجموعه‌ی آنگرام‌ها باید همان حالت حروفِ مجموعه‌ی گزینه‌ها را داشته باشند.

با داشتن کلمه‌ی هدف "stone" و گزینه‌های "stone"، "tones"، "banana"، "tons"، "notes"، "Seton"، مجموعه‌ی آنگرام‌ها عبارت است از "tones"، "notes"، "Seton".

نکته‌ها

برای کامل کردن این تمرین باید تابع anagramsFor را پیاده‌سازی کنید؛ این تابع یک کلمه و گروهی از کلمات را می‌گیرد و آن‌هایی را برمی‌گرداند که آناگرام کلمه‌ی داده‌شده باشند.

آناگرام‌ها را باید به همان ترتیبی برگردانید که در فهرست کلمات نامزد آمده‌اند.

اگر برای اولین بار است که این تمرین را حل می‌کنید، توصیه می‌شود به امضای داده‌شده پایبند بمانید:

anagramsFor :: String -> [String] -> [String]

بعداً ممکن است ایده‌ی خوبی باشد که دوباره به این مسئله برگردید و با انواع داده و کتابخانه‌های دیگر کار کنید:

  • Text، از بسته‌ی text.
  • Sequence و Set، از بسته‌ی containers.
  • MultiSet، از بسته‌ی multiset

مجموعه‌ی تست به‌عمد طوری طراحی شده است که تقریباً هر امضای نوعی معناداری را بپذیرد، بنابراین تشویق می‌شوید امضایی را پیدا کنید که به نظر خودتان بهترین است.

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

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

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