Desnudarse una cuerda

48

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

  1. Primero muestra la cadena sin cambios. Luego, imprima cada paso. Comience por eliminar un espacio inicial (si corresponde, consulte la regla n. ° 2).

  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.

  3. La entrada puede no tener espacios iniciales ni finales. Si ese es el caso, envíelo como está.

  4. Utilice los métodos de E / S predeterminados de PPCG . PPCG Las lagunas predeterminadas están prohibidas.

  5. El comportamiento indefinido en la entrada vacía, o la entrada que solo contiene espacios, está bien.

  6. Puede suponer que la cadena solo contendrá caracteres del espacio imprimible ASCII ( 0x20a 0x7E).


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 .

Nathan.Eilisha Shiraini
fuente
Desde Sandbox: codegolf.meta.stackexchange.com/a/13765/71426
Nathan.Eilisha Shiraini
¿Podemos suponer que habrá al menos un personaje no espacial?
Martin Ender
2
@KevinCruijssen Solo tiene que manejar los caracteres ASCII en el espacio imprimible ( 0x20a 0x7E). Los otros son Comportamiento indefinido.
Nathan.Eilisha Shiraini
1
@KevinCruijssen Sí, no habrá un caso de prueba como este. No habrá cosas como " test\r "o " \v test"tampoco.
Nathan.Eilisha Shiraini
1
¿Es este un caso de prueba válido ".....................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)
Cinaski

Respuestas:

11

Retina , 26 bytes

