Il vocabolario math.combinatorics risponde a due tipi di domande su una collezione di elementi:
Per ciascuna domanda c'è una parola di conteggio che restituisce un numero e una parola di elencazione che restituisce le selezioni effettive.
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
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 }
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 }
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.
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
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
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 } }
Definisci list-permutations in modo che restituisca ogni ordinamento di una sequenza.
{ 1 2 } list-permutations .
! => { { 1 2 } { 2 1 } }
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 } }
Iscriviti a Exercism per imparare e padroneggiare Factor con 47 concetti163 esercizi e il mentoring di persone reali, tutto gratis.