المسارات
/
Factor
Factor
/
التمارين
/
صانع الميكستيب
صانع الميكستيب

صانع الميكستيب

تمرين تعلّمي

مقدمة

مفردات math.combinatorics تجيب عن نوعين من الأسئلة حول مجموعة من العناصر:

  • التوافيق: كم طريقة، أو أي طرق، يمكنك بها اختيار مجموعة، مع تجاهل الترتيب؟
  • التباديل: كم طريقة، أو أي طرق، يمكنك بها ترتيب العناصر، حيث يهم الترتيب؟

لكل سؤال توجد كلمة عدّ تُرجع عددًا وكلمة سرد تُرجع الاختيارات الفعلية.

العدّ

تُرجع nCk (اختيار k من n) عدد التوافيق المكوّنة من k عنصرًا التي يمكن اختيارها من بين عناصر عددها n:

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

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

تُرجع nPk عدد الاختيارات المرتبة (التباديل) المكوّنة من k عنصرًا والتي يمكن إجراؤها من بين عناصر عددها n. ولأن الترتيب يهم، فإن العدد لا يقل عن العدد المقابل لـ 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 لتُرجع عدد الطرق التي يمكن بها اختيار 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.