{m`^ (.+)\z
$&¶$1
 $
 ¶$%`

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.

{m`^ (.+)\z
$&¶$1

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 $`.

Martin Ender
fuente
11

Python 2 , 122 107 103 102 98 95 93 91 90 88 87 bytes

s=input()+' '
a=0
while-a*s!=id:
 if a:id=s
 a=~a
 if'!'>s[a]:s=s[1+a:len(s)+a];print s

Pruébalo en línea!


Python 3 , 97 95 93 90 bytes

s=input()
a=p=print
p(s)
while s!=a:
 a=s
 if'!'>s:s=s[1:];p(s)
 if'!'>s[-1]:s=s[:-1];p(s)

Pruébalo en línea!

TFeld
fuente
Usar en s=input()lugar de una función tomaría menos bytes.
Jonathan Frech
Refiriéndose a 5. Undefined behaviour on empty input, or input that only contains spaces, is OK., 98 bytes .
Jonathan Frech
Python 3 guarda un byte.
Letra
@ JonathanFrech No había visto eso; gracias :)
TFeld
2
Puede seguir desarrollando el código Python 2 reemplazando acon la función incorporada idpara evitar tener que definirlo al principio. -2 bytes.
Letra
7

Perl 6 , 55 bytes

Guardado 3 bytes gracias a @nwellnhof.

{($_,{$++%2??S/" "$//!!S/^" "//}...*)[^.comb*2].unique}

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 operador S/(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 entre Falsey True( $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.

Ramillies
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.
nwellnhof
¡Gracias! Lo intenté [^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 ...
Ramillies
7

05AB1E , 21 15 bytes

=v¬ðQi¦=}¤ðQi¨=

Pruébalo en línea!

Explicación ^

=                 # print input
 v                # for each character in input
  ¬ðQi  }         # if the first char in the current string is a space
      ¦=          # remove it and print without popping
         ¤ðQi     # if the last char in the current string is a space
             ¨=   # remove it and print without popping
Emigna
fuente
Dang, intenté algo similar, pero por alguna razón estaba seguro de que head / tail no funcionaba con cuerdas, y estaba a punto de plantear un problema al respecto en github. Debe haber leído los registros de depuración incorrectamente. :-)
scottinet
1
@scottinet: acabo de encontrar una manera de evitar la verificación final :)
Emigna
oh ... ¿por qué no pensamos en eso antes? Dado que imprimimos condicionalmente, no es necesario repetir exactamente el número correcto de veces, solo necesitamos repetir el número de veces.
Tomo
1
@ scottinet: Sí. Es obvio cuando lo piensas, pero a veces es fácil pasar por alto esas cosas: P
Emigna
TFW, la torpe respuesta redundante
toma
7

C (gcc) , 89 84 bytes

La versión recursiva es más corta ;-)

j;f(char*s){puts(s);*s^32||puts(++s);s[j=strlen(s)-1]<33?s[j]=0,f(s):*s^32||f(s+1);}

Pruébalo en línea!

C (gcc) , 107 102 101 100 99 bytes

Ahorré 2 bytes gracias a @Jonathan Frech usando espacios y ~

i,j,k;f(char*s){for(i=~++k,puts(s);i^k;k=s[j=strlen(s)-1]<33?s[j]=0,puts(s):0)*s^32?i=0:puts(++s);}

Pruébalo en línea!

cleblanc
fuente
2
Creo que la pregunta realmente quiere que elimines espacios en lugar de puntos. Incluso hay una ventaja de usar espacios; se puede reemplazar ==46con <33que el espacio es el carácter imprimible más pequeño y sólo tiene que manejar esos.
Jonathan Frech
¿Qué hace el ++k+?
Jonathan Frech
@JonathanFrech Pre-incrementa ky agrega uno, que es equivalente a k = k + 1; i = k + 1;o i = k + 2; k = k + 1.
HyperNeutrino
Técnicamente i=k+++2funciona también, lo que hubiera usado porque se +++ve raro: P
HyperNeutrino
@HyperNeutrino Sí, sé lo que hace el operador de pre-incremento; aunque no entiendo cómo funciona el código sin él . Así que realmente estaba preguntando qué papel juega, en lugar de cómo se define.
Jonathan Frech
6

JavaScript (ES6) 92

@Upvoters: eche un vistazo a la otra respuesta JS a continuación que tiene 76 bytes de longitud

(s,q,l=2,p=0)=>{for(alert(s);l--;p=!p)s[+p&&s.length-p]<'!'&&alert(s=s.slice(!p,-p||q,l=2))}

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.

F=
(s,q,l=2,p=0)=>{for(alert(s);l--;p=!p)s[+p&&s.length-p]<'!'&&alert(s=s.slice(!p,-p||q,l=2))}

// some trick to show dots instead of spaces, for test
alert=x=>console.log(x
  .replace(/^ +/g,z=>'.'.repeat(z.length))
  .replace(/ +$/g,z=>'.'.repeat(z.length))
)

function go() {F(I.value.replace(/\./g,' '))}

go()
<input ID=I value='....yes Sir!....'> (use dot instead of space)
<button onclick='go()'>Go</button>

edc65
fuente
Puede guardar un byte al verificar el espacio con <'!'. Para que su fragmento siga funcionando, puede replaceutilizar puntos con espacios antes de pasar a su función.
Justin Mariner
@JustinMariner está bien ahora, porque OP declaró que no se esperaban caracteres menos de ''. Gracias
edc65
6

Perl 5, 32 bytes

Guardado 4 bytes debido a @Abigail .

1while s/^ /!say/e+s/ $/!say/e

Requiere -plcontado como 2, invocado con -E.

Uso de muestra

$ echo '   test   ' | perl -plE'1while s/^ /!say/e+s/ $/!say/e'
   test   
  test   
  test  
 test  
 test 
test 
test

Pruébalo en línea!

primo
fuente
No funciona correctamente para cadenas sin espacios finales.
nwellnhof
print;s/^ //&&print,s/ $//&&print while/^ | $/funciona con -nbandera, tampoco -les necesario
Nahuel Fouilleul
@nwellnhof arreglado.
primo
5

C # (.NET Core) , 192 183 182 181 179 178 bytes

-3 bytes gracias a Kevin Cruijssen

n=>{var o=n+"\n";for(var e=1;n.Trim()!=n;){if(1>(e^=1))if(n[0]<33)n=n.Remove(0,1);else continue;else if(n.TrimEnd()!=n)n=n.Remove(n.Length-1);else continue;o+=n+"\n";};return o;}

Pruébalo en línea!

alguien
fuente
Algunas cosas para jugar al golf: var e=1;while(n.Trim()!=n)-> for(var e=1;n.Trim()!=n;); if(n[0]==' ')->if(n[0]<33)
Kevin Cruijssen
He pensado en el segundo, pero ¿qué pasa si la cadena de prueba contiene nuevas líneas?
alguien
Ok, <33es posible debido a la nueva regla de OP: " Puede suponer que la cadena solo contendrá caracteres del espacio imprimible ASCII ( 0x20a 0x7E) "
Kevin Cruijssen
5

Java 8, 150 146 145 137 bytes

s->{String r=s;for(int f=0;s!=s.trim();f^=1)r+="\n"+(s=f+s.charAt(0)<33|!s.endsWith(" ")?s.substring(1):s.replaceAll(" $",""));return r;}

-4 bytes gracias a @Nevay cambiando (f<1&s.charAt(0)<33)a f+s.charAt(0)<33.
-1 byte usando el !s.trim().equals(s)truco de la respuesta C # .NET de @someone en lugar de s.matches(" .*|.* ").
-8 bytes gracias a @Nevay nuevamente al cambiar !s.trim().equals(s)a s!=s.trim(), porque String#trimdevolverá " 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 .equalsverificar el mismo valor.

Explicación:

Pruébelo aquí (o pruebe una versión más visual aquí con en #lugar de espacios).

s->{                               // Method with String as both parameter and return-type
  String r=s;                      //  Result-String (starting at the input)
  for(int f=0;                     //  Flag-integer (starting at 0)
      s!=s.trim();                 //  Loop as long as `s` contains leading/trailing spaces
      f^=1)                        //    And XOR(1) `f` after every iteration (0->1; 1->0)
    r+="\n"                        //   Append the result with a new-line
       +(                          //    Followed by:
         s=f+                      //     If `f` is 0,
             s.charAt(0)<33        //     and `s` starts with a space
           |!s.endsWith(" ")?      //     Or doesn't end with a space
            s.substring(1)         //      Remove the first leading space
           :                       //     Else:
            s.replaceAll(" $",""));//      Remove the last trailing space
                                   //  End of loop (implicit / single-line body)
  return r;                        //  Return the result-String
}                                  // End of method
Kevin Cruijssen
fuente
1
Puede usar en s=f+s.charAt(0)<33lugar de (f<1&s.charAt(0)<33)(-4 bytes).
Nevay
1
Puede usar en s!=s.trim()lugar de !s.trim().equals(s);(-8 bytes).
Nevay
4

C, 91 90 bytes

i,l;f(char*s){for(i=puts(s);i;i=(s[l=strlen(s)-1]*=s[l]>32)?i:puts(s))i=*s<33&&puts(++s);}

Pruébalo en línea!

Steadybox
fuente
4

Jalea , 16 bytes

Ḋ=⁶Ḣ$¡UµÐĿ¹Ṛƭ€QY

Pruébalo en línea!

-2 bytes gracias a Erik the Outgolfer
-1 byte gracias a millas

Explicación

Ḋ=⁶Ḣ$¡UµÐĿ¹Ṛƭ€QY  Main link
       µÐĿ        While the results are unique (collecting intermediate results), apply the last link (`µ` creates a new monadic link):
Ḋ=⁶Ḣ$¡            Remove a space from the beginning if there is one
 =⁶Ḣ$             If the first character is a space, then 1, else 0
 =                Compare each character to
  ⁶               ' '
   Ḣ              Get the first comparison
Ḋ                 Then Dequeue the string (s -> s[1:])
    ¡             That many times
     U            And reverse the string (the next time this is called, it will remove spaces from the end instead)
             €    For each string
            ƭ     Alternate between two commands:
          ¹       Identity (do nothing), and
           Ṛ      Reverse
          ¹Ṛƭ€    Correct all strings that are reversed to remove the trailing space
              Q   Remove duplicates (where there was no space to remove)
               Y  Join on newlines
Hiperneutrino
fuente
ḣ1Ḣ=⁶->=⁶Ḣ
Erik the Outgolfer
@EriktheOutgolfer Gracias, edición próxima.
HyperNeutrino
¡Buena idea con los comandos alternos de inversión / identidad!
Emigna
@ Emmigna Gracias! : DI solo quería una excusa para usar el nuevo rápido ... je: P
HyperNeutrino
ƭsolo necesita un nilad si la cadena es más larga que dos. ¹ṚƭFunciona bien aquí.
millas
3

Java (OpenJDK 8) , 161 147 146 bytes

x->{for(int l=0,r=x.length(),k=-1,u,v;((u=32-x.charAt(l)>>k)*(v=32-x.charAt(r-1)>>-1))<1;x+="\n"+x.substring(l-=k&~u|v,r+=(k=~k)&~v|u));return x;}

Pruébalo en línea!

-1 byte gracias a @Kevin Cruijssen !

x -> {
    /*
     * l: left index (inclusive)
     * r: right index (exclusive)
     * k: side to remove from, -1:=left, 0:=right
     * u: left character   0:=space, <0:=no space (-1 if k is left side)
     * v: right character  0:=space, -1:=no space
     */
    for (int l = 0, r = x.length(), k = -1, u, v;
            ((u = 32 - x.charAt(l) >> k)
           * (v = 32 - x.charAt(r - 1) >> -1)) < 1; // loop while left or right has space(s)
            x += "\n" + x.substring(                // append newline and substring
                    l -= k & ~u | v,                // inc. left  if k is left side
                                                    //               and left has space
                                                    //            or right has no space
                    r += (k = ~k) & ~v | u));       // dec. right if k is right side
                                                    //               and right has space
                                                    //            or left has no space
    return x;
}
Nevay
fuente
1
Jeje, vi tu respuesta eliminada y me preguntaba cuándo estabas por debajo de mis 150 bytes y lo recuperarías. ;)
Kevin Cruijssen
1
No estoy completamente seguro, pero creo que puedes jugar un byte cambiando (u=32-x.charAt(l)>>-1)a(u=32-x.charAt(l)>>k)
Kevin Cruijssen
@KevinCruijssen no funcionará, kes 0cada segunda iteración.
Nevay
1
Sí, pero la parte extraña es que el TIO funciona y proporciona el resultado correcto para todos los casos de prueba con este cambio u. No ocurre cuando también cambio -1a kfor v. Sin embargo, estoy confundido por qué funciona, ya kque de hecho se convertirá 0después de k=~k...: S
Kevin Cruijssen
1
@KevinCruijssen Para el k=0escenario: si a la izquierda le quedan espacios, entonces utiene el mismo valor que antes ( 0); si left no tiene espacios restantes, entonces se (k=~k)&~v|uevalúa como -1|u( ~0&-1|u), por lo tanto, el valor indefinido (negativo) de uno importa ( -1|x==-1).
Nevay
3

05AB1E , 25 17 bytes

-8 bytes tomando prestada la idea de no necesitar un cheque final de Emigna

,v2F¬ðQi¦DNiR},}R

