ট্র্যাক
/
Haskell
Haskell
/
অনুশীলনী
/
অ্যানাগ্রাম
অ্যানাগ্রাম

অ্যানাগ্রাম

মধ্যম

ভূমিকা

একটি গ্যারেজ সেলে আপনি সস্তায় একটি চমৎকার ভিন্টেজ টাইপরাইটার পেয়ে যান! উত্তেজিত হয়ে আপনি বাড়ি ছুটে যান, একটি কাগজ ঢোকান, আর টাইপ করা শুরু করেন। তবে আউটপুট দেখে আপনার উত্তেজনা কমে যায়: সব শব্দ এলোমেলো হয়ে গেছে! যেমন, এটি "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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।