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.
la source
x+($1?i:0)
comme le plus court$1?x+i:x
?:
signe deux-points ( ) pourrait également marquer le début d'un symbole , mais comme un symbole ne peut pas commencer par un chiffre,:0
c'est OK sans espace. Ou quelque chose. C'est étrange. Les parenthèses sont cruciales aussi semble-t-il.t<<x+($1?i:0);i=x
la première déclaration ne change pasx
, n'est-ce pas? Je pense que vous devez l'inverser commei=x+($1?i:0);t<<i
i=t=[]
(car ili
est garanti de ne pas être nécessaire la première fois); simplifier l'analyse par tabulation{t<<i=$2.to_i+($1?i:0)}
et éliminerl
complètement (i
contient déjà cette valeur). Mais sympa de ne pas se soucier que la tabulation cesse d'être strictement augmentée: cela vous fait économiser 4 caractères, et je peux l'emprunter pour en économiser 2.C, 228 caractères
Voici une solution C pour commencer. Il y a encore beaucoup de golf à faire ici (regardez tous ces
if
s etfor
s etputchar
s ...). Testé avec l'exemple de testcase, ainsi qu'avec la même entrée mais4
et8
pour la spécification d'onglet.la source