Spoglia una stringa


48

Ora già come rimuovere una stringa dai suoi spazi.

Tuttavia, come veri signori / signore, dovremmo piuttosto spogliarlo .


Spogliarsi di una corda equivale a toglierla, solo più delicata. Invece di rimuovere tutti gli spazi iniziali e finali contemporaneamente, li rimuoviamo uno per uno . Abbiamo inoltre si alternano tra il leader e finali, in modo da non bruciare passi.

Esempio, iniziando con " codegolf "(cinque spazi iniziali e finali):

     codegolf     
    codegolf     
    codegolf    
   codegolf    
   codegolf   
  codegolf   
  codegolf  
 codegolf  
 codegolf 
codegolf 
codegolf

  1. Prima emetti la stringa invariata. Quindi, emettere ogni passaggio. Iniziare la rimozione di un leader spazio (se applicabile - vedere la Regola # 2).

  2. L'input può avere un numero diverso di spazi iniziali e finali. Se esaurisci gli spazi da un lato, continua a spogliare l'altro fino a quando la stringa è spoglia.

  3. L'input potrebbe non avere spazi iniziali né finali. In tal caso, emettilo così com'è.

  4. Utilizzare i metodi I / O predefiniti di PPCG . Sono vietate le scappatoie predefinite PPCG .

  5. Il comportamento indefinito su input vuoto o input che contiene solo spazi, è OK.

  6. Si può presumere che la stringa conterrà solo caratteri dallo spazio stampabile ASCII ( 0x20a 0x7E).


Esempi: gli spazi vengono sostituiti da punti .per una migliore leggibilità:

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 gentiluomo / signora è conciso, quindi vince la risposta più breve in byte .



Possiamo presumere che ci sarà almeno un personaggio non spaziale?
Martin Ender,

2
@KevinCruijssen Devi solo gestire i caratteri ASCII nello spazio stampabile ( 0x20a 0x7E). Gli altri sono Undefined Behaviour.
Nathan.Eilisha Shiraini,

1
@KevinCruijssen Sì, non ci saranno casi di test come questo. Non ci saranno cose simili " test\r "o simili " \v test".
Nathan.Eilisha Shiraini,

1
È un caso di test valido ".....................a....."? In tal caso suggerisco di aggiungerlo poiché alcune risposte sembrano fallire questo tipo di test. (i punti sono per una migliore leggibilità ovviamente)
Cinaski,

Risposte:


11

Retina , 26 byte

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

Provalo online! (La suite di test utilizza i punti per maggiore chiarezza. Il piè di pagina e l'intestazione li convertono in e dagli spazi per il codice principale.)

Spiegazione

Sarebbe bello se potessimo solo alternare la caduta di uno spazio iniziale e uno finale e la stampa del risultato intermedio ogni volta. Il problema è che attualmente Retina non può stampare in modo condizionale, quindi stampa anche questo risultato intermedio se non sono rimasti spazi iniziali o finali, generando duplicati. (Retina 1.0 otterrà un'opzione che stampa il risultato solo se la stringa è stata modificata dall'operazione, ma non siamo ancora arrivati ​​...)

Quindi, invece, stiamo costruendo una singola stringa contenente tutti i risultati intermedi e stampandoli alla fine.

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

La {avvolge entrambe le fasi del programma in un ciclo che si ripete finché la corda smette di variare (che significa che non non conducono / spazi finali sinistra). Lo stage stesso corrisponde a uno spazio iniziale sull'ultima riga della stringa e a quell'ultima riga, quindi riscrive la corrispondenza e le cose dopo lo spazio su una nuova riga (eliminando così lo spazio iniziale nella copia).

 $
 ¶$%`

Rimuovere lo spazio finale è un po 'più semplice. Se abbiniamo semplicemente lo spazio finale, possiamo accedere alle cose di fronte ad esso (sulla stessa linea) con $%`cui è una variante sensibile alla linea della sostituzione del prefisso $`.


11

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

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

Provalo online!


Python 3 , 97 95 93 90 byte

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)

Provalo online!


L'utilizzo al s=input()posto di una funzione richiederebbe meno byte.
Jonathan Frech,

Riferendosi a 5. Undefined behaviour on empty input, or input that only contains spaces, is OK., 98 byte .
Jonathan Frech,


@JonathanFrech Non l'avevo visto; grazie :)
TFeld,

2
Puoi ulteriormente giocare a golf il codice Python 2 sostituendolo acon la funzione integrata idper evitare di doverlo definire all'inizio. -2 byte.
Lirico

7

Perl 6 , 55 byte

3 byte salvati grazie a @nwellnhof.

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

Provalo online!

Spiegazione : ($_,{$++%2??S/" "$//!!S/^" "//}...*)è una sequenza infinita ricorsiva che inizia con la stringa originale ( $_) e l'elemento successivo è dato dal blocco chiamato sull'elemento precedente.

Il blocco stesso ottiene la stringa nella $_variabile. L'operatore S/(regex)/(string)/cercherà la prima occorrenza di (regex)in $_, la sostituirà con (string)e restituirà il risultato. Se non vi è alcuna corrispondenza, restituisce il contenuto di $_invariato. Usiamo l'operatore ternario ?? !!con la condizione $++%2, che si alterna tra Falsee True( $è una variabile libera che conserva il suo contenuto attraverso le chiamate al blocco.)

Nel peggiore dei casi (tutti gli spazi su un lato e 1 altro personaggio), rimuoviamo 1 spazio ogni 2 passaggi. Quindi possiamo essere sicuri che in passaggi 2 * (lunghezza della stringa), tutti gli spazi saranno stati rimossi. Prendiamo molti elementi dalla sequenza ricorsiva con [^.comb*2]e infine scartiamo i duplicati (che si verificano ogni volta che uno spazio avrebbe dovuto essere rimosso ma non è lì) con .unique. Questo restituisce l'elenco delle stringhe, progressivamente spogliate degli spazi.


[^.comb*2]salva 2 byte. Per qualche motivo questo funziona, ma [^2*.comb]non lo fa. Non ho idea del perché. L'uso di un ternario ?? !!per selezionare il regex salva un altro byte.
nwellnhof,

Grazie! Ho provato [^2*.comb]e non ha funzionato, quindi l'ho usato [0..2*.comb]. E grazie per il ternario, ho solo pensato che fosse troppo costoso e non mi è venuto in mente che l'ho sostituito con qualcosa di ancora più costoso ...
Ramillies,

7

05AB1E , 21 15 byte

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

Provalo online!

Spiegazione ^

=                 # 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

Dang, ho provato qualcosa di simile ma per qualche motivo ero sicuro che la testa / coda non funzionasse sulle stringhe e stavo per sollevare un problema su Github. Deve aver letto i log di debug in modo errato. :-)
scottinet,

1
@scottinet: ho appena trovato un modo per aggirare il controllo finale :)
Emigna,

oh ... perché non ci abbiamo pensato prima? poiché stampiamo in modo condizionale non è necessario eseguire il loop esattamente il numero corretto di volte, è sufficiente eseguire il loop su un numero di volte sufficiente. Prendo in prestito l'idea per migliorare la mia risposta :-)
scottinet,

1
@scottinet: Sì. È ovvio quando ci pensi, ma a volte è facile perdere quelle cose: P
Emigna,

TFW la grossa risposta ridondante ottiene il comando ...
Erik the Outgolfer

7

C (gcc) , 89 84 byte

La versione ricorsiva è più breve ;-)

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

Provalo online!

C (gcc) , 107 102 101 100 99 byte

Salvato 2 byte grazie a @Jonathan Frech usando gli spazi e ~

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

Provalo online!


2
Penso che la domanda voglia davvero che tu rimuova gli spazi anziché i punti. C'è persino un vantaggio nell'uso degli spazi; puoi sostituirlo ==46con <33poiché lo spazio è il più piccolo carattere stampabile e devi solo gestirli.
Jonathan Frech,

Che cosa ++k+fa?
Jonathan Frech,

@JonathanFrech Pre-incrementa ke ne aggiunge uno, che è equivalente a k = k + 1; i = k + 1;o i = k + 2; k = k + 1.
HyperNeutrino,

Tecnicamente i=k+++2funziona anche quello che avrei usato perché +++sembra strano: P
HyperNeutrino,

@HyperNeutrino Sì, so cosa fa l'operatore di pre-incremento; anche se non capisco come funziona il codice senza di esso . Quindi stavo davvero chiedendo che ruolo ha, piuttosto che come è definito.
Jonathan Frech,

6

JavaScript (ES6) 92

@Upvoters: dai un'occhiata all'altra risposta JS in basso che è lunga 76 byte

(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 anello in cerca di uno spazio davanti o alla fine. Se trovato, rimuovere lo spazio e la stringa di output. Se non viene trovato spazio 2 volte, fermati.

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>


È possibile salvare un byte controllando lo spazio con <'!'. Per far funzionare ancora lo snippet, è possibile utilizzare punti replacecon spazi prima di passare alla funzione.
Justin Mariner,

@JustinMariner ora ok, perché OP ha dichiarato che nessun carattere si aspettava meno di ''. Grazie
edc65,

6

Perl 5, 32 byte

Salvato 4 byte grazie a @Abigail .

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

Richiede -plcontato come 2, invocato con -E.

Esempio di utilizzo

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

Provalo online!


Non funziona correttamente per le stringhe senza spazi finali.
nwellnhof,

print;s/^ //&&print,s/ $//&&print while/^ | $/funziona con la -nbandiera, inoltre -lnon è necessario
Nahuel Fouilleul,

@nwellnhof fixed.
primo

5

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

-3 byte grazie 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;}

Provalo online!


Alcune cose da golf: var e=1;while(n.Trim()!=n)-> for(var e=1;n.Trim()!=n;); if(n[0]==' ')->if(n[0]<33)
Kevin Cruijssen,

Ho pensato al secondo, ma cosa succede se la stringa di test contiene nuove righe?
qualcuno il

Ok, <33è possibile grazie alla nuova regola aggiunta di OP: " Puoi presumere che la stringa conterrà solo caratteri dallo spazio stampabile ASCII ( 0x20a 0x7E). "
Kevin Cruijssen,

5

Java 8, 150 146 145 137 byte

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 byte grazie a @Nevay che cambia (f<1&s.charAt(0)<33)in f+s.charAt(0)<33.
-1 byte usando il !s.trim().equals(s)trucco della risposta C # .NET di @someone invece di s.matches(" .*|.* ").
-8 byte grazie a @Nevay di nuovo cambiando !s.trim().equals(s)in s!=s.trim(), perché String#trimrestituirà " Una copia di questa stringa con spazio bianco iniziale e finale rimosso o questa stringa se non ha spazio bianco iniziale o finale ", quindi il riferimento rimane lo stesso e !=può essere utilizzato per verificare se sono lo stesso riferimento, anziché .equalsper controllare lo stesso valore.

Spiegazione:

Provalo qui (o prova una versione più visiva qui con #invece di spazi).

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

1
È possibile utilizzare s=f+s.charAt(0)<33invece di (f<1&s.charAt(0)<33)(-4 byte).
Nevay,

1
È possibile utilizzare s!=s.trim()invece di !s.trim().equals(s);(-8 byte).
Nevay,


4

Gelatina , 16 byte

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

Provalo online!

-2 byte grazie a Erik the Outgolfer
-1 byte grazie alle miglia

Spiegazione

Ḋ=⁶Ḣ$¡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

ḣ1Ḣ=⁶->=⁶Ḣ
Erik the Outgolfer,

@EriktheOutgolfer Grazie, modifica in arrivo.
HyperNeutrino,

Bella idea con i comandi alternati di reverse / identità!
Emigna,

@Emigna Grazie! : DI principalmente volevo solo una scusa per usare la nuova rapida ... heh: P
HyperNeutrino,

ƭserve solo un nilad se la catena è più lunga di due. ¹Ṛƭfunziona bene qui.
miglia


3

Java (OpenJDK 8) , 161 147 146 byte

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

Provalo online!

-1 byte grazie 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;
}

1
Hehe, ho visto la tua risposta cancellata e mi chiedevo quando eri sotto i miei 150 byte e l'avrei annullata. ;)
Kevin Cruijssen,

1
Non sono del tutto sicuro, ma penso che puoi giocare a golf un byte cambiando (u=32-x.charAt(l)>>-1)in(u=32-x.charAt(l)>>k)
Kevin Cruijssen,

@KevinCruijssen Non funzionerà, kè 0ogni seconda iterazione.
Nevay,

1
Sì, ma la parte strana è che il TIO funziona e dà il risultato corretto per tutti i casi di test con questa modifica per u. Esso non quando anche cambiare -1a kper v. Sono confuso perché funziona, dato kche diventerà davvero 0dopo k=~k..: S
Kevin Cruijssen,

1
@KevinCruijssen Per lo k=0scenario: se a sinistra rimangono spazi, allora uha lo stesso valore di before ( 0); se a sinistra non rimangono spazi, quindi (k=~k)&~v|uvaluta in -1|u( ~0&-1|u), quindi il valore indefinito (negativo) di unon importa ( -1|x==-1).
Nevay,

3

05AB1E , 25 17 byte

-8 byte prendendo in prestito l' idea di un assegno senza fine da Emigna

,v2F¬ðQi¦DNiR},}R

Provalo online!

Sono abbastanza sicuro che un approccio meno semplice possa battere facilmente quella soluzione. Per adesso...

spiegazioni:

,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

Mi piace il tuo approccio con il loop :) Ho cercato di trovare un modo per fare tutto in un passaggio senza if multipli, ma non l'ho ancora capito. Inoltre, la tua spiegazione sembra avere una stringa vuota anziché uno spazio.
Emigna,

Grazie! Ho corretto la spiegazione, ho dimenticato di modificare la parte "è vuota" quando ho giocato a golf il mio codice, usando Sinvece di #(-1 byte). Il loop ... beh ... consente di risparmiare 1 byte enorme rispetto a un approccio semplice. Attualmente sto cercando un modo più breve per rilevare la fine dell'attività (5 byte per questo è molto), e sto anche considerando un approccio completamente diverso. Penso che ci sia un modo più intelligente per risolvere questa sfida.
scottinet,

Se provi a fare tutto in un unico passaggio (come sto attualmente esaminando), il miglior controllo che ho per uscire dal loop è di 8 byte ...
Emigna,

3

R , 145 133 111 byte

-12 byte grazie a @Giuseppe, memorizzando il risultato subin una nuova variabile e verificando se è cambiato

-22 byte restituendo un vettore di stringhe anziché una stringa con newline

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}

Provalo online!

Spiegazione su una versione parzialmente non giocata:

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
}                              

non puoi usare al C(s<-sub(),\n)posto di un'istruzione di stampa separata? Ah, no, a causa disep=" "
Giuseppe,

@Giuseppe Sì, penso che funzioni un po 'più a lungo per includere tutto in una singola dichiarazione a causa della necessità di aggiungere sep="". Nella maggior parte delle sfide lo spazio aggiuntivo non avrebbe importanza, ma qui sfortunatamente lo è!
user2390246

133 byte - qualcosa sul tuo uso ha subappena suggerito questo, IDK perché
Giuseppe

@Giuseppe Molto elegante!
user2390246,

Potresti semplicemente impostare L=se restituire un vettore di stringhe?
Giuseppe,

3

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

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

Provalo online!


Bella risposta! Corto quanto la mia risposta di 137 byte, ma puoi ancora giocare a golf di 12 byte in questo modo: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,

Questo attualmente non "... emette la stringa invariata" e non riesce per l'input con spazi iniziali e senza spazi finali.
Nevay,

1
Forse puoi usare 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 byte) (sembra essere corretto ma non ha testato molto).
Nevay,

3

MATL , 21 16 byte

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

Questo utilizza punti anziché spazi per maggiore chiarezza. Per gli spazi sostituire 46con 32.

Provalo online!

Spiegazione

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)

3

Buccia , 23 22 byte

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

Grazie a Leo per -1 byte.

Provalo online!

Spiegazione

La funzione `G`Idovrebbe essere davvero integrata ...

?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.

Bello! In effetti avremmo bisogno di più builtin per applicare ciclicamente le funzioni ... a proposito, ho trovato un modo più breve per rimuovere il primo spazio: tio.run/##yygtzv7/v/…
Leo,

@Leo Grazie! L'uso ?sembra ovvio col senno di poi ...
Zgarb

3

C ++, 196 193 189 186 183 byte

-10 byte grazie a Jonathan Frech
-3 byte grazie 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 compilazione con MSVC richiede la non attivazione dei controlli SDL


Potresti essere in grado di sostituire ==32con <33.
Jonathan Frech,

Non sono un master C ++, anche se è #include<string> davvero necessario ?
Jonathan Frech,

if(...){...;D;}-> if(...)...,D;.
Jonathan Frech,

@JonathanFrech Quello che hai fatto è stato specifico del compilatore, non garantito dallo standard. VC ++ non riesce a trovare una definizione di << operatori senza l'inclusione esplicita di stringa.
HatsuPointerKun

#define R ...<33, ||R){E if(R){-> #define R ...<33), ||R{e if(R{.
Jonathan Frech,

2

C # (.NET Core) , 176 170 byte

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

Provalo online!

Questa è un'alternativa alla risposta di @ qualcuno e genera direttamente le stringhe.


Il tuo programma non genera la stringa non modificata prima di rimuovere gli spazi.
Nathan.Eilisha Shiraini,

@ Nathan.EilishaShiraini Ho corretto quell'errore e ho giocato a golf alcuni byte per ridurre il conteggio dei byte comunque.
BgrWorker,

2

JavaScript (ES6), 76 byte

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

Output come una stringa multilinea.

Casi test

Usare i punti anziché gli spazi, come fanno la maggior parte delle risposte.



2

Ottava , 88 83 byte

5 byte di sconto grazie 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

Provalo online!


Molto bella. "Comunque, vedi se riesci a rimuovere un paio di byte " :-P
Stewie Griffin,

@StewieGriffin intendevo nella tua risposta ... MrGreen Buona idea, grazie!
Luis Mendo,

Potrei cancellare il mio ... È così poco ispirato rispetto a questo ...
Stewie Griffin,

@StewieGriffin Ecco un'idea per rimuovere due byte . Peccato che minè necessario a causa della scontrazione dinamica
Luis Mendo,

2

codice macchina x86 per Linux, 60 byte

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

Questa è una funzione per Linux x86. Prende come puntatore di input la stringa in edie la lunghezza della stringa in ebp.

Ungolfed, con alcune infrastrutture da testare (compilare con FASM, eseguire con la stringa come argomento del programma; cercare l' undress:etichetta per il codice funzione effettivo):

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

sys_write()rende eaxdiverso da zero (in particolare 1, il numero di caratteri scritti, supponendo che non lo sia -errno), quindi printse non lo fai pop eaxalla fine. Si potrebbe appena xor eax,eaxprima di cmp byte [edi], ' 'e salvare il mov al,1, e forse un po 'di eaxsalvataggio / ripristino. Anche se in realtà non lo salvi fino a dopo aver smantellato SYS_WRITE. Hmm, invece di 0, potresti usare SYS_WRITEvs. 1, dato che ha cmp al, imm8le stesse dimensioni di test al,al.
Peter Cordes,

Puoi mettere un '\n'array nell'array mov byte [ecx + edx], '\n'invece di fare il secondo write()? (E diminuire la lunghezza dopo la stampa?) Potrebbe salvarti alcune istruzioni.
Peter Cordes,

In realtà, print()attualmente foglie '\n'in eax, che è diverso da SYS_WRITE, così si potrebbe ancora verificare. Pensavo stessi salvando / ripristinando eax, ma questo stava solo salvando i byte copiando una costante. Per stringhe lunghe, sys_write()può lasciare gli byte alti di eax diversi da zero, in modo che purtroppo esclude solo l'utilizzo mov al, SYS_WRITE.
Peter Cordes,

@PeterCordes in realtà sì, mov al, 1era estraneo. -2 byte ora, grazie.
Ruslan,

Una convenzione di chiamata del registro ti salverebbe le istruzioni di caricamento. Nel code-golf, una convenzione di chiamata personalizzata è normalmente un gioco equo per asm. OTOH, se preferisci giocare a golf con lo stack-args standard che chiama convention, anche questo è interessante.
Peter Cordes,

2

PHP , 117 byte

Aggiungo uno spazio aggiuntivo all'inizio in modo che lo spazio venga rimosso e mostri l'originale senza alcun codice aggiuntivo.

Un po 'nuovo a questo ... <p php e lo spazio all'inizio del file PHP aggiungono 6 byte extra o lo ottengo gratuitamente?

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

Provalo online!


1
Utilizzando il tuo metodo 6 byte possono essere ridotti: provalo online!
Notte 2

1
Puoi omettere il tag di apertura di PHP poiché puoi eseguirlo con un comando come questo: php -r "echo 1;"Ma se vuoi usare qualcosa di simile <?=1;devi includere il tag nel conteggio dei byte.
Night2

1

Pyth , 28 byte

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

Provalo qui! oppure Verifica tutti i casi di test!

Spiegazione

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.

1

Python 2 , 79 byte

-1 byte grazie 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[])

Provalo online!

I sostituisce prova costume "."con " "prima di chiamare la funzione e sostituisce " "indietro a "."prima di stampare i risultati per chiarezza.


'!'*i and-> i*'!'and.
Jonathan Frech,

1

C # - ancora una volta, 125 byte

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

Saluti!

Provalo online!


Benvenuti in PPCG!
Laikoni,

1

Ottava , 89 byte

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

Provalo online!

Aggiungerò una spiegazione più tardi, quando avrò il tempo. Potrei essere in grado di golf di alcuni byte se cambio completamente l'approccio, ma non riesco a vedere come purtroppo.

Le ultime lettere qui spiegano: "sendendendend". Vorrei che ci fosse un modo per memorizzare endcome variabile e usarlo, ma indovina cosa ...


È valido per l'output con s = ...? (La solita domanda, lo so)
Luis Mendo,

Ad ogni modo, vedi se riesci a rimuovere un paio di byte :-P
Luis Mendo,

1

Bash, 98 94 byte

Salvato 4 byte usando subshell invece di sequenze (prestazioni scadenti)

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

Prima risposta

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

Nota che !deve essere evitato in modalità interattiva

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.