Já sabemos como tirar uma corda de seus espaços.
No entanto, como senhores / senhoras, deveríamos despi- lo.
Despir uma corda é o mesmo que removê-la, mas é mais delicado. Em vez de remover todos os espaços iniciais e finais de uma vez, nós os removemos um por um . Também alternamos entre à esquerda e à direita, para não queimar etapas.
Exemplo, começando com " codegolf "
(cinco espaços à esquerda e à direita):
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
Primeiro, imprima a string inalterada. Em seguida, execute cada etapa. Comece removendo um espaço à esquerda (se aplicável - consulte a regra nº 2).
A entrada pode ter um número diferente de espaços iniciais e finais. Se você ficar sem espaço em um lado, continue despindo o outro até que a corda fique vazia.
A entrada pode não ter espaços à esquerda nem à direita. Se for esse o caso, produza como está.
Use os métodos de E / S padrão do PPCG . As brechas padrão do PPCG são proibidas.
O comportamento indefinido na entrada vazia, ou entrada que contém apenas espaços, está OK.
Você pode assumir que a sequência conterá apenas caracteres do espaço imprimível ASCII (
0x20
para0x7E
).
Exemplos - os espaços são substituídos por pontos .
para melhor legibilidade:
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
Um cavalheiro / dama é conciso, por isso vence a resposta mais curta em bytes .
0x20
para0x7E
). Os outros são comportamento indefinido." test\r "
ou" \v test"
também.".....................a....."
? Nesse caso, sugiro adicioná-lo, pois algumas respostas parecem falhar nesse tipo de teste. (pontos são para melhor legibilidade é claro)Respostas:
Retina , 26 bytes
Experimente online! (O conjunto de testes usa períodos para maior clareza. O rodapé e o cabeçalho os convertem para e de espaços para o código principal.)
Explicação
Seria bom se pudéssemos alternar entre soltar um espaço à esquerda e um à direita e imprimir o resultado intermediário a cada vez. O problema é que atualmente o Retina não pode imprimir condicionalmente; portanto, ele imprimiria esse resultado intermediário se não sobrar espaço à esquerda ou à direita, gerando duplicatas. (O Retina 1.0 terá uma opção que somente imprime o resultado se a string foi alterada pela operação, mas ainda não estamos lá ...)
Então, em vez disso, estamos construindo uma única sequência contendo todos os resultados intermediários e imprimindo isso no final.
Ele
{
agrupa os dois estágios do programa em um loop que se repete até que a string pare de mudar (o que significa que não há espaços à esquerda / à direita). O palco em si corresponde a um espaço à esquerda na linha final da string e à linha final e, em seguida, grava de volta a correspondência, bem como as coisas após o espaço em uma nova linha (eliminando, assim, o espaço à esquerda na cópia).Remover o espaço à direita é um pouco mais fácil. Se apenas correspondermos ao espaço final, podemos acessar as coisas à sua frente (na mesma linha) com as
$%`
quais há uma variante com reconhecimento de linha da substituição do prefixo$`
.fonte
Python 2 ,
12210710310298959391908887 bytesExperimente online!
Python 3 ,
97959390 bytesExperimente online!
fonte
s=input()
vez de uma função levaria menos bytes.5. Undefined behaviour on empty input, or input that only contains spaces, is OK.
, 98 bytes .a
-o pela funçãoid
interna para evitar a necessidade de defini-lo no início. -2 bytes.Perl 6 , 55 bytes
Guardado 3 bytes graças a @nwellnhof.
Experimente online!
Explicação :
($_,{$++%2??S/" "$//!!S/^" "//}...*)
é uma sequência infinita recursiva que começa com a sequência original ($_
) e o próximo elemento é fornecido pelo bloco chamado no elemento anterior.O próprio bloco obtém a string na
$_
variável. O operadorS/(regex)/(string)/
pesquisará a primeira ocorrência de(regex)
in$_
, substitui-a por(string)
e retorna o resultado. Se não houver correspondência, ele retornará o conteúdo de$_
inalterado. Usamos o operador ternário?? !!
com a condição$++%2
, que alterna entreFalse
eTrue
($
é uma variável livre que conserva seu conteúdo nas chamadas para o bloco).Na pior das hipóteses (todos os espaços de um lado e 1 outro caractere), removemos 1 espaço a cada 2 etapas. Portanto, podemos ter certeza de que em 2 * (comprimento da cadeia) etapas, todos os espaços serão removidos. Pegamos muitos elementos da sequência recursiva com
[^.comb*2]
e finalmente descartamos duplicatas (que ocorrem sempre que um espaço deveria ter sido removido, mas não existe) com.unique
. Isso retorna a lista de cadeias, progressivamente removidas de espaços.fonte
[^.comb*2]
economiza 2 bytes. Por alguma razão, isso funciona, mas[^2*.comb]
não funciona. Não faço ideia do porquê. Usar um ternário?? !!
para selecionar a regex salva outro byte.[^2*.comb]
e não funcionou, então apenas usei[0..2*.comb]
. E obrigado pelo ternário, eu apenas pensei que é muito caro e não me ocorreu que eu substituí-lo por algo ainda mais caro ...05AB1E ,
2115 bytesExperimente online!
Explicação ^
fonte
C (gcc) ,
8984 bytesA versão recursiva é mais curta ;-)
Experimente online!
C (gcc) ,
10710210110099 bytesEconomizou 2 bytes graças a @Jonathan Frech usando espaços e ~
Experimente online!
fonte
==46
por,<33
pois o espaço é o menor caractere imprimível e você só precisa lidar com eles.++k+
faz?k
e adiciona um, que é equivalente ak = k + 1; i = k + 1;
oui = k + 2; k = k + 1
.i=k+++2
funciona também que eu teria usado porque os+++
olhares estranhos: PJavaScript (ES6) 92
@Upvoters: dê uma olhada nas outras respostas JS abaixo, com 76 bytes de comprimento
Um loop procurando um espaço na frente ou no final. Se encontrado, remova o espaço e a sequência de saída. Se nenhum espaço for encontrado 2 vezes, pare.
fonte
<'!'
. Para que seu snippet ainda funcione, você podereplace
períodos com espaços antes de passar para sua função.Perl 5, 32 bytes
Guardado 4 bytes devido a @Abigail .
Requer
-pl
contado como 2, invocado com-E
.Uso da amostra
Experimente online!
fonte
print;s/^ //&&print,s/ $//&&print while/^ | $/
trabalha com-n
bandeira, também-l
não é necessárioC # (.NET Core) ,
192183182181179178 bytes-3 bytes graças a Kevin Cruijssen
Experimente online!
fonte
var e=1;while(n.Trim()!=n)
->for(var e=1;n.Trim()!=n;)
;if(n[0]==' ')
->if(n[0]<33)
<33
é possível devido à regra recém-adicionada do OP: " Você pode assumir que a string conterá apenas caracteres do espaço imprimível ASCII (0x20
para0x7E
) " .Java 8,
150146145137 bytes-4 bytes graças a @Nevay mudando
(f<1&s.charAt(0)<33)
paraf+s.charAt(0)<33
.-1 byte usando o
!s.trim().equals(s)
truque da resposta C # .NET de @someone em vez des.matches(" .*|.* ")
.-8 bytes graças a @Nevay novamente, alterando
!s.trim().equals(s)
paras!=s.trim()
, porqueString#trim
retornará " Uma cópia dessa sequência com o espaço em branco à esquerda e à direita removido, ou essa sequência se não tiver espaço em branco à esquerda ou à direita ", portanto, a referência permanece a mesma e!=
pode ser usado para verificar se eles são a mesma referência, em vez de.equals
verificar o mesmo valor.Explicação:
Experimente aqui (ou tente uma versão mais visual aqui, em
#
vez de espaços).fonte
s=f+s.charAt(0)<33
vez de(f<1&s.charAt(0)<33)
(-4 bytes).s!=s.trim()
vez de!s.trim().equals(s);
(-8 bytes).C,
9190 bytesExperimente online!
fonte
Gelatina , 16 bytes
Experimente online!
-2 bytes graças a Erik the Outgolfer
-1 byte graças a milhas
Explicação
fonte
ḣ1Ḣ=⁶
->=⁶Ḣ
ƭ
só precisa de um nilad se a cadeia for maior que dois.¹Ṛƭ
funciona bem aqui.Ruby , 63 bytes
Experimente online!
fonte
Java (OpenJDK 8) ,
161 147146 bytesExperimente online!
-1 byte graças a @Kevin Cruijssen !
fonte
(u=32-x.charAt(l)>>-1)
para(u=32-x.charAt(l)>>k)
k
é a0
cada segunda iteração.u
. Não acontece quando eu também mudo-1
parak
forv
. Estou confuso por que funciona, porém, uma vezk
que realmente se tornará0
depoisk=~k
..: Sk=0
cenário: se houver espaços à esquerda, teráu
o mesmo valor de antes (0
); se left não tiver mais espaços,(k=~k)&~v|u
avalia como-1|u
(~0&-1|u
), portanto, o valor indefinido (negativo) deu
não importa (-1|x==-1
).05AB1E ,
2517 bytes-8 bytes, emprestando a idéia de não necessidade de verificação final da Emigna
Experimente online!
Tenho certeza de que uma abordagem menos direta pode superar essa solução facilmente. Para agora...
Explicações:
fonte
S
vez de#
(-1 byte). O loop ... bem ... economiza um byte impressionante em comparação com uma abordagem direta. Atualmente, estou procurando uma maneira mais curta de detectar o final da tarefa (5 bytes para isso é muito) e também estou considerando uma abordagem completamente diferente. Eu acho que existe uma maneira mais inteligente de resolver esse desafio.R ,
145133111 bytes-12 bytes graças a @ Giuseppe, armazenando o resultado de
sub
uma nova variável e testando se ela foi alterada-22 bytes retornando um vetor de cadeias em vez de uma cadeia com novas linhas
Experimente online!
Explicação sobre uma versão parcialmente não destruída:
fonte
C(s<-sub(),\n)
vez de uma declaração de impressão separada? Ah, não, por causa desep=" "
sep=""
. Na maioria dos desafios, o espaço extra à direita não importa, mas infelizmente aqui!sub
apenas sugeriu isso, IDK porqueL=s
e retornar um vetor de strings?Java (OpenJDK 8) ,
137125121120124 bytesExperimente online!
fonte
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 estar correto, mas não testou muito).MATL ,
2116 bytesIsso usa pontos em vez de espaços para maior clareza. Para espaços, substitua
46
por32
.Experimente online!
Explicação
fonte
Casca ,
2322 bytesAgradecimentos a Leo por -1 byte.
Experimente online!
Explicação
A função
`G`I
deve realmente ser um recurso interno ...fonte
?
parece óbvio em retrospectiva ...C ++,
196193189186183 bytes-10 bytes graças a Jonathan Frech
-3 bytes graças a Zacharý
A compilação com MSVC requer a desativação de verificações SDL
fonte
==32
por<33
.#include<string>
realmente necessário ?if(...){...;D;}
->if(...)...,D;
.#define R ...<33
,||R){
Eif(R){
->#define R ...<33)
,||R{
eif(R{
.C # (.NET Core) ,
176170 bytesExperimente online!
Essa é uma alternativa à resposta de alguém , e apenas gera as strings diretamente.
fonte
JavaScript (ES6), 76 bytes
Saídas como uma sequência multilinha.
Casos de teste
Usando pontos em vez de espaços, como a maioria das respostas.
Mostrar snippet de código
fonte
Sed, 24 bytes
Experimente Online!
fonte
Oitava ,
8883 bytes5 bytes de desconto graças a Stewie Griffin!
Experimente online!
fonte
min
é necessária devidos
a ser reduzido de forma dinâmicacódigo de máquina x86 para Linux, 60 bytes
Esta é uma função para Linux x86. Leva como ponteiro de entrada para a string
edi
e o comprimento da stringebp
.Ungolfed, com alguma infraestrutura para testar (compile com o FASM, execute a string como argumento do programa; procure um
undress:
rótulo para o código de função real):fonte
sys_write()
tornaeax
diferente de zero (especificamente1
, o número de caracteres escritos, supondo que não seja-errno
), o que aconteceráprint
se você não fizer issopop eax
no final. Você poderia poucoxor eax,eax
antes docmp byte [edi], ' '
e salvar omov al,1
, e talvez algunseax
salvar / restaurar. Embora você realmente não o salve até depois de bater comSYS_WRITE
. Hmm, em vez de0
, você poderia usarSYS_WRITE
vs.1
, já quecmp al, imm8
é do mesmo tamanho quetest al,al
.'\n'
no array com, emmov byte [ecx + edx], '\n'
vez de fazer o segundowrite()
? (E diminua o comprimento após a impressão?) Pode economizar algumas instruções.print()
atualmente folhas'\n'
emeax
, que é diferenteSYS_WRITE
, assim que você poderia ainda verificar se. Eu pensei que você estava salvando / restaurandoeax
, mas isso estava apenas salvando bytes copiando uma constante ao redor. Para cadeias longas,sys_write()
pode deixar os bytes altos de eax diferentes de zero, de modo que infelizmente exclui o usomov al, SYS_WRITE
.mov al, 1
era estranho. -2 bytes agora, obrigado.PHP , 117 bytes
Eu adiciono um espaço extra no início para que ele ocupe o espaço e mostre o original sem nenhum código extra.
Meio novo nisso ... o <? Php e o espaço no início do arquivo PHP adicionariam 6 bytes extras ou eu o recebo de graça?
Experimente online!
fonte
php -r "echo 1;"
Mas se você deseja usar algo como<?=1;
isso, deve incluir a tag na contagem de bytes.Pitão , 28 bytes
Experimente aqui! ou Verifique todos os casos de teste!
Explicação
fonte
Python 2 , 79 bytes
-1 byte graças a @JonathanFrech
Experimente online!
O traje de teste substitui
"."
por" "
antes de chamar a função e" "
volta a"."
antes de imprimir os resultados para maior clareza.fonte
'!'*i and
->i*'!'and
.C # - mais uma vez, 125 bytes
Felicidades!
Experimente online!
fonte
Oitava , 89 bytes
Experimente online!
Acrescentarei uma explicação mais tarde, quando tiver tempo. Talvez eu consiga tirar alguns bytes de golfe se mudar completamente a abordagem, mas não vejo como é infelizmente.
As últimas letras aqui explicitam: "envia endendendend". Eu gostaria que houvesse uma maneira de armazenar
end
como uma variável e usá-la, mas adivinhem ...fonte
s = ...
? (A questão de costume, eu sei)Bater,
9894 bytes4 bytes salvos usando subshell em vez de sequências (desempenhos ruins)
Primeira resposta
Observe que o
!
escape deve ser feito no modo interativofonte