Às vezes você precisa enxergar uma sequência como uma série de partes, e não elemento por elemento. Os vocabulários grouping, splitting e splitting.monotonic dão quatro maneiras de fazer isso.
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 múltiplo de n, o último bloco fica menor 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 menor que n, o resultado é vazio.
split-when: quebra 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 recebe sua própria chamada do predicado; os elementos verdadeiros são os pontos de quebra e não são mantidos no resultado.
monotonic-split: quebra trechos onde a 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 roda sobre pares adjacentes. Enquanto ele retorna verdadeiro, o trecho continua; quando retorna f, um novo trecho começa. Com [ = ] você obtém trechos de elementos iguais; com [ <= ], trechos não decrescentes; e assim por diante.
group/clump: você sabe o tamanho que quer.split-when: você sabe como é um elemento de quebra.monotonic-split: você sabe o que faz dois elementos adjacentes continuarem juntos.É mais uma noite movimentada no pátio de manobras de Antuérpia. Você é o despachante de plantão: os vagões de carga que chegam precisam ser reagrupados em trens de saída, os engates inspecionados, as rotas divididas nas junções, e as cargas idênticas reunidas para a fatura.
Cada vagão é uma string que diz o que ele está transportando:
"coal", "timber", "crates" etc.
Defina couple para receber um array de vagões e um comprimento n, e
retornar trens que não se sobrepõem, com n vagões cada. O último trem
pode ficar menor se a quantidade não dividir por igual.
{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }
Defina peek-couplings para receber um array de vagões e retornar todos os
pares adjacentes, para que o inspetor possa examinar cada engate.
{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }
Defina split-at-junctions para receber um array de vagões e um
array de junctions (vagões que marcam um ponto de divisão), e retornar
os trechos entre os vagões de junção. Os próprios vagões de junção não são
mantidos.
{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }
Defina coalesce-cargo para receber um array de vagões e agrupar em
sequências os vagões consecutivos que carregam a mesma carga.
{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
Crie sua conta no Exercism para aprender e dominar Factor com 47 conceitos163 exercícios e mentoria humana de verdade, tudo de graça.