O vocabulário math.combinatorics responde a dois
tipos de perguntas sobre uma coleção de itens:
Para cada pergunta há uma palavra para contar, que devolve um número, e uma palavra para listar, que devolve as seleções propriamente ditas.
nCk («n escolhe k») devolve quantas combinações de k elementos se
podem escolher a partir de n itens:
nCk ( n k -- m )
USING: math.combinatorics prettyprint ;
5 2 nCk . ! => 10
6 3 nCk . ! => 20
5 5 nCk . ! => 1
nPk devolve quantas seleções ordenadas de k elementos (permutações)
se podem fazer a partir de n itens. Como a ordem importa, a contagem é
no mínimo tão grande como a do nCk correspondente:
nPk ( n k -- m )
5 2 nPk . ! => 20
6 3 nPk . ! => 120
all-combinations devolve 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 são devolvidas por ordem lexicográfica:
all-combinations ( seq k -- combinations )
{ 1 2 3 } 2 all-combinations .
! => { { 1 2 } { 1 3 } { 2 3 } }
Quando só queres processar cada combinação à medida que é produzida, em
vez de as recolher todas, usa a forma em 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 }
all-permutations devolve 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 equivalente em streaming é each-permutation, que chama uma
quotation com cada ordenação:
each-permutation ( seq quot -- )
{ 1 2 } [ . ] each-permutation
! => { 1 2 }
! => { 2 1 }
O Ozan está a preparar a mixtape perfeita: primeiro decide que músicas entram, depois escolhe a ordem em que são tocadas. Vais construir os auxiliares de combinatória por trás das suas escolhas no vocabulário mixtape-maker.
Define count-combinations para devolver de quantas formas se podem escolher k itens de entre n, ignorando a ordem.
5 2 count-combinations .
! => 10
Define count-permutations para devolver de quantas formas se podem escolher k itens de entre n quando a ordem importa.
5 2 count-permutations .
! => 20
Define list-combinations para devolver todas as combinações de k elementos de uma sequência.
{ 1 2 3 } 2 list-combinations .
! => { { 1 2 } { 1 3 } { 2 3 } }
Define list-permutations para devolver todas as ordenações de uma sequência.
{ 1 2 } list-permutations .
! => { { 1 2 } { 2 1 } }
Define combinations-summing-to para devolver 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 } }
Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.