Al codificar en Python, a veces desea una cadena multilínea dentro de una función, por ejemplo
def f():
s = """\
Line 1
Line 2
Line 3"""
(La barra diagonal inversa es eliminar una nueva línea principal)
s
Sin embargo, si intenta imprimir realmente , obtendrá
Line 1
Line 2
Line 3
¡Eso no es lo que queremos en absoluto! ¡Hay demasiado espacio en blanco!
El reto
Dada una cadena de varias líneas que consta solo de caracteres alfanuméricos, espacios y líneas nuevas, elimine todos los espacios comunes desde el principio de cada línea. Se garantiza que cada línea tendrá al menos un carácter que no sea espacio, y no tendrá espacios finales. La salida puede no tener espacios en blanco extraños, ya sea antes o después de la salida completa o una línea individual (con la excepción de una nueva línea final opcional).
La entrada puede ser a través de STDIN o argumento de función, y la salida puede ser a través de STDOUT o valor de retorno de función. No puede usar ningún builtins diseñado para abollar cadenas multilínea o realizar esta tarea exacta, por ejemplo, Python textwrap.dedent
.
Este es el código de golf , por lo que gana la solución en la menor cantidad de bytes. Se aplican lagunas estándar .
Casos de prueba
"a" -> "a"
" abc" -> "abc"
" abc\n def\n ghi" -> " abc\ndef\n ghi"
" a\n b\n c" -> "a\nb\nc"
" a\n b\n c\nd" -> " a\n b\n c\nd"
" a b\n c d\n e f" -> "a b\n c d\n e f"
Por ejemplo, el último caso de prueba es
a b
c d
e f
y debería verse así después de quitar los espacios iniciales:
a b
c d
e f
fuente
Respuestas:
CJam,
2014 bytesalgoritmo :
qN/_
)z{S-}#
)f>
)N*
)Expansión de código
Pruébalo en línea aquí
fuente
Pyth,
19181714 bytesLa implementación es bastante buena.
u .z
agarra todas las líneas de stdin en una matriz, lo pone dentroG
. Luego evalúa el cuerpo interno, coloca el resultadoG
y continúa haciéndolo hasta que ya no cambia (punto fijo).!rhCG6
se transponeG
, obtiene el primer elemento de la matriz transpuesta (la primera columna), lo despoja de cualquier espacio en blanco y comprueba si quedan caracteres que no sean espacios en blanco.El valor de 2 es un booleano, que puede verse como un int 0 o 1.
>R G
toma este número y corta esa cantidad de caracteres a la izquierda de cada líneaG
. Los pasos 1, 2 y 3 combinados básicamente significan que seguirá quitando columnas de espacios en blanco hasta que no quede una columna de espacios en blanco pura.jb
une el conjunto de líneas por líneas nuevas y lo imprime.fuente
sed - 26 bytes
corre con
-rz
Muy claro:
-r
La opción activa expresiones regulares extendidas,-z
lee la entrada completa como una sola cadena (en realidad usa el byte NUL como delimitador de línea)fuente
:;N;$!b
o similar para comenzar, para reunir las líneas de entrada en un solo espacio de patrón? Editar: no, no lo haces; para eso está la-z
bandera.:;/^\S/M!s/^ //mg;t
, ahora no requiere-r
SWI-Prolog,
233223217 bytesEditar : Cambié completamente mi respuesta. Ahora usa códigos de caracteres en lugar de cadenas.
Un ejemplo de llamar a esto sería
a(` a b\n c d\n e f`).
, con comillas inversas. Es posible que necesite usar comillas dobles"
en su lugar si tiene una antigua distribución SWI-Prolog.fuente
Julia,
939281 bytesGuardado 10 bytes gracias a Glen O.
Esto crea una función sin nombre que acepta una cadena e imprime en stdout.
Ungolfed + explicación:
fuente
minimum([length(search(j, r"^ +")) for j in p])+1
usarminimum([search(j,r"[^ ]")[1]for j=p])
. Dado que el desafío establece que todas las líneas tendrán texto sin espacio, es seguro y le ahorra 9 bytes (incluidos 3 guardados mediante el uso en=
lugar de `en). Still looking to see if more can be saved. (I wish I could drop the
[1]`, pero la búsqueda produce una matriz de enumerador de tipo Any, mientras que el mínimo requiere un tipo Int)s->for i=(p=split(s,"\n")) println(i[minimum([search(j,r"[^ ]")[1]for j=p]):end])end
minimum(x)
cuándox
es una matriz, usemin(x...)
, por un byte adicional guardado (voy a agregar este a mi lista de consejos de golf de Julia).\S
lugar de[^ ]
, lo que ahorra un byte.\S
es útil para mi solución.Java, 159
Porque hay una notable falta de Java ...
Es solo bucles que comparan la longitud con la longitud recortada, luego escupen subcadenas. Nada muy elegante. Para las personas con discapacidad de la barra de desplazamiento:
fuente
Perl,
4733Gracias @ThisSuitIsBlackNot por la sugerencia de usar el bucle implícito de Perl
Lo anterior se puntúa como 30 bytes para la línea de código + 3 para las
00p
banderas.Versión original, como una función:
Esto pone el argumento en
$_
, luego intenta igualar con avidez los espacios en blanco que están presentes en todas las líneas con/^( +).*(\n\1.*)*$/
: si tiene éxito,$1
ahora contiene el prefijo común más largo y ejecutamos el reemplazos/^$1//mgr
para eliminarlo desde el principio de cada línea y devolver la cadena resultante.Prueba
fuente
perl -00pe '/^( +).*(\n\1.*)*$/&&s/^$1//mg'
(30 bytes + 3 para00p
)./me
se dirige a mirar hacia arriba-00p
; gracias @ThisSuitPython 2,
867975 BytesEsto definitivamente se puede acortar un poco más, pero en este momento no está mal.
¡Gracias a xnor por guardar 4 bytes!
fuente
x.find(x.strip())
.input()
en Python 2 se atragantaría con estos datos.):
Rubí:
7773706665585740 caracteresEjecución de muestra:
fuente
f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}
?C #, 18 + 145 = 163 bytes
Requiere (18 bytes):
Método (145 bytes):
El método calcula la menor cantidad de espacios iniciales en las líneas y crea una nueva cadena compuesta de todas las líneas, con N caracteres omitidos (donde N es el número calculado previamente).
fuente
C #, 149 bytes en total
Prácticamente la misma solución que ProgramFOX, aunque el número de caracteres a recortar se calcula manualmente.
Y la función misma:
fuente
Pitón 3, 100
fuente
JavaScript, ES6,
8986 bytesEste utiliza totalmente solo la correspondencia y las sustituciones RegEx.
Como siempre, solo Firefox, desde ES6. Agregará la versión ES5 más tarde.
fuente
K, 31 bytes
Introduce una lista de cadenas e imprime el resultado en stdout.
fuente
Haskell, 52 bytes
Ejemplo de uso:
unlines.until(any(/=' ').map head)(map tail).lines $ " abc\n def\n ghi"
->" abc\ndef\n ghi\n"
Cómo funciona:
fuente
Python, 94/95
lambda (94 bytes):
def (95 bytes)
fuente
bash + sed + coreutils,
74,56, 55Datos de prueba
Responder
Salida
fuente
cut -c$[`grep -o '^ *'<<<"$s"|sort|sed q|wc -c`]-<<<"$s"
$[]
aritmética. Usarcut
para la selección de columnas es mucho mejor. Nunca lo he vistosed q
como una alternativahead -n1
, es un buen truco de golf. ¡Gracias!head -n1
vssed q
, hay unaline
herramienta en el paquete util-linux.R
118bytesUsando las maravillosas funciones de cadena de R :) Esto es similar / igual a otras soluciones ya publicadas. La entrada es a través de STDIN y gatos a STDOUT.
Prueba y explicación
fuente
Julia,
726261575449 bytesSin golf:
Solución anterior (57 bytes):
Solución original (72 bytes):
fuente
k (24 bytes)
Toma una cadena como argumento y devuelve una cadena (con una nueva línea al final).
Ejemplo:
fuente
05AB1E , 10 bytes
Pruébalo en línea!
fuente
*
repite la cadena b de una cantidad de veces? .. ¿No sabían de esa característica de*
. Normalmente hagos∍
(intercambiar y alargar) cuando quiero repetir un cierto personaje.и
produce una lista de caracteres.Gawk,
101100Por ejemplo...
Salida...
fuente
/^( +)/
→/^ +/
(entonces tendrá el valor necesario ent[0]
lugar det[1]
); cambiars==""
→!s
; eliminar el{
y}
alrededor del código despuésif
; quitar el;
antes}
; usando la función específica de Gawk para poder eliminar el código{
y sus}
alrededores después defor
:{sub(s,"",z[r]);print z[r]}
→print gensub(s,"",1,z[r])
.C GCC, 74 bytes
Solo elimina todo el espacio en blanco, no está relacionado con líneas anteriores, solicitando ayuda para finalizar. TAMBIÉN, en términos de espacios en blanco comunes, ¿el OP significa que qué línea tiene la menor cantidad de espacios iniciales, que es el número de espacios que se eliminarán de cada línea?
fuente
Apilado , no competitivo, 43 bytes
Pruébalo en línea!
Esto funciona al encontrar la cantidad de espacios al comienzo de cada línea (
'^ +'match$#'"!
), obtener el mínimo, repetir un espacio tantas veces y reemplazarlo con nada en cada línea.fuente
Vim,
33, 31 bytesPruébalo en línea!
Versión antigua:
fuente
Stax , 9 bytes
Ejecutar y depurarlo
fuente
CoffeeScript, 112 bytes
fuente
JavaScript (ES6),
10698 bytesLas nuevas líneas son necesarias y se cuentan como 1 byte cada una:
Manifestación
Al igual que con otras respuestas de ES6, solo funcionan en Firefox en este momento.
fuente
JavaScript ES6, 85 bytes
Las nuevas líneas son significativas.
Demostración ES5:
fuente
JavaScript ( ES6 ) 56
Recursivo, tratando de eliminar un espacio a la vez de cada fila hasta que se encuentre un no espacio.
Pruebe a ejecutar el fragmento a continuación: siendo ES6, solo Firefox
fuente