Parcours
/
Factor
Factor
/
Exercices
/
Le créateur de mixtapes
Le créateur de mixtapes

Le créateur de mixtapes

Exercice d'apprentissage

Introduction

Le vocabulaire math.combinatorics répond à deux types de questions sur une collection d'éléments :

  • Combinaisons : de combien de façons, ou de quelles façons, peut-on choisir un groupe, sans tenir compte de l'ordre ?
  • Permutations : de combien de façons, ou de quelles façons, peut-on disposer les éléments, quand l'ordre compte ?

Pour chaque question, il existe un mot de dénombrement qui renvoie un nombre et un mot d'énumération qui renvoie les sélections elles-mêmes.

Dénombrement

nCk (« n choisit k ») renvoie le nombre de combinaisons de k éléments que l'on peut choisir parmi n éléments :

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

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

nPk renvoie le nombre de sélections ordonnées (permutations) de k éléments que l'on peut former à partir de n éléments. Comme l'ordre compte, ce total est au moins aussi grand que celui de nCk correspondant :

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

Liste les combinaisons

all-combinations renvoie tous les sous-ensembles de k éléments d'une séquence. Les éléments à l'intérieur de chaque combinaison conservent leur ordre d'origine, et les combinaisons sont renvoyées dans l'ordre lexicographique :

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

Quand tu veux seulement traiter chaque combinaison au fur et à mesure qu'elle est produite, plutôt que de les collecter toutes, utilise la forme en flux each-combination, qui appelle une quotation avec chaque combinaison :

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

Liste les permutations

all-permutations renvoie tous les ordres possibles d'une séquence :

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

Son équivalent en flux est each-permutation, qui appelle une quotation avec chaque ordre :

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

Instructions

Ozan prépare la mixtape parfaite : il choisit d'abord quels morceaux méritent d'y figurer, puis s'arrête sur l'ordre dans lequel ils passent. Tu vas construire les fonctions de combinatoire qui sous-tendent ses choix, dans le vocabulaire mixtape-maker.

1. Compter les combinaisons

Définis count-combinations pour qu'elle renvoie le nombre de façons de choisir k éléments parmi n, sans tenir compte de l'ordre.

5 2 count-combinations .
! => 10

2. Compter les permutations

Définis count-permutations pour qu'elle renvoie le nombre de façons de choisir k éléments parmi n quand l'ordre compte.

5 2 count-permutations .
! => 20

3. Lister les combinaisons

Définis list-combinations pour qu'elle renvoie toutes les combinaisons de k éléments d'une séquence.

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

4. Lister les permutations

Définis list-permutations pour qu'elle renvoie tous les ordres possibles d'une séquence.

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

5. Combinaisons dont la somme atteint une cible

Définis combinations-summing-to pour qu'elle renvoie uniquement les combinaisons de k éléments d'une séquence dont la somme des éléments vaut target.

{ 1 2 3 4 } 2 5 combinations-summing-to .
! => { { 1 4 } { 2 3 } }
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Factor Exercism

Prêt à commencer Le créateur de mixtapes ?

Inscris-toi sur Exercism pour apprendre et maîtriser Factor avec 47 concepts163 exercices, et un vrai mentorat humain, le tout gratuitement.