Rutas
/
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 solapada 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 está vacío.

split-when: corta donde se active 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 verdaderos son los puntos de corte y no se conservan en el resultado.

monotonic-split: corta las rachas cuando 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 devuelve un valor verdadero, la racha continúa; cuando devuelve f, empieza una nueva pieza. Con [ = ] obtienes rachas de elementos iguales; con [ <= ] obtienes rachas no decrecientes; y así sucesivamente.

Cuándo recurrir a cada uno

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

Instrucciones

Es otra noche ajetreada en la estación de clasificación de Amberes. Estás de guardia como jefe de circulación: hay que reagrupar los vagones de mercancías que llegan en trenes de salida, inspeccionar los enganches, dividir las rutas en las bifurcaciones y fusionar la carga idéntica para la facturación.

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

1. Acopla los vagones en trenes

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

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

2. Echa un vistazo a los enganches

Define peek-couplings para que tome un array de vagones y devuelva todos los pares adyacentes, de modo que el inspector pueda examinar cada enganche.

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

3. Divide la cadena en las bifurcaciones

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

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

4. Fusiona la carga idéntica

Define coalesce-cargo para que tome un array de vagones y agrupe en secuencias los vagones consecutivos que transportan 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 pestaña nueva
Factor Exercism

¿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.