واژگان 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 ابزارهای ترکیبیاتی پشت این انتخابها را میسازید.
تابع count-combinations را طوری تعریف کنید که بدون در نظر گرفتن ترتیب، تعداد روشهای انتخاب k عنصر از n عنصر را برگرداند.
5 2 count-combinations .
! => 10
تابع count-permutations را طوری تعریف کنید که وقتی ترتیب مهم است، تعداد روشهای انتخاب k عنصر از n عنصر را برگرداند.
5 2 count-permutations .
! => 20
تابع list-combinations را طوری تعریف کنید که همهی ترکیبهای k عضوی یک دنباله را برگرداند.
{ 1 2 3 } 2 list-combinations .
! => { { 1 2 } { 1 3 } { 2 3 } }
تابع list-permutations را طوری تعریف کنید که همهی ترتیبهای ممکن یک دنباله را برگرداند.
{ 1 2 } list-permutations .
! => { { 1 2 } { 2 1 } }
تابع combinations-summing-to را طوری تعریف کنید که فقط ترکیبهای k عضوی یک دنباله را برگرداند که مجموع عناصرشان برابر target است.
{ 1 2 3 4 } 2 5 combinations-summing-to .
! => { { 1 4 } { 2 3 } }