Треки
/
Factor
Factor
/
Вправи
/
Творець мікстейпу
Творець мікстейпу

Творець мікстейпу

Навчальна вправа

Вступ

Бібліотека math.combinatorics відповідає на два види запитань про колекцію елементів:

  • Комбінації: скількома способами, або якими саме способами, можна вибрати групу, не враховуючи порядок?
  • Перестановки: скількома способами, або якими саме способами, можна упорядкувати елементи, де порядок має значення?

Для кожного запитання є лічильне слово, яке повертає число, і перелічувальне слово, яке повертає самі вибрані набори.

Підрахунок

nCk («n choose k») повертає, скільки 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 }

Вказівки

Озан збирає ідеальний мікстейп: спершу вирішує, які пісні потраплять до нього, а потім визначає порядок, у якому вони звучатимуть. Ми створимо допоміжні функції для комбінаторики, що стоять за його вибором, у словнику 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 вправи та справжнє наставництво від людей, і все це безкоштовно.