Rutas
/
Factor
Factor
/
Ejercicios
/
Creador de mixtapes
Creador de mixtapes

Creador de mixtapes

Ejercicio de aprendizaje

Introducción

El vocabulario math.combinatorics responde a dos tipos de pregunta sobre una colección de elementos:

  • Combinaciones: ¿de cuántas maneras, o de qué maneras, puedes elegir un grupo, sin tener en cuenta el orden?
  • Permutaciones: ¿de cuántas maneras, o de qué maneras, puedes ordenar los elementos, cuando el orden importa?

Para cada pregunta hay una palabra de recuento que devuelve un número y una palabra de listado que devuelve las selecciones reales.

Recuento

nCk («n elige k») devuelve cuántas combinaciones de k elementos se pueden elegir de n elementos:

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

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

nPk devuelve cuántas selecciones ordenadas de k elementos (permutaciones) se pueden hacer a partir de n elementos. Como el orden importa, el recuento es al menos tan grande como el nCk correspondiente:

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

Listar combinaciones

all-combinations devuelve todos los subconjuntos de k elementos de una secuencia. Los elementos dentro de cada combinación mantienen su orden original, y las combinaciones se devuelven en orden lexicográfico:

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

Cuando solo quieres procesar cada combinación a medida que se produce, en lugar de recogerlas todas, usa la forma de flujo each-combination, que llama a una quotation con cada combinación:

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

Listar permutaciones

all-permutations devuelve todos los ordenamientos de una secuencia:

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

Su equivalente en flujo es each-permutation, que llama a una quotation con cada ordenamiento:

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

Instrucciones

Ozan está preparando la mixtape perfecta: primero decide qué canciones entran y después el orden en el que suenan. Vas a crear las funciones auxiliares de combinatoria que hay detrás de sus decisiones en el vocabulario mixtape-maker.

1. Contar combinaciones

Define count-combinations para que devuelva de cuántas formas se pueden elegir k elementos de entre n, sin tener en cuenta el orden.

5 2 count-combinations .
! => 10

2. Contar permutaciones

Define count-permutations para que devuelva de cuántas formas se pueden elegir k elementos de entre n cuando el orden importa.

5 2 count-permutations .
! => 20

3. Listar combinaciones

Define list-combinations para que devuelva todas las combinaciones de k elementos de una secuencia.

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

4. Listar permutaciones

Define list-permutations para que devuelva todas las ordenaciones de una secuencia.

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

5. Combinaciones que suman un objetivo

Define combinations-summing-to para que devuelva solo las combinaciones de k elementos de una secuencia cuyos elementos suman target.

{ 1 2 3 4 } 2 5 combinations-summing-to .
! => { { 1 4 } { 2 3 } }
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Factor Exercism

¿Listo para empezar Creador de mixtapes?

Regístrate en Exercism para aprender y dominar Factor con 47 conceptos163 ejercicios y mentoría humana real, todo gratis.