¡Usuarios de sangría espacial, uníos ! ¡Debemos luchar contra todos los usuarios humildes !
Tu misión (si eliges aceptarla) es escribir un programa o función que tome dos argumentos:
- Una cadena: esta es la entrada.
- Un entero positivo: este es el número de espacios por pestaña.
Debe pasar por cada línea de la cadena y reemplazar cada pestaña utilizada para la sangría con el número dado de espacios, y cada pestaña no utilizada para la sangría (por ejemplo, en el medio de una línea) con un espacio.
Tenga en cuenta que las líneas como \t \tabc
son comportamiento no definido; fueron insertados por los usuarios malvados de la pestaña para complicar sus programas.
De acuerdo con la Sociedad Tabs Must Die, su programa debe ser lo más breve posible para evitar que los usuarios malvados lo detecten.
Ejemplo
\t
se usa para representar pestañas aquí.
Cadena de entrada:
a
\t\tb\tc
d
Número de entrada:
4
Salida:
a
b c
d
La línea media estaba sangrada por 8 espacios, 4 por pestaña (ya que el número dado era 4).
Cadena de entrada:
\ta\t\tb
Número de entrada:
4
Salida:
a b
NOTA: Esto no es un duplicado del desafío de expansión de pestañas ; requiere un formato de entrada muy diferente y requisitos ligeramente diferentes.
fuente
\ta\t\tb
,4
(mi revisión anterior estaba fallando que uno)Respuestas:
CJam,
302423 bytesNormalmente me niego a publicar código malicioso en Internet ...
Este es un programa completo que lee la cadena de STDIN y el número como un argumento de línea de comandos.
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
Que
NA=
hace:Para el primer carácter,
N
contendrá su valor predeterminado, es decir, la cadena"\n"
.Para todos los caracteres posteriores,
N
contendrá el resultado de la última iteración, es decir, el último carácter de entrada, un carácter de espacio o una cadena de uno o más espacios.Si
N
es una cadena,NA=
selecciona el elemento en el índice 10 de N (ajuste). El resultado será un espacio o un carácter de salto de línea. Ambos son sinceros.Si N es un personaje,
NA=
presiona 1 para un salto de línea y 0 en caso contrario.Debido a lo anterior,
NA=
empujará un valor verdadero para el primer carácter, un carácter precedido por un salto de línea o un carácter precedido por una cadena de espacios (sangría que ya ha sido reemplazada).En todos los demás casos (incluido un tabulador que ha sido reemplazado por un carácter de espacio ),
NA=
generará un valor falso.fuente
K5,
5345 bytesEn acción:
Solo quiero que el registro muestre que esta pregunta es moralmente reprobable.
fuente
... this question is morally reprehensible.
`0:
y "" \ n "\`.Perl, 23 bytes
Código de 22 bytes + línea de comando de 1 bytes
¡Esperemos que no sea demasiado descarado para asumir que la entrada numérica se puede dar a través del parámetro -i! Asegúrese de reemplazar \ t en el siguiente código con el carácter de tabulación real.
Ejemplo de uso:
O por conveniencia:
Explicación:
El uso del
-p
argumento ejecutará el programa para cada línea en la entrada, luego imprimirá el resultado al final.En el ejemplo anterior, la sustitución de expresiones regulares reemplaza
\G\t
con" "x4
(un espacio repetido cuatro veces).\G
es una construcción de expresiones regulares poco conocida que coincide con la posición de la primera coincidencia si es la primera iteración, o desde la posición de la coincidencia anterior si no es la primera iteración, lo que significa que solo reemplazará todas las pestañas al comienzo de la cadena, y hazlo uno por uno. Ely/\t/ /
simplemente reemplaza todas las pestañas restantes con espacios.fuente
Julia,
6959 bytesSin golf:
¡Ahorré 10 bytes y solucioné un problema gracias a Glen O!
fuente
"hello\t\t1"
?"\t \t"
situaciones), podría hacer esto:,f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")
que utiliza una función de reemplazo y capturará todas las pestañas de sangría en un solo golpe.Haskell, 82 bytes
Entonces
g 3 "a\n\t\tb\tc\nd"
hace la cosa.fuente
Mathematica,
4237 bytesGracias a @ LegionMammal978 por múltiples sugerencias para guardar código. El primer parámetro,
#
es para el texto de entrada, el segundo parámetro,,#2
para el número de espacios por pestaña.fuente
Table[" ",{#2}]
a" "~Table~{#2}
para guardar un byte. ¿Por qué estásStringJoin
poniendo la cadena vacía en él?Ruby 49 bytes
fuente
JavaScript (ES6), 70
Usando cadenas de plantilla, la nueva línea es significativa y contada
Pruebe a ejecutar el fragmento a continuación en Firefox.
fuente
CoffeeScript, 72 bytes
(Intentando jugar golf al menos 2 mordidas más, por lo que superará la solución ES6 ... Ayuda apreciada: D)
Uso:
fuente
Retina, 42 bytes
Todas las apariciones de
.
son espacios, todas\t
son pestañas literales (1 byte) y<empty>
representa un archivo en blanco. Es solo por legibilidad. Tampoco estoy completamente seguro de que estoy haciendo el bucle correctamente, pero creo que sí. Cada línea debe colocarse en su propio archivo. Agregué 1 byte por cada archivo adicional.Se supone que la entrada está en Unary en su propia línea al final de la entrada.
Explicación
Agrego un
_
antes de la entrada Unary para delimitarlo durante el reemplazo, de modo que no elimine ninguno de la cadena de entrada. Luego, reemplazo todas las pestañas no al comienzo de una línea con un solo espacio. Luego, hago un bucle, eliminando un solo1
y agregando un solo espacio después de cada pestaña, hasta que me quedo sin entrada. Finalmente, limpio quitando las pestañas y el subrayado.fuente
Python,
7268 bytesLas pestañas son pestañas literales (1 byte), por
r'...'
lo que no es necesario. Desafortunadamente, Python requiere look-behinds / look-aheads de "ancho fijo", por lo que no puedo usarlos(?<!^|\t)
. Utiliza prácticamente el mismo método que mi solución Retina.fuente
Stax , 20 bytes
Ejecutar y depurarlo
Este programa lee la primera línea como el ancho de la sangría y el resto de la entrada como el programa.
fuente
Japt v2.0a0, 17 bytes
Intentalo
fuente
Haskell , 75 bytes
Pruébalo en línea!Esto supone que la entrada contiene solo caracteres imprimibles, así como pestañas y líneas nuevas, según lo permitido por OP en los comentarios.
Explicación:
La
#
función externa toma una cadenas
y un númerom
y llama a la función interna definida localmente#
con los mismos argumentos. Esto se hace para realizar un seguimiento delm
valor original , ya que la#
función interna cambia el número:('\t':r)#n=(' '<$[1..n])++r#n
Si encuentra una pestaña, reemplácela porn
espacios y no la cambien
.(x:r)#n=x:r#(m^sum[1|x<' '])
Si se encuentra algox
que no es una pestaña, manténgalo como está pero establezcan
el número originalm
six
es una nueva línea y de lo1
contrario. Esto se hace mediantem^sum[1|x<' ']
:m
se lleva a la potencia de lasum[1|x<' ']
cual se evalúa1
cuandox
es más pequeño que un espacio (es decir, una nueva línea), por lo que obtenemosm^1 = m
. De lo contrario es0
y tenemosm^0 = 1
.fuente
Java 11, 134 bytes
Pruébalo en línea.
NOTA: Java 11 aún no está en TIO, por lo que
" ".repeat(n)
se ha emulado comorepeat(" ",n)
lugar (con el mismo número de bytes).Explicación:
fuente