Pruébalo en línea!

Estoy bastante seguro de que un enfoque menos directo puede superar esa solución fácilmente. Por ahora...

Explicaciones:

,v2F¬ðQi¦DNiR},}R           Full Programm
,                           Print the input string
 v                          For each char of the string
                               (we don't really care, we only need to loop
                                enough times to accomplish our task, since
                                we print conditionally we can loop more
                                times than necessary)
  2F...........}            Two times...
    ¬õQi                       Is 1st item a space?
        ¦D                        Remove 1st item + duplicate
          NiR}                    If on the second pass: reverse the list
              ,                   Pop & print with newline
               }               End If
                 R          Reverse the list
scottinet
fuente
Me gusta su enfoque con el bucle :) He estado tratando de encontrar una manera de hacer todo de una vez sin múltiples ifs, pero aún no lo he descubierto. Además, su explicación parece tener una cadena vacía en lugar de un espacio.
Emigna
¡Gracias! Arreglé la explicación, olvidé editar la parte "está vacía" cuando jugué mi código, usando en Slugar 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.
scottinet
Si intenta y hace todo de una vez (como estoy investigando actualmente), la mejor comprobación que tengo para salir del bucle es de 8 bytes ...
Emigna
3

R , 145 133 111 bytes

-12 bytes gracias a @Giuseppe, almacenando el resultado de suben una nueva variable y comprobando si ha cambiado

