Track
/
Factor
Factor
/
Esercizi
/
Creatore di mixtape
Creatore di mixtape

Creatore di mixtape

Esercizio di apprendimento

Introduzione

Il vocabolario math.combinatorics risponde a due tipi di domande su una collezione di elementi:

  • Combinazioni: in quanti modi, o in quali modi, puoi scegliere un gruppo, ignorando l'ordine?
  • Permutazioni: in quanti modi, o in quali modi, puoi disporre gli elementi, dove l'ordine conta?

Per ciascuna domanda c'è una parola di conteggio che restituisce un numero e una parola di elencazione che restituisce le selezioni effettive.

Conteggio

nCk («n choose k») restituisce quante combinazioni di k elementi si possono scegliere da n elementi:

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

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

nPk restituisce quante selezioni ordinate di k elementi (permutazioni) si possono fare da n elementi. Poiché l'ordine conta, il conteggio è almeno pari a quello del corrispondente nCk:

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

Elencare le combinazioni

all-combinations restituisce ogni sottoinsieme di k elementi di una sequenza. Gli elementi all'interno di ciascuna combinazione mantengono il loro ordine originale, e le combinazioni vengono restituite in ordine lessicografico:

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

Quando vuoi elaborare ogni combinazione man mano che viene prodotta, invece di raccoglierle tutte, usa la forma in streaming each-combination, che chiama una quotation con ciascuna combinazione:

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

Elencare le permutazioni

all-permutations restituisce ogni ordinamento di una sequenza:

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 } }

La sua controparte in streaming è each-permutation, che chiama una quotation con ciascun ordinamento:

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

Istruzioni

Ozan sta mettendo insieme la mixtape perfetta: prima decide quali canzoni entrano a far parte della selezione, poi stabilisce l'ordine in cui verranno riprodotte. Costruirai le funzioni ausiliarie di combinatoria che stanno dietro a queste scelte nel vocabulary mixtape-maker.

1. Conta le combinazioni

Definisci count-combinations in modo che restituisca in quanti modi si possono scegliere k elementi da n, ignorando l'ordine.

5 2 count-combinations .
! => 10

2. Conta le permutazioni

Definisci count-permutations in modo che restituisca in quanti modi si possono scegliere k elementi da n quando l'ordine conta.

5 2 count-permutations .
! => 20

3. Elenca le combinazioni

Definisci list-combinations in modo che restituisca ogni combinazione di k elementi di una sequenza.

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

4. Elenca le permutazioni

Definisci list-permutations in modo che restituisca ogni ordinamento di una sequenza.

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

5. Combinazioni che sommano a un obiettivo

Definisci combinations-summing-to in modo che restituisca solo le combinazioni di k elementi di una sequenza i cui elementi sommano a target.

{ 1 2 3 4 } 2 5 combinations-summing-to .
! => { { 1 4 } { 2 3 } }
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Factor Exercism

Vuoi iniziare Creatore di mixtape?

Iscriviti a Exercism per imparare e padroneggiare Factor con 47 concetti163 esercizi e il mentoring di persone reali, tutto gratis.