Trilhas
/
Factor
Factor
/
Exercícios
/
Vagões belgas
Vagões belgas

Vagões belgas

Exercício de aprendizagem

Introdução

À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 dispara

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 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 falha

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

Quando recorrer a cada um

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

Instruções

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

1. Engate os vagões em trens

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" } }

2. Dê uma espiada nos engates

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" } }

3. Divida a corrente nas junções

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" } }

4. Reúna as cargas idênticas

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" } }
Editar via GitHub O link abre em uma nova janela ou aba
Factor Exercism

Tudo pronto para começar Vagões belgas?

Crie sua conta no Exercism para aprender e dominar Factor com 47 conceitos163 exercícios e mentoria humana de verdade, tudo de graça.