-22 bytes devolviendo un vector de cadenas en lugar de una cadena con líneas nuevas

function(s){L=s
while(grepl("^ | $",s)){if((x=sub("^ ","",s))!=s)L=c(L,x)
if((s=sub(" $","",x))!=x)L=c(L,s)}
L}

Pruébalo en línea!

Explicación sobre una versión parcialmente sin golf:

function(s){
  L=s                          # Initialise a vector with the original string
  while(grepl("^ | $",s)){     # While there are leading or trailing spaces...
    if((x=sub("^ ","",s))!=s){ # Check whether we can remove a leading space
      L=c(L,x)                 # If so, add the shortened string to the vector
    }
    if((s=sub(" $","",x))!=x){ # Check whether we can remove a trailing space
      L=c(L,x)                 # If so, add the shortened string to the vector
    }
  }
  L                            # Return the vector
}                              
usuario2390246
fuente
¿no puedes usar en C(s<-sub(),\n)lugar de una declaración de impresión separada? Ah, no, porsep=" "
Giuseppe
@Giuseppe Sí, creo que funciona un poco más para incluirlo todo en una sola declaración debido a la necesidad de agregarlo sep="". En la mayoría de los desafíos, el espacio final adicional no importaría, pero aquí desafortunadamente sí.
user2390246
133 bytes - algo sobre su uso subacaba de sugerir esto, IDK por qué
Giuseppe
@Giuseppe Muy elegante!
user2390246
¿Podría establecer L=sy devolver un vector de cadenas?
Giuseppe
3

