Ya sabemos cómo quitar una cadena de sus espacios.
Sin embargo, como caballeros / damas, debemos desvestirnos .
Desnudar una cuerda es lo mismo que pelarla, solo que más delicada. En lugar de eliminar todos los espacios iniciales y finales a la vez, los eliminamos uno por uno . También alternamos entre el inicio y el final, para no grabar pasos.
Ejemplo, comenzando con " codegolf "
(cinco espacios iniciales y finales):
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
Primero muestra la cadena sin cambios. Luego, imprima cada paso. Comience por eliminar un espacio inicial (si corresponde, consulte la regla n. ° 2).
La entrada puede tener un número diferente de espacios iniciales y finales. Si te quedas sin espacios en un lado, sigue desnudando el otro hasta que la cuerda quede desnuda.
La entrada puede no tener espacios iniciales ni finales. Si ese es el caso, envíelo como está.
Utilice los métodos de E / S predeterminados de PPCG . PPCG Las lagunas predeterminadas están prohibidas.
El comportamiento indefinido en la entrada vacía, o la entrada que solo contiene espacios, está bien.
Puede suponer que la cadena solo contendrá caracteres del espacio imprimible ASCII (
0x20
a0x7E
).
Ejemplos: los espacios se reemplazan por puntos .
para una mejor legibilidad:
4 leading spaces, 5 trailing: "....Yes, Sir!....."
....Yes, Sir!.....
...Yes, Sir!.....
...Yes, Sir!....
..Yes, Sir!....
..Yes, Sir!...
.Yes, Sir!...
.Yes, Sir!..
Yes, Sir!..
Yes, Sir!.
Yes, Sir!
6 leading, 3 trailing: "......Let's go golfing..."
......Let's go golfing...
.....Let's go golfing...
.....Let's go golfing..
....Let's go golfing..
....Let's go golfing.
...Let's go golfing.
...Let's go golfing
..Let's go golfing
.Let's go golfing
Let's go golfing
0 leading, 2 trailing: "Hello.."
Hello..
Hello.
Hello
0 leading, 0 trailing: "World"
World
21 leading, 5 trailing: ".....................a....."
.....................a.....
....................a.....
....................a....
...................a....
...................a...
..................a...
..................a..
.................a..
.................a.
................a.
................a
...............a
..............a
.............a
............a
...........a
..........a
.........a
........a
.......a
......a
.....a
....a
...a
..a
.a
a
Un caballero / dama es conciso, por lo que gana la respuesta más corta en bytes .
0x20
a0x7E
). Los otros son Comportamiento indefinido." test\r "
o" \v test"
tampoco.".....................a....."
? Si es así, sugiero agregarlo ya que algunas respuestas parecen fallar en este tipo de prueba. (los puntos son para una mejor legibilidad, por supuesto)Respuestas:
Retina , 26 bytes
Pruébalo en línea! (El conjunto de pruebas utiliza puntos para mayor claridad. El pie de página y el encabezado los convierten hacia y desde espacios para el código principal).
Explicación
Sería bueno si pudiéramos alternar entre soltar un espacio inicial y uno posterior e imprimir el resultado intermedio cada vez. El problema es que actualmente Retina no puede imprimir condicionalmente, por lo que incluso imprimiría este resultado intermedio si no quedan espacios iniciales o finales, generando duplicados. (Retina 1.0 obtendrá una opción que solo imprime el resultado si la cadena cambió la operación, pero aún no estamos allí ...)
Entonces, en cambio, estamos creando una sola cadena que contiene todos los resultados intermedios e imprimimos eso al final.
El
{
envuelve ambas etapas del programa en un bucle que se repite hasta que la cuerda deja de cambiar (lo que significa que no están conduciendo / espacios finales izquierda). El escenario en sí coincide con un espacio inicial en la línea final de la cadena, y esa línea final, y luego vuelve a escribir la coincidencia, así como las cosas después del espacio en una nueva línea (dejando caer el espacio inicial en la copia).Eliminar el espacio final es un poco más fácil. Si solo hacemos coincidir el espacio final, podemos acceder a las cosas delante de él (en la misma línea) con las
$%`
que hay una variante consciente de la línea de la sustitución del prefijo$`
.fuente
Python 2 ,
12210710310298959391908887 bytesPruébalo en línea!
Python 3 ,
97959390 bytesPruébalo en línea!
fuente
s=input()
lugar de una función tomaría menos bytes.5. Undefined behaviour on empty input, or input that only contains spaces, is OK.
, 98 bytes .a
con la función incorporadaid
para evitar tener que definirlo al principio. -2 bytes.Perl 6 , 55 bytes
Guardado 3 bytes gracias a @nwellnhof.
Pruébalo en línea!
Explicación :
($_,{$++%2??S/" "$//!!S/^" "//}...*)
es una secuencia recursiva infinita que comienza con la cadena original ($_
) y el siguiente elemento viene dado por el bloque llamado en el elemento anterior.El bloque mismo obtiene la cadena en la
$_
variable. El operadorS/(regex)/(string)/
buscará la primera aparición de(regex)
in$_
, la reemplazará por(string)
y devolverá el resultado. Si no hay coincidencia, devuelve el contenido$_
sin cambios. Usamos el operador ternario?? !!
con la condición$++%2
, que alterna entreFalse
yTrue
($
es una variable libre que conserva su contenido a través de llamadas al bloque).En el peor de los casos (todos los espacios en un lado y 1 otro personaje), eliminamos 1 espacio cada 2 pasos. Por lo tanto, podemos estar seguros de que en pasos de 2 * (longitud de la cadena), todos los espacios se habrán eliminado. Tomamos muchos elementos de la secuencia recursiva con
[^.comb*2]
y finalmente descartamos duplicados (que ocurren cada vez que un espacio debería haberse eliminado pero no está allí) con.unique
. Esto devuelve la lista de cadenas, progresivamente despojado de espacios.fuente
[^.comb*2]
ahorra 2 bytes. Por alguna razón, esto funciona, pero[^2*.comb]
no lo hace. No tengo idea de por qué. El uso de un ternario?? !!
para seleccionar la expresión regular guarda otro byte.[^2*.comb]
y no funcionó, así que solo lo usé[0..2*.comb]
. Y gracias por el ternario, pensé que era demasiado caro y no se me ocurrió que lo reemplacé con algo aún más caro ...05AB1E ,
2115 bytesPruébalo en línea!
Explicación ^
fuente
C (gcc) ,
8984 bytesLa versión recursiva es más corta ;-)
Pruébalo en línea!
C (gcc) ,
10710210110099 bytesAhorré 2 bytes gracias a @Jonathan Frech usando espacios y ~
Pruébalo en línea!
fuente
==46
con<33
que el espacio es el carácter imprimible más pequeño y sólo tiene que manejar esos.++k+
?k
y agrega uno, que es equivalente ak = k + 1; i = k + 1;
oi = k + 2; k = k + 1
.i=k+++2
funciona también, lo que hubiera usado porque se+++
ve raro: PJavaScript (ES6) 92
@Upvoters: eche un vistazo a la otra respuesta JS a continuación que tiene 76 bytes de longitud
Un bucle que busca un espacio al frente o al final. Si lo encuentra, elimine el espacio y la cadena de salida. Si no se encuentra espacio 2 veces, deténgase.
fuente
<'!'
. Para que su fragmento siga funcionando, puedereplace
utilizar puntos con espacios antes de pasar a su función.Perl 5, 32 bytes
Guardado 4 bytes debido a @Abigail .
Requiere
-pl
contado como 2, invocado con-E
.Uso de muestra
Pruébalo en línea!
fuente
print;s/^ //&&print,s/ $//&&print while/^ | $/
funciona con-n
bandera, tampoco-l
es necesarioC # (.NET Core) ,
192183182181179178 bytes-3 bytes gracias a Kevin Cruijssen
Pruébalo en línea!
fuente
var e=1;while(n.Trim()!=n)
->for(var e=1;n.Trim()!=n;)
;if(n[0]==' ')
->if(n[0]<33)
<33
es posible debido a la nueva regla de OP: " Puede suponer que la cadena solo contendrá caracteres del espacio imprimible ASCII (0x20
a0x7E
) "Java 8,
150146145137 bytes-4 bytes gracias a @Nevay cambiando
(f<1&s.charAt(0)<33)
af+s.charAt(0)<33
.-1 byte usando el
!s.trim().equals(s)
truco de la respuesta C # .NET de @someone en lugar des.matches(" .*|.* ")
.-8 bytes gracias a @Nevay nuevamente al cambiar
!s.trim().equals(s)
as!=s.trim()
, porqueString#trim
devolverá " Una copia de esta cadena con el espacio en blanco inicial y final eliminado, o esta cadena si no tiene espacio en blanco inicial o final ", por lo tanto, la referencia permanece igual y!=
se puede usar para verificar si son la misma referencia, en lugar de.equals
verificar el mismo valor.Explicación:
Pruébelo aquí (o pruebe una versión más visual aquí con en
#
lugar de espacios).fuente
s=f+s.charAt(0)<33
lugar de(f<1&s.charAt(0)<33)
(-4 bytes).s!=s.trim()
lugar de!s.trim().equals(s);
(-8 bytes).C,
9190 bytesPruébalo en línea!
fuente
Jalea , 16 bytes
Pruébalo en línea!
-2 bytes gracias a Erik the Outgolfer
-1 byte gracias a millas
Explicación
fuente
ḣ1Ḣ=⁶
->=⁶Ḣ
ƭ
solo necesita un nilad si la cadena es más larga que dos.¹Ṛƭ
Funciona bien aquí.Ruby , 63 bytes
Pruébalo en línea!
fuente
Java (OpenJDK 8) ,
161 147146 bytesPruébalo en línea!
-1 byte gracias a @Kevin Cruijssen !
fuente
(u=32-x.charAt(l)>>-1)
a(u=32-x.charAt(l)>>k)
k
es0
cada segunda iteración.u
. No ocurre cuando también cambio-1
ak
forv
. Sin embargo, estoy confundido por qué funciona, yak
que de hecho se convertirá0
después dek=~k
...: Sk=0
escenario: si a la izquierda le quedan espacios, entoncesu
tiene el mismo valor que antes (0
); si left no tiene espacios restantes, entonces se(k=~k)&~v|u
evalúa como-1|u
(~0&-1|u
), por lo tanto, el valor indefinido (negativo) deu
no importa (-1|x==-1
).05AB1E ,
2517 bytes-8 bytes tomando prestada la idea de no necesitar un cheque final de Emigna
Pruébalo en línea!
Estoy bastante seguro de que un enfoque menos directo puede superar esa solución fácilmente. Por ahora...
Explicaciones:
fuente
S
lugar de#
(-1 byte). El bucle ... bueno ... ahorra un enorme 1 byte en comparación con un enfoque directo. Actualmente estoy buscando una forma más corta de detectar el final de la tarea (5 bytes para esto es mucho), y también estoy considerando un enfoque completamente diferente. Creo que hay una forma más inteligente de resolver este desafío.R ,
145133111 bytes-12 bytes gracias a @Giuseppe, almacenando el resultado de
sub
en una nueva variable y comprobando si ha cambiado-22 bytes devolviendo un vector de cadenas en lugar de una cadena con líneas nuevas
Pruébalo en línea!
Explicación sobre una versión parcialmente sin golf:
fuente
C(s<-sub(),\n)
lugar de una declaración de impresión separada? Ah, no, porsep=" "
sep=""
. En la mayoría de los desafíos, el espacio final adicional no importaría, pero aquí desafortunadamente sí.sub
acaba de sugerir esto, IDK por quéL=s
y devolver un vector de cadenas?Java (OpenJDK 8) ,
137125121120124 bytesPruébalo en línea!
fuente
s->{for(int i=0;s!=s.trim();)System.out.println(s=s.substring(s.charAt(0)<33?1-i%2:0,s.length()-(s.endsWith(" ")?i++%2:0)));}
s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}
(124 bytes) (parece ser correcto pero no probó mucho).MATL ,
2116 bytesEsto utiliza puntos en lugar de espacios para mayor claridad. Para espacios reemplazar
46
por32
.Pruébalo en línea!
Explicación
fuente
Casco ,
2322 bytesGracias a Leo por -1 byte.
Pruébalo en línea!
Explicación
La función
`G`I
realmente debería ser una función incorporada ...fuente
?
parece obvio en retrospectiva ...C ++,
196193189186183 bytes-10 bytes gracias a Jonathan Frech
-3 bytes gracias a Zacharý
La compilación con MSVC requiere la desactivación de las comprobaciones SDL
fuente
==32
con<33
.#include<string>
realmente necesario ?if(...){...;D;}
->if(...)...,D;
.#define R ...<33
,||R){
yif(R){
->#define R ...<33)
,||R{
yif(R{
.C # (.NET Core) ,
176170 bytesPruébalo en línea!
Esta es una alternativa a la respuesta de @ alguien , y solo genera las cadenas directamente.
fuente
JavaScript (ES6), 76 bytes
Salidas como una cadena multilínea.
Casos de prueba
Usar puntos en lugar de espacios, como lo hacen la mayoría de las respuestas.
Mostrar fragmento de código
fuente
Sed, 24 bytes
¡Pruébelo en línea!
fuente
Octava ,
8883 bytes¡5 bytes de descuento gracias a Stewie Griffin!
Pruébalo en línea!
fuente
min
se necesita pors
ser reducido dinámicamenteCódigo de máquina x86 para Linux, 60 bytes
Esta es una función para Linux x86. Toma como puntero de entrada a la cadena
edi
y la longitud de la cadenaebp
.Sin protección, con alguna infraestructura para probar (compilar con FASM, ejecutar con la cadena como argumento del programa; buscar la
undress:
etiqueta para el código de función real):fuente
sys_write()
hace queeax
no sea cero (específicamente1
, el número de caracteres escritos, suponiendo que no lo sea-errno
), así seráprint
si no lo hacepop eax
al final. Podría justoxor eax,eax
antes decmp byte [edi], ' '
y guardar elmov al,1
, y tal vez algunoseax
guardar / restaurar. Aunque en realidad no lo guardas hasta después de golpear conSYS_WRITE
. Hmm, en lugar de0
, podrías usarSYS_WRITE
vs.1
, ya quecmp al, imm8
es del mismo tamaño quetest al,al
.'\n'
en la matriz enmov byte [ecx + edx], '\n'
lugar de hacer el segundowrite()
? (¿Y disminuir la longitud después de imprimir?) Podría ahorrarle algunas instrucciones.print()
actualmente las hojas'\n'
eneax
, que es diferente deSYS_WRITE
, por lo que aún podrían comprobar que. Pensé que estabas guardando / restaurandoeax
, pero eso era solo guardar bytes copiando una constante. Para cadenas largas,sys_write()
puede dejar los bytes altos de eax distintos de cero, por lo que desafortunadamente se descarta el solo usomov al, SYS_WRITE
.mov al, 1
fue extraño. -2 bytes ahora, gracias.PHP , 117 bytes
Agrego un espacio adicional al inicio para que lo saque y muestre el original sin ningún código adicional.
Un poco nuevo en esto ... ¿el <? Php y el espacio al comienzo del archivo PHP agregarían 6 bytes adicionales o lo obtengo gratis?
Pruébalo en línea!
fuente
php -r "echo 1;"
Pero si desea usar algo como<?=1;
, debe incluir la etiqueta en el recuento de bytes.Pyth , 28 bytes
Pruébalo aquí! o Verifique todos los casos de prueba!
Explicación
fuente
Python 2 , 79 bytes
-1 byte gracias a @JonathanFrech
Pruébalo en línea!
El traje de prueba se reemplaza
"."
por" "
antes de llamar a la función y se reemplaza" "
por"."
antes de imprimir los resultados para mayor claridad.fuente
'!'*i and
->i*'!'and
.C # - una vez más, 125 bytes
¡Salud!
Pruébalo en línea!
fuente
Octava , 89 bytes
Pruébalo en línea!
Agregaré una explicación más tarde, cuando tenga tiempo. Podría cambiar algunos bytes si cambio el enfoque por completo, pero desafortunadamente no puedo ver cómo.
Las últimas letras aquí deletrean: "submitendendend". Desearía que hubiera una manera de almacenar
end
como variable y usar eso, pero adivina qué ...fuente
s = ...
? (La pregunta habitual, lo sé)Bash,
9894 bytesGuardado 4 bytes usando subshell en lugar de secuencias (bajo rendimiento)
Primera respuesta
Tenga en cuenta
!
que se debe escapar en modo interactivofuente