Desta vez, sua tarefa é implementar uma variante do expand(1)
utilitário POSIX , que expande guias para espaços.
Seu programa é pegar uma especificação de tabstop e, em seguida, ler a entrada no padrão e substituir os caracteres de tabulação na entrada pela quantidade apropriada de espaços para alcançar o próximo tabstop. O resultado deve ser gravado no padrão .
Especificação Tabstop
Uma especificação de tabstop consiste em um único número ou em uma lista de tabstops separada por vírgula. No caso de um único número, ele é repetido como se vários deles tivessem ocorrido em uma lista separada por vírgula (ou seja, 4
atua como 4,8,12,16,20,...
). Cada entrada em uma lista separada por vírgula é um número inteiro positivo opcionalmente prefixado por a +
. Um +
prefixo indica uma diferença relativa ao valor anterior na lista separada por vírgula. O primeiro valor da lista deve ser absoluto (ou seja, sem prefixo). As paradas de tabulação especificam a coluna do próximo caractere que não é de espaço (após a guia expandida), com a coluna mais à esquerda tomada como número 0. As guias devem sempre se expandir para pelo menos um espaço.
Entrada / saída
A especificação tabstop deve ser tomada como o primeiro parâmetro de linha de comando do programa ou lida do padrão como a primeira linha de entrada (terminada por uma nova linha), a seu critério. Após a leitura do tabstop, a entrada restante (todas as entradas, no caso anterior) até o EOF deve ser processada e expandida. A saída expandida deve ser gravada na saída padrão.
Todos os tabstops expandidos e todas as entradas assumem no máximo 80 colunas de largura. Todos os tabstops expandidos estão aumentando estritamente.
Exemplo
A especificação Tabstop 4,6,+2,+8
é equivalente a 4,6,8,16
, e com a entrada
ab<Tab>c
<Tab><Tab>d<Tab>e<Tab>f
é expandido para ( ␣
indica um espaço)
ab␣␣c
␣␣␣␣␣␣d␣e␣␣␣␣␣␣␣f
01234567890123456 (Ruler for the above, not part of the output)
1111111
A pontuação é puro código-golfe ; o código mais curto vence.
x+($1?i:0)
como o mais curto$1?x+i:x
?