Java (OpenJDK 8) , 137 125 121 120 124 bytes

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))));}

Pruébalo en línea!

Roberto Graham
fuente
¡Buena respuesta! Justo tan corto como mi respuesta de 137 bytes, pero todavía se puede campos de 12 bytes como este: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)));}
Kevin Cruijssen
Actualmente, esto no "... muestra la cadena sin cambios" y falla para la entrada con espacios iniciales y sin espacios finales.
Nevay
1
Tal vez pueda usar 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).
Nevay
3

MATL , 21 16 bytes

tnE:"t@o&)w46-?x

Esto utiliza puntos en lugar de espacios para mayor claridad. Para espacios reemplazar 46por 32.

Pruébalo en línea!

Explicación

tn      % Input (implicit). Duplicate and push length, say L
E       % Multiply by 2
:       % Push range [1 2 ... 2*L]
"       % For each k in that array
  t     %   Duplicate the string at the top of the stack
  @     %   Push k
  o     %   Parity: gives 1 or 0
  &)    %   Two-ouput indexing. Pushes the k-th entry of the string and then
        %   the rest of the string. The 1-st output is the first, the 0-th
        %   is the last (indexing is 1-based dand modular)
  w     %   Swap
  46-   %   Subtract 46, which ias ACII for '.'
  ?     %   If non-zero
    x   %     Delete sub-string that was obained by removing that entry
        %   End (implicit)
        % End (implicit)
        % Display stack (implicit)
