Por vezes, precisas de ver uma sequência como uma série de pedaços em vez de elemento a elemento. Os vocabulários grouping, splitting e splitting.monotonic dão-te quatro formas de o fazer.
group: blocos disjuntos de tamanho n
group ( seq n -- groups )
USING: grouping ;
{ 1 2 3 4 5 6 7 } 3 group .
! => { { 1 2 3 } { 4 5 6 } { 7 } }
Se o comprimento da sequência não for um múltiplo de n, o último bloco fica mais curto do que n.
clump: janela deslizante sobreposta de tamanho n
clump ( seq n -- clumps )
USING: grouping ;
{ 1 2 3 4 5 } 2 clump .
! => { { 1 2 } { 2 3 } { 3 4 } { 4 5 } }
Se a sequência for mais curta do que n, o resultado fica vazio.
split-when: divide onde um predicado disparasplit-when ( seq quot: ( elt -- ? ) -- pieces )
USING: splitting ;
{ 1 2 0 3 4 0 5 } [ zero? ] split-when .
! => { { 1 2 } { 3 4 } { 5 } }
Cada elemento tem a sua própria chamada ao predicado; os elementos que dão verdadeiro são os pontos de quebra e não ficam no resultado.
monotonic-split: divide segmentos onde uma verificação de pares adjacentes falhamonotonic-split ( seq quot: ( a b -- ? ) -- pieces )
USING: splitting.monotonic ;
{ 1 1 2 2 2 3 } [ = ] monotonic-split .
! => { { 1 1 } { 2 2 2 } { 3 } }
O predicado é aplicado a pares adjacentes. Enquanto devolve verdadeiro, o segmento continua; quando devolve f, começa um novo pedaço. Com [ = ] obténs segmentos de elementos iguais; com [ <= ] obténs segmentos não decrescentes; e assim por diante.
group/clump: sabes o tamanho que queres.split-when: sabes como é um elemento de quebra.monotonic-split: sabes o que faz com que dois elementos adjacentes continuem a pertencer ao mesmo grupo.É mais uma noite movimentada na estação de triagem de Antuérpia. És o controlador de serviço: os vagões de mercadorias que chegam têm de ser reagrupados em comboios de saída, os engates inspecionados, as rotas divididas nos entroncamentos e a carga idêntica agrupada para faturação.
Cada vagão é uma string que indica o que transporta:
"coal", "timber", "crates", etc.
Define couple de modo a receber um array de vagões e um comprimento
n, e a devolver comboios não sobrepostos de n vagões cada. O último
comboio pode ser mais curto se a contagem não for divisível.
{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }
Define peek-couplings de modo a receber um array de vagões e a devolver
todos os pares adjacentes, para que o inspetor possa examinar cada
engate.
{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }
Define split-at-junctions de modo a receber um array de vagões e um
array de junctions (vagões que marcam um ponto de quebra), e a devolver
os troços entre os vagões de entroncamento. Os próprios vagões de
entroncamento não são mantidos.
{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }
Define coalesce-cargo de modo a receber um array de vagões e a agrupar
em sequências os vagões consecutivos que transportam a mesma carga.
{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.