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 predicadosplit-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 adyacentesmonotonic-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.
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.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.
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" } }
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" } }
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" } }
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" } }
Regístrate en Exercism para aprender y dominar Factor con 47 conceptos163 ejercicios y mentoría humana real, todo gratis.