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.
fonte
x+($1?i:0)
como o mais curto$1?x+i:x
?:
) também podem marcar o início de um símbolo , mas como um símbolo não pode começar com um dígito, tudo:0
fica bem sem espaço. Ou alguma coisa. É estranho. Os parênteses também são cruciais.t<<x+($1?i:0);i=x
primeira afirmação não mudax
, muda ? Eu acho que você precisa revertê-lo comoi=x+($1?i:0);t<<i
i=t=[]
(já quei
é garantido que não será necessário na primeira vez); simplificando a análise de tab-stop{t<<i=$2.to_i+($1?i:0)}
e eliminandol
completamente (i
já mantém esse valor). Mas o legal de não se importar com a guia deixa de aumentar estritamente: isso economiza 4 caracteres, e eu posso emprestá-la para economizar 2. #C, 228 caracteres
Aqui está uma solução C para começar. Ainda há um monte de golfe para fazer aqui (olhada em todos esses
if
s efor
s eputchar
s ...). Testado com o exemplo case de teste, bem como com a mesma entrada, mas4
e8
para a especificação da guia.fonte