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éclenchesplit-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 échouemonotonic-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.
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.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.
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" } }
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" } }
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" } }
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" } }
Inscris-toi sur Exercism pour apprendre et maîtriser Factor avec 47 concepts163 exercices, et un vrai mentorat humain, le tout gratuitement.