Tracks
/
Factor
Factor
/
Übungen
/
Mixtape-Macher
Mixtape-Macher

Mixtape-Macher

Lernübung

Einführung

Das Vokabular math.combinatorics beantwortet zwei Arten von Fragen zu einer Sammlung von Elementen:

  • Kombinationen: Auf wie viele Arten, oder auf welche Arten, kannst du eine Gruppe auswählen, wobei die Reihenfolge keine Rolle spielt?
  • Permutationen: Auf wie viele Arten, oder auf welche Arten, kannst du Elemente anordnen, wobei die Reihenfolge zählt?

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.

Zählen

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

Kombinationen auflisten

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 }

Permutationen auflisten

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 }

Anleitung

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.

1. Kombinationen zählen

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

2. Permutationen zählen

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

3. Kombinationen auflisten

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

4. Permutationen auflisten

Definiere list-permutations so, dass es jede Reihenfolge einer Sequenz zurückgibt.

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

5. Kombinationen mit einer Zielsumme

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 } }
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Factor Exercism

Bereit, mit Mixtape-Macher zu starten?

Melde dich bei Exercism an, um Factor mit 47 Konzepte163 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.