Tracks
/
Factor
Factor
/
Ejercicios
/
Vagones belgas
Vagones belgas

Vagones belgas

Ejercicio de aprendizaje

Introducción

A veces necesitas ver una secuencia como una serie de piezas en lugar de elemento por elemento. Los vocabularios grouping, splitting y splitting.monotonic te dan cuatro formas de hacerlo.

group: fragmentos disjuntos de tamaño n

group ( seq n -- groups )
USING: grouping ;

{ 1 2 3 4 5 6 7 } 3 group .
! => { { 1 2 3 } { 4 5 6 } { 7 } }

Si la longitud de la secuencia no es múltiplo de n, el grupo final es más corto que n.

clump: ventana deslizante superpuesta de tamaño n

clump ( seq n -- clumps )
USING: grouping ;

{ 1 2 3 4 5 } 2 clump .
! => { { 1 2 } { 2 3 } { 3 4 } { 4 5 } }

Si la secuencia es más corta que n, el resultado queda vacío.

split-when: corta donde se dispare un predicado

split-when ( seq quot: ( elt -- ? ) -- pieces )
USING: splitting ;

{ 1 2 0 3 4 0 5 } [ zero? ] split-when .
! => { { 1 2 } { 3 4 } { 5 } }

Cada elemento recibe su propia llamada al predicado; los elementos truthy son los puntos de corte y no se conservan en el resultado.

monotonic-split: corta las rachas donde falla una comprobación de pares adyacentes

monotonic-split ( seq quot: ( a b -- ? ) -- pieces )
USING: splitting.monotonic ;

{ 1 1 2 2 2 3 } [ = ] monotonic-split .
! => { { 1 1 } { 2 2 2 } { 3 } }

El predicado se ejecuta sobre pares adyacentes. Mientras devuelva un valor verdadero, la racha continúa; cuando devuelve f, empieza una pieza nueva. Con [ = ] obtienes rachas de elementos iguales; con [ <= ] obtienes rachas no decrecientes; y así sucesivamente.

Cuándo usar cada uno

  • group/clump: conoces el tamaño que quieres.
  • split-when: sabes cómo se ve un elemento de corte.
  • monotonic-split: sabes qué hace que dos elementos adyacentes sigan perteneciendo juntos.

Instrucciones

Es otra noche ajetreada en el patio de maniobras de Amberes. Eres el despachador de turno: los vagones de carga que llegan hay que reagruparlos en trenes de salida, inspeccionar los enganches, dividir las rutas en los empalmes y agrupar la carga idéntica para la facturación.

Cada vagón es un string que indica lo que lleva: "coal", "timber", "crates", etc.

1. Acopla los vagones en trenes

Define couple para que reciba un array de vagones y una longitud n, y devuelva trenes de n vagones que no se solapen. El último tren puede ser más corto si la cantidad no se divide de forma exacta.

{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }

2. Asómate a los enganches

Define peek-couplings para que reciba un array de vagones y devuelva cada par adyacente, para que el inspector pueda examinar cada enganche.

{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }

3. Divide la cadena en los empalmes

Define split-at-junctions para que reciba un array de vagones y un array de junctions (vagones que marcan un punto de corte), y devuelva los tramos entre los vagones de empalme. Los propios vagones de empalme no se conservan.

{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }

4. Agrupa la carga idéntica

Define coalesce-cargo para que reciba un array de vagones y agrupe en tramos los vagones consecutivos que llevan la misma carga.

{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Factor Exercism

¿Todo listo para empezar Vagones belgas?

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