Parcours
/
Factor
Factor
/
Exercices
/
Wagons belges
Wagons belges

Wagons belges

Exercice d'apprentissage

Introduction

Il arrive que l'on ait besoin de voir une séquence comme une série de morceaux plutôt qu'élément par élément. Les vocabulaires grouping, splitting et splitting.monotonic t'offrent quatre façons de faire.

group : des morceaux disjoints de taille 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 longueur de la séquence n'est pas un multiple de n, le dernier groupe est plus court que n.

clump : une fenêtre glissante avec chevauchement, de taille n

clump ( seq n -- clumps )
USING: grouping ;

{ 1 2 3 4 5 } 2 clump .
! => { { 1 2 } { 2 3 } { 3 4 } { 4 5 } }

Si la séquence est plus courte que n, le résultat est vide.

split-when : découpe là où un prédicat se déclenche

split-when ( seq quot: ( elt -- ? ) -- pieces )
USING: splitting ;

{ 1 2 0 3 4 0 5 } [ zero? ] split-when .
! => { { 1 2 } { 3 4 } { 5 } }

Chaque élément fait l'objet de son propre appel au prédicat ; les éléments qui renvoient vrai sont les points de rupture et ne sont pas conservés dans le résultat.

monotonic-split : découpe les séries là où le test sur une paire adjacente échoue

monotonic-split ( seq quot: ( a b -- ? ) -- pieces )
USING: splitting.monotonic ;

{ 1 1 2 2 2 3 } [ = ] monotonic-split .
! => { { 1 1 } { 2 2 2 } { 3 } }

Le prédicat s'applique à des paires adjacentes. Tant qu'il renvoie vrai, la série se poursuit ; dès qu'il renvoie f, une nouvelle pièce commence. Avec [ = ], tu obtiens des séries d'éléments égaux ; avec [ <= ], des séries non décroissantes ; et ainsi de suite.

Quand utiliser l'un plutôt que l'autre

  • group/clump : tu connais la taille que tu veux.
  • split-when : tu sais à quoi ressemble un élément de rupture.
  • monotonic-split : tu sais ce qui fait que deux éléments adjacents vont encore ensemble.

Instructions

C'est une nouvelle nuit bien chargée à la gare de triage d'Anvers. Tu es le régulateur de service : les wagons de marchandises qui arrivent doivent être regroupés en trains au départ, les attelages inspectés, les itinéraires séparés aux jonctions et le fret identique regroupé pour la facturation.

Chaque wagon est une string qui indique ce qu'il transporte : "coal", "timber", "crates", etc.

1. Atteler des wagons en trains

Définis couple pour qu'elle prenne un tableau de wagons et une longueur n, et renvoie des trains de n wagons qui ne se chevauchent pas. Le dernier train peut être plus court si le total ne se divise pas de manière égale.

{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }

2. Jeter un œil aux attelages

Définis peek-couplings pour qu'elle prenne un tableau de wagons et renvoie chaque paire adjacente, afin que l'inspecteur puisse examiner chaque attelage.

{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }

3. Séparer la rame aux jonctions

Définis split-at-junctions pour qu'elle prenne un tableau de wagons et un tableau de junctions (les wagons qui marquent un point de rupture), et renvoie les tronçons entre les wagons de jonction. Les wagons de jonction eux-mêmes ne sont pas conservés.

{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }

4. Regrouper le fret identique

Définis coalesce-cargo pour qu'elle prenne un tableau de wagons et regroupe en séries les wagons consécutifs qui transportent le même fret.

{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Factor Exercism

Prêt à commencer Wagons belges ?

Inscris-toi sur Exercism pour apprendre et maîtriser Factor avec 47 concepts163 exercices, et un vrai mentorat humain, le tout gratuitement.