Esta vez, su tarea es implementar una variante de la expand(1)
utilidad POSIX que expande las pestañas a los espacios.
Su programa debe tomar una especificación de tabulación y luego leer la entrada en el estándar y reemplazar los caracteres de tabulación en la entrada con la cantidad adecuada de espacios para llegar a la siguiente tabulación. El resultado debe escribirse al estándar .
Especificación Tabstop
Una especificación de tabulación consta de un número único o una lista de tabulaciones separada por comas. En el caso de un número único, se repite como si se produjeran múltiplos en una lista separada por comas (es decir, 4
actúa como 4,8,12,16,20,...
). Cada entrada en una lista separada por comas es un entero positivo opcionalmente prefijado por a +
. Un +
prefijo indica una diferencia relativa con el valor anterior en la lista separada por comas. El primer valor en la lista debe ser absoluto (es decir, sin prefijo). Los tabuladores especifican la columna del siguiente carácter sin espacio (siguiendo la pestaña expandida), con la columna más a la izquierda tomada como el número 0. Los tabuladores siempre deben expandirse al menos a un espacio.
De entrada y salida
La especificación de tabulación debe tomarse como el primer parámetro de línea de comando para el programa, o leerse desde el estándar como la primera línea de entrada (terminada por una nueva línea), a su discreción. Después de que se haya leído la tabulación, la entrada restante (toda la entrada, en el caso anterior) hasta que EOF se procese y expanda. La salida expandida se escribirá en salida estándar.
Se supone que todas las pestañas expandidas y todas las entradas tienen un máximo de 80 columnas de ancho. Todas las pestañas expandidas están aumentando estrictamente.
Ejemplo
La especificación Tabstop 4,6,+2,+8
es equivalente a 4,6,8,16
, y con ambas entradas
ab<Tab>c
<Tab><Tab>d<Tab>e<Tab>f
se expande en ( ␣
indica un espacio)
ab␣␣c
␣␣␣␣␣␣d␣e␣␣␣␣␣␣␣f
01234567890123456 (Ruler for the above, not part of the output)
1111111
La puntuación es puro golf de código ; el código más corto gana.
fuente
x+($1?i:0)
como el más corto$1?x+i:x
?:
) también pueden marcar el comienzo de un símbolo , pero dado que un símbolo no puede comenzar con un dígito,:0
está bien sin espacio. O algo. Es raro. Los paréntesis son cruciales también parece.t<<x+($1?i:0);i=x
la primera declaración no cambiax
, ¿verdad? Creo que debes revertirlo comoi=x+($1?i:0);t<<i
i=t=[]
(ya quei
se garantiza que no será necesario la primera vez); simplificando el análisis tab-stop{t<<i=$2.to_i+($1?i:0)}
y eliminando porl
completo (i
ya tiene ese valor). Pero bueno, no preocuparse por que la pestaña deje de aumentar estrictamente: eso le ahorra 4 caracteres, y puedo pedirlo prestado para ahorrar 2.C, 228 caracteres
Aquí hay una solución C para comenzar las cosas. Todavía hay mucho golf por hacer aquí (mira todos esos
if
s yfor
s yputchar
s ...). Probado con el ejemplo de caso de prueba, así como con la misma entrada pero4
y8
para la pestaña de especificaciones.fuente