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