Votre tâche consiste cette fois à implémenter une variante de l' expand(1)
utilitaire POSIX qui étend les tabulations aux espaces.
Votre programme consiste à prendre une spécification tabstop puis à lire l'entrée sur la norme dans et à remplacer les caractères de tabulation dans l'entrée par la quantité appropriée d'espaces pour atteindre le tabstop suivant. Le résultat doit être écrit en sortie standard .
Spécification Tabstop
Une spécification tabstop se compose soit d'un numéro unique, soit d'une liste de tabstops séparés par des virgules. Dans le cas d'un nombre unique, il est répété comme si plusieurs de celui-ci se produisaient dans une liste séparée par des virgules (c'est-à-dire 4
agissant comme 4,8,12,16,20,...
). Chaque entrée dans une liste séparée par des virgules est un entier positif éventuellement préfixé par a +
. Un +
préfixe indique une différence relative par rapport à la valeur précédente dans la liste séparée par des virgules. La première valeur de la liste doit être absolue (c'est-à-dire non préfixée). Les tabstops spécifient la colonne du caractère non espace suivant (après l'onglet développé), la colonne la plus à gauche étant prise comme numéro 0. Les onglets doivent toujours s'étendre jusqu'à au moins un espace.
Entrée sortie
La spécification tabstop doit être prise comme premier paramètre de ligne de commande du programme, ou lue depuis la norme comme première ligne d'entrée (terminée par une nouvelle ligne), à votre discrétion. Après la lecture du tabstop, l'entrée restante (toutes les entrées, dans le premier cas) jusqu'à EOF doit être traitée et développée. La sortie étendue doit être écrite en sortie standard.
Tous les tabstops étendus et toutes les entrées sont supposés avoir une largeur maximale de 80 colonnes. Tous les tabstops étendus augmentent strictement.
Exemple
La spécification Tabstop 4,6,+2,+8
est équivalente à 4,6,8,16
, et avec à la fois l'entrée
ab<Tab>c
<Tab><Tab>d<Tab>e<Tab>f
est développé en ( ␣
indique un espace)
ab␣␣c
␣␣␣␣␣␣d␣e␣␣␣␣␣␣␣f
01234567890123456 (Ruler for the above, not part of the output)
1111111
La notation est du pur code-golf ; le code le plus court gagne.
x+($1?i:0)
comme le plus court$1?x+i:x
?