في سوقٍ لبيع المستعملات، تجد آلة كاتبة قديمة أنيقة بسعر زهيد! وبكل حماس، تسرع إلى المنزل، وتُدخل ورقة، وتبدأ الكتابة. لكن حماسك يخبو عندما تتفقد الناتج: كل الكلمات مشوّشة! فعلى سبيل المثال، تطبع "stop" بدل "post" و"least" بدل "stale". وتحاول مرة أخرى بعناية، لكنها الآن تطبع "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
صُمِّمت مجموعة الاختبارات عن قصد لتقبل تقريبًا أي توقيع نوعي منطقي، لذا نشجعك على إيجاد التوقيع الذي تراه الأفضل.
سجّل في Exercism لتتعلّم وتتقن Haskell عبر 107 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.