Ao codificar em Python, às vezes você deseja uma sequência multilinha dentro de uma função, por exemplo
def f():
s = """\
Line 1
Line 2
Line 3"""
(A barra invertida é para remover uma nova linha principal)
Se você tentar realmente imprimir s
, no entanto, receberá
Line 1
Line 2
Line 3
Não é isso que queremos! Há muito espaço em branco à esquerda!
O desafio
Dada uma sequência multilinha composta apenas por caracteres alfanuméricos, espaços e novas linhas, remova todos os espaços comuns do início de cada linha. É garantido que cada linha tenha pelo menos um caractere que não seja de espaço e não terá espaços à direita. A saída pode não ter espaços em branco externos, seja antes ou depois de toda a saída ou de uma linha individual (com exceção de uma única nova linha de rastreamento opcional).
A entrada pode ser via STDIN ou argumento de função e a saída pode ser via STDOUT ou valor de retorno da função. Você não pode usar nenhum built-in projetado para deduzir cadeias de linhas múltiplas ou executar esta tarefa exata, por exemplo, do Python textwrap.dedent
.
Isso é código-golfe , então a solução com o menor número de bytes vence. Aplicam-se brechas padrão .
Casos de teste
"a" -> "a"
" abc" -> "abc"
" abc\n def\n ghi" -> " abc\ndef\n ghi"
" a\n b\n c" -> "a\nb\nc"
" a\n b\n c\nd" -> " a\n b\n c\nd"
" a b\n c d\n e f" -> "a b\n c d\n e f"
Por exemplo, o último caso de teste é
a b
c d
e f
e deve ficar assim depois de remover os espaços à esquerda:
a b
c d
e f
fonte
Respostas:
CJam,
2014 bytesAlgoritmo :
qN/_
)z{S-}#
)f>
)N*
)Expansão do código
Experimente online aqui
fonte
Pitão,
19181714 bytesA implementação é bem legal.
u .z
pega todas as linhas de stdin em uma matriz, coloca-aG
. Em seguida, avalia o corpo interno, coloca o resultadoG
e continua fazendo isso até que não mais mude (ponto fixo).!rhCG6
transpõeG
, obtém o primeiro elemento da matriz transposta (a primeira coluna), retira-o de qualquer espaço em branco e verifica se há algum caractere que não seja de espaço em branco.O valor de 2 é um booleano, que pode ser visto como um int 0 ou 1.
>R G
pega esse número e corta muitos caracteres à esquerda de cada linhaG
. As etapas 1, 2 e 3 combinadas basicamente significam que ele continuará removendo as colunas de espaço em branco até que não haja mais nenhuma coluna de espaço em branco puro.jb
une a matriz de linhas por novas linhas e a imprime.fonte
sed - 26 bytes
correr com
-rz
Bem direto:
-r
A opção ativa regexps estendidos,-z
lê toda a entrada como uma única sequência (na verdade, usa NUL-byte como delimitador de linha)fonte
:;N;$!b
ou similar, para reunir as linhas de entrada em um único espaço de padrão? Edit: não, você não; é para isso que-z
serve a bandeira.:;/^\S/M!s/^ //mg;t
, agora não exigindo-r
SWI-Prolog,
233223217 bytesEdit : Mudou completamente a minha resposta. Agora ele usa códigos de caracteres em vez de cadeias.
Um exemplo de chamar isso seria
a(` a b\n c d\n e f`).
, com aspas. Pode ser necessário usar aspas duplas,"
se você tiver um distrib SWI-Prolog antigo.fonte
Julia,
939281 bytesEconomizou 10 bytes graças a Glen O.
Isso cria uma função sem nome que aceita uma string e imprime no stdout.
Ungolfed + explicação:
fonte
minimum([length(search(j, r"^ +")) for j in p])+1
usarminimum([search(j,r"[^ ]")[1]for j=p])
. Como o desafio afirma que todas as linhas terão texto sem espaço, é seguro e economiza 9 bytes (incluindo 3 salvos usando em=
vez de `em). Still looking to see if more can be saved. (I wish I could drop the
[1]`, mas a pesquisa produz uma matriz de enumeradores do tipo Any, enquanto o mínimo exige um tipo Int)s->for i=(p=split(s,"\n")) println(i[minimum([search(j,r"[^ ]")[1]for j=p]):end])end
minimum(x)
quandox
uma matriz é usadamin(x...)
por um byte extra salvo (vou adicionar este à minha lista de dicas de golfe para Julia).\S
e não[^ ]
, o que salva um byte.\S
sendo útil para minha solução também.Java, 159
Porque há uma falta conspícua de Java ...
São apenas loops comparando comprimento com comprimento aparado e cuspindo substrings. Nada muito chique. Para os prejudicados na barra de rolagem:
fonte
Perl,
4733Obrigado @ThisSuitIsBlackNot pela sugestão de usar o loop implícito do Perl
O acima é pontuado como 30 bytes para a linha de código + 3 para
00p
sinalizadores.Versão original, como uma função:
Isso coloca o argumento em questão
$_
e tenta corresponder avidamente o espaço em branco que está presente em todas as linhas com/^( +).*(\n\1.*)*$/
- se for bem-sucedido,$1
agora contém o prefixo comum mais longo e executamos a substituiçãos/^$1//mgr
para excluí-lo do início de cada linha e retornar a sequência resultante.Teste
fonte
perl -00pe '/^( +).*(\n\1.*)*$/&&s/^$1//mg'
(30 bytes + 3 para00p
)./me
dirige-se para olhar para cima-00p
; Obrigado @ThisSuitPython 2,
867975 bytesDefinitivamente, isso pode ser encurtado um pouco mais, mas agora não é ruim.
Obrigado ao xnor por salvar 4 bytes!
fonte
x.find(x.strip())
.input()
no Python 2 se engasgaria com esses dados.):
Ruby:
7773706665585740 caracteresExemplo de execução:
fonte
f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}
?C #, 18 + 145 = 163 bytes
Requer (18 bytes):
Método (145 bytes):
O método calcula a menor quantidade de espaços iniciais nas linhas e cria uma nova sequência construída de todas as linhas, com N caracteres ignorados (onde N é o número calculado anteriormente).
fonte
C #, total de 149 bytes
Praticamente a mesma solução que os do ProgramFOX, embora o número de caracteres a serem cortados seja calculado manualmente.
E a própria função:
fonte
Python 3, 100
fonte
JavaScript, ES6,
8986 bytesEste é totalmente usando apenas correspondência e substituições RegEx.
Como sempre, apenas o Firefox, desde o ES6. Adicionará a versão ES5 posteriormente.
fonte
K, 31 bytes
Pega na entrada uma lista de strings e imprime o resultado em stdout.
fonte
Haskell, 52 bytes
Exemplo de uso:
unlines.until(any(/=' ').map head)(map tail).lines $ " abc\n def\n ghi"
->" abc\ndef\n ghi\n"
Como funciona:
fonte
Python, 94/95
lambda (94 bytes):
def (95 bytes)
fonte
bash + sed + coreutils,
74,56, 55Dados de teste
Responda
Resultado
fonte
cut -c$[`grep -o '^ *'<<<"$s"|sort|sed q|wc -c`]-<<<"$s"
$[]
aritmética. Usarcut
para a seleção de colunas é muito melhor. Eu nunca vised q
como uma alternativa parahead -n1
, é um bom truque de golfe. Obrigado!head -n1
vssed q
, há umaline
ferramenta no pacote util-linux.R,
118111 bytesUsando as maravilhosas funções de string do R :) Isso é semelhante / igual a outras soluções já publicadas. A entrada é através de STDIN e os gatos para STDOUT.
Teste e explicação
fonte
Julia,
726261575449 bytesUngolfed:
Solução mais antiga (57 bytes):
Solução original (72 bytes):
fonte
k (24 bytes)
Pega uma sequência como argumento e retorna uma sequência (com nova linha à direita).
Exemplo:
fonte
05AB1E , 10 bytes
Experimente online!
fonte
*
repete a seqüência de b uma quantidade de vezes? .. Será que não sabia sobre esse recurso de*
. Normalmente faços∍
(troco e alongo) quando quero repetir um determinado caractere.и
produz uma lista de caracteres.Gawk,
101100Por exemplo...
Resultado...
fonte
/^( +)/
→/^ +/
(então você terá o valor necessário emt[0]
vez det[1]
); mudars==""
→!s
; remova o{
e}
ao redor do código depoisif
; remova o;
antes}
; usando a função específica do Gawk para remover o código{
e}
ao redor dele depois defor
:{sub(s,"",z[r]);print z[r]}
→print gensub(s,"",1,z[r])
.C GCC, 74 bytes
Remove apenas todo o espaço em branco, não relacionado às linhas anteriores, solicitando ajuda para concluir. TAMBÉM, em termos de espaços em branco comuns, o OP significa que qual linha tem menos espaços à esquerda, ou seja, o número de espaços a serem removidos de cada linha?
fonte
Empilhados , não concorrentes, 43 bytes
Experimente online!
Isso funciona encontrando a quantidade de espaços no início de cada linha (
'^ +'match$#'"!
), obtendo o mínimo, repita um espaço várias vezes e substituindo-o por nada em cada linha.fonte
Vim,
33, 31 bytesExperimente online!
Versão antiga:
fonte
Stax , 9 bytes
Execute e depure
fonte
CoffeeScript, 112 bytes
fonte
JavaScript (ES6),
10698 bytesAs novas linhas são necessárias e são contadas como 1 byte cada:
Demo
Assim como outras respostas do ES6, elas funcionam apenas no Firefox no momento.
fonte
JavaScript ES6, 85 bytes
As novas linhas são significativas
Demonstração ES5:
fonte
JavaScript ( ES6 ) 56
Recursivo, tentando remover um espaço de cada vez de cada linha até encontrar um não espaço.
Teste a execução do trecho abaixo - sendo ES6, apenas Firefox
fonte