مسیرها
/
Factor
Factor
/
تمرین‌ها
/
سازندهی میکستیپ
سازندهی میکستیپ

سازندهی میکستیپ

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

مقدمه

واژگان math.combinatorics به دو نوع پرسش درباره‌ی مجموعه‌ای از عنصرها پاسخ می‌دهد:

  • ترکیب‌ها: به چند روش، یا به کدام روش‌ها، می‌توانید گروهی را انتخاب کنید، بدون توجه به ترتیب؟
  • جایگشت‌ها: به چند روش، یا به کدام روش‌ها، می‌توانید عنصرها را مرتب کنید، جایی که ترتیب اهمیت دارد؟

برای هر پرسش، یک واژه‌ی شمارش هست که عددی برمی‌گرداند و یک واژه‌ی فهرست‌سازی که خود انتخاب‌ها را برمی‌گرداند.

شمارش

nCk («n انتخاب از 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 }

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

اوزان در حال آماده کردن یک میکس‌تیپ بی‌نقص است: اول تصمیم می‌گیرد کدام آهنگ‌ها انتخاب شوند و بعد ترتیب پخش آن‌ها را نهایی می‌کند. شما در واژگان mixtape-maker ابزارهای ترکیبیاتی پشت این انتخاب‌ها را می‌سازید.

1. شمارش ترکیب‌ها

تابع count-combinations را طوری تعریف کنید که بدون در نظر گرفتن ترتیب، تعداد روش‌های انتخاب k عنصر از n عنصر را برگرداند.

5 2 count-combinations .
! => 10

2. شمارش جایگشت‌ها

تابع count-permutations را طوری تعریف کنید که وقتی ترتیب مهم است، تعداد روش‌های انتخاب k عنصر از n عنصر را برگرداند.

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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.