Das Vokabular math.combinatorics beantwortet zwei Arten von Fragen zu einer Sammlung von Elementen:
Zu jeder Frage gibt es ein zählendes Wort, das eine Zahl zurückgibt, und ein auflistendes Wort, das die tatsächlichen Auswahlen zurückgibt.
nCk („n wähle k") gibt zurück, wie viele k-elementige Kombinationen aus n Elementen ausgewählt werden können:
nCk ( n k -- m )
USING: math.combinatorics prettyprint ;
5 2 nCk . ! => 10
6 3 nCk . ! => 20
5 5 nCk . ! => 1
nPk gibt zurück, wie viele geordnete Auswahlen (Permutationen) mit k Elementen aus n Elementen gebildet werden können. Da die Reihenfolge zählt, ist die Anzahl mindestens so groß wie die des passenden nCk:
nPk ( n k -- m )
5 2 nPk . ! => 20
6 3 nPk . ! => 120
all-combinations gibt jede k-elementige Teilmenge einer Sequenz zurück. Die Elemente innerhalb jeder Kombination behalten ihre ursprüngliche Reihenfolge, und die Kombinationen kommen in lexikografischer Reihenfolge zurück:
all-combinations ( seq k -- combinations )
{ 1 2 3 } 2 all-combinations .
! => { { 1 2 } { 1 3 } { 2 3 } }
Wenn du jede Kombination nur verarbeiten willst, während sie entsteht, statt sie alle zu sammeln, dann verwende die streamende Form each-combination, die ein Quotation mit jeder Kombination aufruft:
each-combination ( seq k quot -- )
{ 1 2 3 } 2 [ . ] each-combination
! => { 1 2 }
! => { 1 3 }
! => { 2 3 }
all-permutations gibt jede Anordnung einer Sequenz zurück:
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 } }
Ihr streamendes Gegenstück ist each-permutation, das ein Quotation mit jeder Anordnung aufruft:
each-permutation ( seq quot -- )
{ 1 2 } [ . ] each-permutation
! => { 1 2 }
! => { 2 1 }
Ozan stellt das perfekte Mixtape zusammen: Zuerst entscheidet er, welche Songs es auf das Tape schaffen, dann legt er die Reihenfolge fest, in der sie gespielt werden. Du baust die Kombinatorik-Helfer, die hinter seinen Entscheidungen stecken, im mixtape-maker-Vokabular.
Definiere count-combinations so, dass es die Anzahl der Möglichkeiten zurückgibt, k Elemente aus n auszuwählen, ohne die Reihenfolge zu berücksichtigen.
5 2 count-combinations .
! => 10
Definiere count-permutations so, dass es die Anzahl der Möglichkeiten zurückgibt, k Elemente aus n auszuwählen, wenn die Reihenfolge eine Rolle spielt.
5 2 count-permutations .
! => 20
Definiere list-combinations so, dass es jede k-elementige Kombination einer Sequenz zurückgibt.
{ 1 2 3 } 2 list-combinations .
! => { { 1 2 } { 1 3 } { 2 3 } }
Definiere list-permutations so, dass es jede Reihenfolge einer Sequenz zurückgibt.
{ 1 2 } list-permutations .
! => { { 1 2 } { 2 1 } }
Definiere combinations-summing-to so, dass es nur die k-Kombinationen einer Sequenz zurückgibt, deren Elemente zusammen target ergeben.
{ 1 2 3 4 } 2 5 combinations-summing-to .
! => { { 1 4 } { 2 3 } }
Melde dich bei Exercism an, um Factor mit 47 Konzepte163 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.