Trilhas
/
Factor
Factor
/
Exercícios
/
Criador de Mixtape
Criador de Mixtape

Criador de Mixtape

Exercício de aprendizagem

Introdução

O vocabulário math.combinatorics responde a dois tipos de pergunta sobre uma coleção de itens:

  • Combinações: de quantas maneiras, ou de quais maneiras, você pode escolher um grupo, ignorando a ordem?
  • Permutações: de quantas maneiras, ou de quais maneiras, você pode arranjar os itens, quando a ordem importa?

Para cada pergunta existe uma palavra de contagem, que retorna um número, e uma palavra de listagem, que retorna as seleções de fato.

Contagem

nCk ("n escolhe k") retorna quantas combinações de k elementos podem ser escolhidas entre n itens:

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

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

nPk retorna quantas seleções ordenadas de k elementos (permutações) podem ser feitas a partir de n itens. Como a ordem importa, a contagem é no mínimo tão grande quanto a do nCk correspondente:

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

Listando combinações

all-combinations retorna todos os subconjuntos de k elementos de uma sequência. Os elementos dentro de cada combinação mantêm a ordem original, e as combinações vêm em ordem lexicográfica:

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

Quando você quiser apenas processar cada combinação conforme ela é produzida, em vez de juntar todas, use a forma de streaming each-combination, que chama uma quotation com cada combinação:

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

Listando permutações

all-permutations retorna todas as ordenações de uma sequência:

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

A sua contraparte de streaming é each-permutation, que chama uma quotation com cada ordenação:

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

Instruções

Ozan está montando a mixtape perfeita: primeiro ele decide quais músicas entram, depois define a ordem em que elas tocam. Você vai construir os auxiliares de combinatória por trás das escolhas dele no vocabulário mixtape-maker.

1. Contar combinações

Defina count-combinations para retornar de quantas maneiras k itens podem ser escolhidos entre n, ignorando a ordem.

5 2 count-combinations .
! => 10

2. Contar permutações

Defina count-permutations para retornar de quantas maneiras k itens podem ser escolhidos entre n quando a ordem importa.

5 2 count-permutations .
! => 20

3. Listar combinações

Defina list-combinations para retornar cada combinação de k elementos de uma sequência.

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

4. Listar permutações

Defina list-permutations para retornar todas as ordenações de uma sequência.

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

5. Combinações que somam um alvo

Defina combinations-summing-to para retornar apenas as combinações de k elementos de uma sequência cujos elementos somam target.

{ 1 2 3 4 } 2 5 combinations-summing-to .
! => { { 1 4 } { 2 3 } }
Editar via GitHub O link abre em uma nova janela ou aba
Factor Exercism

Tudo pronto para começar Criador de Mixtape?

Crie sua conta no Exercism para aprender e dominar Factor com 47 conceitos163 exercícios e mentoria humana de verdade, tudo de graça.