Luis Mendo
fuente
3

Casco , 23 22 bytes

u§↑L`G`I¢e₁ȯ↔₁↔
?tI<"!

Gracias a Leo por -1 byte.

Pruébalo en línea!

Explicación

La función `G`Irealmente debería ser una función incorporada ...

?tI<"!  Helper function: remove initial space.
?  <"!  If less than the string "!",
 t      remove first character,
  I     else return as is.
u§↑L`G`I¢e₁ȯ↔₁↔  Main function.
         e       List containing
          ₁      the helper function
           ȯ↔₁↔  and the composition reverse-helper-reverse.
        ¢        Repeat it cyclically.
    `G`I         Cumulative reduce from left by function application
                 using input string as initial value.
 §↑L             Take first length(input) values.
u                Remove duplicates.
Zgarb
fuente
¡Agradable! De hecho, necesitaríamos más incorporaciones para aplicar funciones cíclicamente ... por cierto, he encontrado una forma un poco más corta de eliminar el primer espacio: tio.run/##yygtzv7/v/…
Leo
@Leo Gracias! El uso ?parece obvio en retrospectiva ...
Zgarb
3

C ++, 196 193 189 186 183 bytes

-10 bytes gracias a Jonathan Frech
-3 bytes gracias a Zacharý

#include<iostream>
#include<string>
#define D std::cout<<s<<'\n'
#define R ~-s.size()
auto u=[](auto s){D;while(s[0]<33||s[R]<33){if(s[0]<33)s.erase(0,1),D;if(s[R]<33)s.erase(R),D;}};

La compilación con MSVC requiere la desactivación de las comprobaciones SDL

HatsuPointerKun
fuente
Es posible que pueda reemplazar ==32con <33.
Jonathan Frech
No soy un maestro de C ++, ¿aunque es #include<string> realmente necesario ?
Jonathan Frech
if(...){...;D;}-> if(...)...,D;.
Jonathan Frech
@JonathanFrech Lo que hiciste allí fue específico del compilador, no garantizado por el estándar. VC ++ no puede encontrar una definición de los operadores << sin la inclusión explícita de cadena.
HatsuPointerKun
#define R ...<33, ||R){y if(R){-> #define R ...<33), ||R{y if(R{.
Jonathan Frech
2

C # (.NET Core) , 176 170 bytes

using System;s=>{Action o=()=>Console.WriteLine(s);o();Func<int>l=()=>s.Length-1;while(s!=s.Trim()){if(s[0]<33){s=s.Remove(0,1);o();}if(s[l()]<33){s=s.Remove(l());o();}}}

Pruébalo en línea!

Esta es una alternativa a la respuesta de @ alguien , y solo genera las cadenas directamente.

BgrWorker
fuente
Su programa no genera la cadena sin modificar antes de eliminar espacios.
Nathan.Eilisha Shiraini
@ Nathan.EilishaShiraini Corrigí ese error y jugué unos pocos bytes para reducir el recuento de bytes de todos modos.
BgrWorker
2

JavaScript (ES6), 76 bytes

f=(s,r,n,l=s.length)=>s[r?--l:0]<"!"?s+`
`+f(s.slice(!r,l),!r):n?s:f(s,!r,1)

Salidas como una cadena multilínea.

Casos de prueba

Usar puntos en lugar de espacios, como lo hacen la mayoría de las respuestas.

Justin Mariner
fuente
2

Octava , 88 83 bytes

¡5 bytes de descuento gracias a Stewie Griffin!

x=[input('') 0];for p=mod(1:sum(x),2)if x(~p+end*p)<33,disp(x=x(2-p:end-p)),end,end

Pruébalo en línea!

Luis Mendo
fuente
Muy agradable. "De todos modos, mira si puedes eliminar un par de bytes " :-P
Stewie Griffin
@StewieGriffin quise decir en su respuesta ... :-D Buena idea, gracias!
Luis Mendo
Podría eliminar el mío ... Es tan poco inspirado en comparación con esto ...
Stewie Griffin
@StewieGriffin Aquí hay una idea para eliminar dos bytes . Lástima que minse necesita por sser reducido dinámicamente
Luis Mendo
2

