Percursos
/
Factor
Factor
/
Exercícios
/
Vagões Belgas
Vagões Belgas

Vagões Belgas

Exercício de aprendizagem

Introdução

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

Quando usar cada um

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

Instruções

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

1. Engata os vagões em comboios

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

2. Espreita os engates

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

3. Divide a cadeia nos entroncamentos

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

4. Agrupa a carga idêntica

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" } }
Editar via GitHub A ligação abre numa nova janela ou separador
Factor Exercism

Estás pronto para começar Vagões Belgas?

Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.