^
1 N23456
+(` (.)?(\w*6)u
$1 $2
)`(.)? (\w*6)d
$1$2
.* (.).*
$1
Usages u
et d
pour monter et descendre.
Essayez-le en ligne!
Explication
Ce programme fonctionne en gardant 1N23456
derrière la séquence d'instructions. Il garde une trace du matériel actuel en laissant un espace derrière lui. Ensuite, cela prend une instruction à la fois jusqu'à ce qu'il n'y en ait plus.
^
1 N23456
Commencez par mettre 1 N23456
avant l'entrée. L'espace avant N
indique qu'il N
s'agit du rapport actuel.
+(` (.)?(\w*6)u
$1 $2
)`(.)? (\w*6)d
$1$2
Ce sont deux étapes de remplacement, regroupées et exécutées jusqu'à ce qu'elles ne modifient plus la chaîne:
(.)?(\w*6)u
$1 $2
Le premier s'occupe de passer la vitesse supérieure. Il recherchera un nombre quelconque d'engrenages après l'espace, suivi d'un a 6
, suivi de u
( u
indique l'instruction de passer à la vitesse supérieure). S'il y avait des caractères avant le 6, il remplace l'espace par le caractère immédiatement après, supprime le u
et laisse le reste de la chaîne intact. Etant donné que le 6
est obligatoire dans le match, il n’échangera l’espace avec aucun caractère avant le 6
. Il ne sera jamais échanger avec le 6
.
(.)? (\w*6)d
$1$2
La deuxième étape gère le changement de vitesse et fonctionne de manière similaire. Il recherche éventuellement un caractère avant l'espace, puis quelques autres engrenages après la fin 6
, suivis de d
. Il échange l'espace avec le caractère qui le précède, le supprime d
et laisse le reste intact. Si l'espace était au début de la chaîne, il n'y a pas de correspondance pour un caractère avant l'espace, aucun échange n'est donc effectué.
.* (.).*
$1
Quand aucun des remplacements ci-dessus ne peut plus être effectué, tous les changements de vitesse sont terminés. La ligne est débarrassée de tout sauf de l'équipement immédiatement après l'espace. Ceci est le rapport final.