Código de máquina x86 para Linux, 60 bytes

e8 1f 00 00 00 31 c0 80 3f 20 75 09 47 4d 74 10
e8 0f 00 00 00 80 7c 2f ff 20 74 05 84 c0 75 e5
c3 4d eb dc 6a 04 58 50 31 db 43 89 f9 89 ea cd
80 58 6a 0a 89 e1 89 da cd 80 58 c3

Esta es una función para Linux x86. Toma como puntero de entrada a la cadena ediy la longitud de la cadena ebp.

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):

format ELF executable
segment executable
SYS_WRITE = 4
    jmp     callUndress
; -------------------- the function itself --------------------------------
; Input:
;   edi=string
;   ebp=length
undress:
undressLoopPrint:
    call    print
undressLoop:
    xor     eax, eax    ; flag of having printed anything on this iteration
    cmp     byte [edi], ' '
    jne     startsWithoutSpace
    inc     edi
    dec     ebp
    jz      quit
    call    print
startsWithoutSpace:
    cmp     byte [edi+ebp-1], ' '
    je      endsWithSpace
    test    al, al      ; if print has been called, then we have 0x0a in eax
    jnz     undressLoop
quit:
    ret
endsWithSpace:
    dec     ebp
    jmp     undressLoopPrint
print:
    push    SYS_WRITE
    pop     eax
    push    eax
    xor     ebx, ebx
    inc     ebx ; STDOUT
    mov     ecx, edi
    mov     edx, ebp
    int     0x80
    pop     eax
    push    0x0a    ; will print newline
    mov     ecx, esp
    mov     edx, ebx ; STDOUT=1, which coincides with the length of newline
    int     0x80
    pop     eax
    ret
; --------------------- end undress ---------------------------------------
SYS_EXIT = 1
STDERR = 2
callUndress:
    pop     eax     ; argc
    cmp     eax, 2
    jne     badArgc
    pop     eax     ; argv[0]
    pop     edi
    mov     al, 0
    cld
    mov     ecx, -1
    repne   scasb
    lea     edi, [edi+ecx+1] ; argv[1]
    neg     ecx
    sub     ecx, 2
    mov     ebp, ecx     ; strlen(argv[1])
    call    undress
    xor     ebx, ebx
exit:
    mov     eax, SYS_EXIT
    int     0x80
    ud2
badArgc:
    mov     esi, eax
    mov     eax, SYS_WRITE
    mov     ebx, STDERR
    mov     ecx, badArgcMsg
    mov     edx, badArgcMsgLen
    int     0x80
    mov     ebx, esi
    neg     ebx
    jmp     exit
badArgcMsg:
    db      "Usage: undress YourString",0x0a,0
badArgcMsgLen = $-badArgcMsg
segment readable writable
string:
    db      100 dup(0)
    stringLen = $-string
Ruslan
fuente
sys_write()hace que eaxno sea cero (específicamente 1, el número de caracteres escritos, suponiendo que no lo sea -errno), así será printsi no lo hace pop eaxal final. Podría justo xor eax,eaxantes de cmp byte [edi], ' 'y guardar el mov al,1, y tal vez algunos eaxguardar / restaurar. Aunque en realidad no lo guardas hasta después de golpear con SYS_WRITE. Hmm, en lugar de 0, podrías usar SYS_WRITEvs. 1, ya que cmp al, imm8es del mismo tamaño que test al,al.
Peter Cordes
¿Puedes poner un '\n'en la matriz en mov byte [ecx + edx], '\n'lugar de hacer el segundo write()? (¿Y disminuir la longitud después de imprimir?) Podría ahorrarle algunas instrucciones.
Peter Cordes
De hecho, print()actualmente las hojas '\n'en eax, que es diferente de SYS_WRITE, por lo que aún podrían comprobar que. Pensé que estabas guardando / restaurando eax, 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 uso mov al, SYS_WRITE.
Peter Cordes
@PeterCordes en realidad sí, mov al, 1fue extraño. -2 bytes ahora, gracias.
Ruslan
Una convención de llamadas de registro le ahorraría las instrucciones de carga. En code-golf, una convención de llamadas personalizada suele ser un juego justo para asm. OTOH, si prefieres jugar a la convención de llamadas estándar de stack-args, también es interesante.
Peter Cordes
2

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?

