ট্র্যাক
/
Factor
Factor
/
অনুশীলনী
/
মিক্সটেপ নির্মাতা
মিক্সটেপ নির্মাতা

মিক্সটেপ নির্মাতা

লার্নিং অনুশীলনী

ভূমিকা

math.combinatorics ভোকাবুলারি একগুচ্ছ আইটেম নিয়ে দুই ধরনের প্রশ্নের উত্তর দেয়:

  • কম্বিনেশন: ক্রমকে গুরুত্ব না দিয়ে একটি গ্রুপ বেছে নেওয়ার কতগুলো উপায় আছে, কিংবা কোন কোন উপায়ে বেছে নেওয়া যায়?
  • পারমিউটেশন: যেখানে ক্রম গুরুত্বপূর্ণ, সেখানে আইটেম সাজানোর কতগুলো উপায় আছে, বা কোন কোন উপায়ে সাজানো যায়?

প্রতিটি প্রশ্নের জন্য একটি গণনা-ধরনের শব্দ থাকে যা একটি সংখ্যা রিটার্ন করে, আর একটি তালিকা-ধরনের শব্দ থাকে যা সত্যিকার নির্বাচনগুলো রিটার্ন করে।

গণনা

nCk ("n choose k") রিটার্ন করে n সংখ্যক আইটেম থেকে k-এলিমেন্টের কতগুলো কম্বিনেশন বেছে নেওয়া যায়:

nCk ( n k -- m )
USING: math.combinatorics prettyprint ;

5 2 nCk .    ! => 10
6 3 nCk .    ! => 20
5 5 nCk .    ! => 1

nPk রিটার্ন করে n সংখ্যক আইটেম থেকে k-এলিমেন্টের ক্রমযুক্ত নির্বাচন (পারমিউটেশন) কতভাবে করা যায়। যেহেতু ক্রম গুরুত্বপূর্ণ, তাই এই গণনা সংশ্লিষ্ট nCk-এর চেয়ে কম হতে পারে না:

nPk ( n k -- m )
5 2 nPk .    ! => 20
6 3 nPk .    ! => 120

কম্বিনেশন তালিকাভুক্ত করা

all-combinations একটি সিকোয়েন্সের প্রতিটি k-এলিমেন্টের সাবসেট রিটার্ন করে। প্রতিটি কম্বিনেশনের ভেতরের এলিমেন্টগুলো তাদের আসল ক্রম অটুট রাখে, আর কম্বিনেশনগুলো লেক্সিকোগ্রাফিক ক্রমে ফিরে আসে:

all-combinations ( seq k -- combinations )
{ 1 2 3 } 2 all-combinations .
! => { { 1 2 } { 1 3 } { 2 3 } }

যখন আপনি প্রতিটি কম্বিনেশন সবগুলো একসাথে জমা না করে যেভাবে তৈরি হচ্ছে সেভাবেই প্রসেস করতে চান, তখন স্ট্রিমিং রূপ each-combination ব্যবহার করুন, যা প্রতিটি কম্বিনেশন নিয়ে একটি কোয়োটেশন কল করে:

each-combination ( seq k quot -- )
{ 1 2 3 } 2 [ . ] each-combination
! => { 1 2 }
! => { 1 3 }
! => { 2 3 }

পারমিউটেশন তালিকাভুক্ত করা

all-permutations একটি সিকোয়েন্সের সম্ভাব্য প্রতিটি ক্রম রিটার্ন করে:

all-permutations ( seq -- permutations )
{ 1 2 } all-permutations .
! => { { 1 2 } { 2 1 } }

{ 1 2 3 } all-permutations .
! => { { 1 2 3 } { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 1 2 } { 3 2 1 } }

এর স্ট্রিমিং প্রতিরূপ হলো each-permutation, যা প্রতিটি ক্রম নিয়ে একটি কোয়োটেশন কল করে:

each-permutation ( seq quot -- )
{ 1 2 } [ . ] each-permutation
! => { 1 2 }
! => { 2 1 }

নির্দেশনা

Ozan একটি নিখুঁত মিক্সটেপ তৈরি করছেন: প্রথমে ঠিক করছেন কোন গানগুলো বাছাই হবে, তারপর ঠিক করছেন সেগুলো কোন ক্রমে বাজবে। mixtape-maker শব্দভান্ডারে তাঁর এই পছন্দগুলোর পেছনে থাকা সমাবেশ ও বিন্যাসের সহায়ক ফাংশনগুলো আপনি তৈরি করবেন।

1. সমাবেশ গণনা করুন

count-combinations ডিফাইন করুন যাতে এটি রিটার্ন করে, ক্রম বিবেচনা না করে n থেকে k সংখ্যক জিনিস কত উপায়ে বাছাই করা যায় তার সংখ্যা।

5 2 count-combinations .
! => 10

2. বিন্যাস গণনা করুন

count-permutations ডিফাইন করুন যাতে এটি রিটার্ন করে, ক্রম গুরুত্বপূর্ণ হলে n থেকে k সংখ্যক জিনিস কত উপায়ে বাছাই করা যায় তার সংখ্যা।

5 2 count-permutations .
! => 20

3. সমাবেশের তালিকা তৈরি করুন

list-combinations ডিফাইন করুন যাতে এটি একটি সিকোয়েন্সের k সংখ্যক এলিমেন্টের সব সমাবেশ রিটার্ন করে।

{ 1 2 3 } 2 list-combinations .
! => { { 1 2 } { 1 3 } { 2 3 } }

4. বিন্যাসের তালিকা তৈরি করুন

list-permutations ডিফাইন করুন যাতে এটি একটি সিকোয়েন্সের সব বিন্যাস রিটার্ন করে।

{ 1 2 } list-permutations .
! => { { 1 2 } { 2 1 } }

5. যেসব সমাবেশের যোগফল একটি টার্গেটের সমান

combinations-summing-to ডিফাইন করুন যাতে এটি একটি সিকোয়েন্সের শুধু সেই k-সমাবেশগুলো রিটার্ন করে, যেগুলোর এলিমেন্টগুলোর যোগফল ঠিক target হয়।

{ 1 2 3 4 } 2 5 combinations-summing-to .
! => { { 1 4 } { 2 3 } }
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Factor Exercism

মিক্সটেপ নির্মাতা শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Factor ট্র্যাকের 47টি কনসেপ্ট163টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।