$s=" $argn";while($r!=$s){$r=$s;if($s[0]==" ")echo($s=substr($s,1))."
";if($s[-1]==" ")echo($s=substr($s,0,-1))."
";}

Pruébalo en línea!

XMark
fuente
1
Usando su método se pueden reducir 6 bytes: ¡ Pruébelo en línea!
Noche2
1
Puede omitir la etiqueta de apertura de PHP ya que puede ejecutarla con un comando como este: php -r "echo 1;"Pero si desea usar algo como <?=1;, debe incluir la etiqueta en el recuento de bytes.
Noche2
1

Pyth , 28 bytes

QW<lrKQ6lQ=hZ?&%Z2qdhQ=tQ=PQ

Pruébalo aquí! o Verifique todos los casos de prueba!

Explicación

QW<lrKQ6lQ=hZ?&%Z2qdhQ=tQ=PQ   ~ Full program. Q is autoinitialized to input.

Q                              ~ Output the input.
 W<lrKQ6lQ                     ~ Loop while the condition is met.
  <                            ~ Is smaller?
   lrKQ6                       ~ The length of the original input, stripped on both sides.
        lQ                     ~ The length of the current Q.
          =hZ                  ~ Increment a variable Z, initially 0
             ?&%Z2qdhQ         ~ If Z % 2 == 1 and Q[0] == " ", then:
                      =tQ      ~ Make Q equal to Q[1:] and output, else:
                         =PQ   ~ Make Q equal to Q[:-1] and output.
Sr. Xcoder
fuente
1

Python 2 , 79 bytes

-1 byte gracias a @JonathanFrech

f=lambda s,i=1:[s]+(s>i*'!'and'!'>s[-1]and f(s[:-1])or'!'>s and f(s[1:],0)or[])

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.

Felipe Nardi Batista
fuente
'!'*i and -> i*'!'and .
Jonathan Frech
1

C # - una vez más, 125 bytes

while(s.Trim()!=s){if(s[0]==' '){yield return s=s.Substring(1);}if(s.Last()==' '){yield return s=s.Substring(0,s.Length-1);}}

¡Salud!

Pruébalo en línea!

Barodus
fuente
Bienvenido a PPCG!
Laikoni
1

Octava , 89 bytes

s=input('');while any(s([1,end])<33)if s(1)<33,s(1)=[],end,if s(end)<33,s(end)=[],end,end

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 endcomo variable y usar eso, pero adivina qué ...

Stewie Griffin
fuente
¿Es válido dar salida con s = ...? (La pregunta habitual, lo sé)
Luis Mendo
De todos modos, vea si puede eliminar un par de bytes :-P
Luis Mendo
1

Bash, 98 94 bytes

Guardado 4 bytes usando subshell en lugar de secuencias (bajo rendimiento)

r()(s=$1;[[ $s = $b ]]||([[ $s = $a ]]||echo "$s"
b=$a a=$s;((i=!i))&&r "${s# }"||r "${s% }"))

Primera respuesta

r(){ s=$1;[[ $s = $b ]]||{ [[ $s = $a ]]||echo "$s"
b=$a a=$s;((i=!i))&&r "${s# }"||r "${s% }";};}

Tenga en cuenta !que se debe escapar en modo interactivo

Nahuel Fouilleul
fuente