Livre-se do espaço em branco em linhas vazias


17

Ah, mais um dos meus usos egoístas dessa pilha .

Como proprietário de um Chromebook, sou um usuário frequente do Ace IDE, o editor usado pelo Cloud9. Ele tem muitas ferramentas para lidar com o excesso de espaço em branco, mas notavelmente falta uma: limpar linhas vazias.

Sua missão hoje é, dada a entrada de um lugar para onde eu posso copiar e colar [ ;)], produzir algo idêntico, salvar todos os espaços e tabuladores em linhas vazias.

Vou dar alguns exemplos, com #s representando caracteres de espaço em branco a serem removidos.


ENTRADA 1:

if (this.Color !== 'blue') {
##
  this.Color = 'blue';
}

RESULTADO:

if (this.Color !== 'blue') {
[empty line]
  this.Color = 'blue';
}

ENTRADA 2:

function outputSomething(times) {
  for (var iter = 0; iter < times; iter++) {
    console.log('"# # " represents a tabulator');
    // This is a comment
# # 
}}

RESULTADO:

function outputSomething(times) {
  for (var iter = 0; iter < times; iter++) {
    console.log('"# # " represents a tabulator');
    // This is a comment
[empty line]
}}

ENTRADA 3:

var x = 'Do you prefer spaces or tabs?';
var y = 'I\'m using both here. Sue me.';
# # ####
console.log(x + ' ' + y);

RESULTADO:

var x = 'Do you prefer spaces or tabs?';
var y = 'I\'m using both here. Sue me.';
[empty line]
console.log(x + ' ' + y);

Você pode processar a entrada como quiser. Saída em qualquer lugar, desde que eu possa copiar e colar a partir dele [ ;)].

As brechas padrão se aplicam, a resposta mais curta em bytes ganha!


Temos que deixar uma linha vazia onde diz [empty line], ou nenhuma linha?
Leaky Nun

6
Ah, e, antes que alguém o faça, não há como entrar na guerra santa dos 'espaços versus tabuladores'. Fazendo que recebe suas respostas sejam eliminados com uma penalidade de 10.000 bytes: P
Papayaman1000

11
E todos esses esclarecimentos são necessários? Apenas coloque armas nucleares e tabuladores em linhas que não tenham outros caracteres.
precisa saber é o seguinte

11
Podemos supor que a entrada não contenha espaços em branco finais em nenhuma linha (exceto as espaços em branco, obviamente)? Nenhum dos exemplos sim.
ETHproductions

11
Se uma linha que não contenha espaço em branco tiver espaço em branco à direita, é aceitável remover esse espaço em branco?
Digital Trauma

Respostas:


15

Japonês , 10 8 6 5 4 bytes

mx1R

Experimente online!

Explicação

(from the Japt docs)
.m(f,s=""):
Splits this with s, maps each item by f, then rejoins with s.

Então, mx1Rdivide a string pela Rqual é uma nova linha, corta o lado direito de cada linha usando x1e junta as strings novamente com uma nova linha.

Economizou 2 bytes graças ao ETHproductions.


11
Parabéns! Você Retina fora do golfe!
Leaky Nun

Muito agradável! Você pode salvar outro byte com ®x1}R.
ETHproductions

Risque isso, você pode apenas fazer mx1Rpara resolver todo o problema em 4 bytes de ASCII :-) (The x1é automaticamente interpretado por menquanto_x1}
ETHproductions

@ETHproductions Oh uau, obrigado pelas dicas. Não consigo ver por mx1Rque funcionaria, mas é legal que funcione!
Tom


23

Retina , 5 bytes

%G`\S

Experimente online!

Uma abordagem não tão óbvia nos recompensa com uma pontuação melhor :)

Explicação

Gindica isso como um estágio Grep, mantendo apenas as linhas em que uma correspondência com a expressão regular fornecida ( \S, corresponde a caracteres não espaciais) pode ser encontrada. Se não fosse o começo, %isso removeria completamente as linhas em vez de apenas "esvaziá-las".

O %é um modificador que aplica o estágio uma vez a cada linha e, em seguida, junta os resultados com novas linhas: no nosso caso, isso significa que a string vazia retornada pelo Grep para linhas somente em espaço em branco se tornará uma linha vazia no resultado.


Estava prestes a postar isso, legal. :)
Martin Ender

Acho que ainda tenho muito a aprender sobre a Retina.
Leaky Nun

17

sed , 6 bytes

/\S/!g

Experimente online!

/  /!  # If the line doesn't contain...
 \S    # anything non-whitespace (i.e. the entire line is whitespace)
     g #   replace the pattern space with the hold space which is empty

2
Eu provavelmente teria usado uma substituição. Usar uma correspondência simples e gfoi uma maneira inteligente de economizar alguns bytes.
Digital Trauma

11
@DigitalTrauma Essa foi minha primeira solução. Isso economizou 1 byte.
Riley

11
Pena sedque não tem \Sou "algo que não é espaço em branco". Ou faz? /\S/!g
Aragaer #

@aragaer Existe! Agradável!
Riley

9

V , 5 , 4 bytes

ÇÓ/D

Experimente online!

Explicação:

Ç       " On every line not matching the following regex:
 Ó/     "   a non-whitespace character...
   D    "   Delete the whole line

Hexdump:

00000000: c7d3 2f44                                ../D

Tem certeza de que são apenas 5? V geralmente usa mais de 1 byte por caractere.
precisa saber é o seguinte

11
@ papayamam1000 V nunca usa mais de um byte por caractere. Aqui, ele usa a codificação Latin1, onde todos esses símbolos não ASCII são de um byte. Eu adicionei um hexdump
DJMcMayhem

muito bem, é assim.
precisa saber é o seguinte

"um caractere que não seja um espaço em branco", como isso não isenta a exclusão de linhas com vários caracteres de espaço em branco da exclusão?
Adám 27/06/17

9

JavaScript (ES6), 26 bytes

Não entendo por que isso está recebendo tantos votos positivos!

s=>s.replace(/^\s+$/gm,``)

Tente

f=
s=>s.replace(/^\s+$/gm,``)
i.addEventListener("input",_=>o.innerText=f(i.value))
<textarea id=i></textarea><pre id=o>


7

Python 3 , 63 55 36 bytes

lambda s:[x.strip()and x for x in s]

Entrada e saída são matrizes de strings. Participe '\n'.

Para o programa original que as cadeias de E / S:

lambda s:'\n'.join(x.strip()and x for x in s.split('\n'))

Experimente online!

Economizou 8 bytes graças a @Rod!
Guardou 19 bytes graças a @LeakyNun!


@LeakyNun Oh hm, esqueci que eu poderia fazer isso. Obrigado!
HyperNeutrino

2
Acho que seu código original estava mais em sintonia com o desafio. Ele solicita que você possa copiar e colar texto em uma entrada; portanto, seu código deve pegar uma única string, não uma matriz, e dividi-la.
precisa saber é o seguinte

6

CJam , 18 16 bytes

qN/{_" 	"-\e&N}%

Observe que a sequência contém 1 espaço e 1 guia.

Experimente online!

Explicação

q                 e# Read the input
 N/               e# Split it on newlines
   {              e# Apply this block to each line:
    _             e#  Copy the line
     "  "-        e#  Remove all spaces and tabs from the copy
          \       e#  Bring the original to the top of the stack
           e&     e#  Logical AND; returns the original line if the copy is truthy 
                  e#    (non-empty), otherwise returns the copy line
             N    e#  Push a newline after the line
              }%  e# (end of block)

5

Retina , 8 bytes

m`^\s+$

Um desafio realmente inútil. mtorna a multilinha (ignora a nova linha). \scorresponde ao espaço e à guia.

Experimente online!


Retina é sempre o primeiro. Mesmo enquanto seu pôster pede esclarecimentos [duvidosamente necessários] nos comentários.
precisa saber é o seguinte

@ Papayaman1000 As pessoas fazem isso o tempo todo. Em seguida, eles podem alterar suas respostas se as regras forem diferentes do esperado.
precisa saber é o seguinte

6
Tha desafio pode não ser muito interessante, mas chamando-o realmente inútil parece excessivo
Luis Mendo

5
É a sua redação, e só você sabe a intenção de suas palavras. Editá-lo ou não, e que novas palavras usar, é inteiramente sua decisão
Luis Mendo

3
@HyperNeutrino, o curso de ação correto é encerrar o desafio como pouco claro e reabri-lo depois que esses esclarecimentos forem adicionados.
Martin Ender

5

Vim, 20 18 16 13 10 bytes

Eu não sou um especialista em Vim, mas essa pergunta precisa de uma resposta em Vim.

:%s/^\s*$<cr>

<cr> é um retorno de carro.

Changelog:

  • :norm ao invés de :normal (-2 bytes)
  • Mudar para em *vez de +significa que já corresponderemos a linhas vazias, mas isso não importa. E agora podemos nos livrar de \v( opção muito mágica ) (-2 bytes)
  • Nova abordagem: em vez de substituir todas as linhas correspondentes a uma linha vazia, substituímos todas as linhas que não possuem caracteres que não sejam espaços em branco por uma linha vazia. (-3 bytes)
  • Na verdade, uma substituição normal é mais curta (obrigado, @DJMcMayhem) (-3 bytes)

11
Isso é mais curto como um comando substituto::%s/^\s*$<cr>
DJMcMayhem

5

AWK , 12 11 bytes

!NF{$0=""}1

Experimente online!

Eu estava apenas sentindo que o AWK deveria ter uma resposta também

Funciona por:

  1. Verificando se não há campos na entrada. Por padrão, o AWK usa todo o espaço em branco como separador entre os campos
  2. Se não houver campos, altere a linha de entrada para uma sequência vazia
  3. Imprima a linha. Como 1 é um valor verdadeiro, ele executa o comando padrão que está imprimindo a linha

Um byte removido como o ponto e vírgula não é necessário depois da chaveta
jmriego

você me deu uma idéia ... ^^ Eu reverti isso e terminei com 2 bytes: 'NF'
Olivier Dulac

ow ... Achei que tínhamos para se livrar de linhas vazias ... :(
Olivier Dulac

11
Fiz exatamente o mesmo que na minha primeira tentativa e pelo mesmo motivo. Eu sei que sensação :)
jmriego

a boa notícia é: agora eu sei como simplesmente me livrar daqueles em meus próprios programas (ou ao exibir um arquivo) com um minúsculo awel oneliner ^^. Sua resposta é boa e firme, a propósito. Bem feito.
21717 Olivier Dulac

5

APL (Dyalog) , 11 10 bytes

'\s+$'R''

⎕Ré um operador que deriva uma função que substitui coisas. Nesse caso, qualquer coisa correspondida pelo RegEx é substituída por uma sequência vazia.


4

Ruby, 22 bytes

->s{s.gsub /^\s+$/,''}

Solução simples de regex


3

Java 7, 57 bytes

String c(String s){return s.replaceAll("(?m)^\\s+$","");}

Explicação:

String c(String s){     // Method with String parameter and String return-type
  return s.replaceAll(  //  Return the input String after we've replaced
    "(?m)^\\s+$",       //  all lines only containing whitespaces
    "");                //  with empty Strings
                        //    (NOTE: `(?m)` enables multiline regex)
}                       // End of method

Código do teste:

Experimente aqui.

class M{
  static String c(String s){return s.replaceAll("(?m)^\\s+$","");}

  public static void main(String[]a){
    System.out.println(c("if (this.Color !== 'blue') {\n \t\n  this.Color = 'blue';\n}"));
    System.out.println();
    System.out.println(c("function outputSomething(times) {\n  for (var iter = 0; iter < times; iter++) {\n    console.log('\"# # \" represents a tabulator');\n    // This is a comment\n  \t\n}}"));
    System.out.println();
    System.out.println(c("var x = 'Do you prefer spaces or tabs?';\nvar y = 'I\'m using both here. Sue me.';\n    \t\t\t \nconsole.log(x + ' ' + y);"));
  }
}


1

Perl 6 ,  15  12 bytes

15

{S:g/^^\h+$$//}

Tente

{         # bare block lambda with implicit parameter 「$_」

  S       # string replace (implicitly against 「$_」)
  :global # globally
  /
    ^^    # match beginning of line
      \h+ # match at least one horizontal whitespace
    $$    # match end of line

  //      # replace with nothing
}

11 + 1

perl6 -pe 's/^^\h+$$//'

Principalmente o mesmo que acima.

  • -pexecuta o código para cada linha de entrada, colocando a linha $_e imprimindo o que resta $_.
  • ssubstitui no local, enquanto Sretorna o resultado.
  • Não há necessidade de :g/ :globalcomo -pcuida disso.

1

Python 2 , 26 bytes

lambda l:map(str.rstrip,l)

Experimente online! Insere e gera uma lista de strings.

Isso tira proveito da decisão nos comentários de que o espaço em branco à direita pode ser removido em linhas não vazias.


1

Vim, 13 9 bytes

:v/\S/le↵

Editar% s:

  • Resposta original: :v/\S/d↵(com base nesta pergunta do vim no SO ).
    Exclui linhas vazias, que não são o comportamento esperado.

  • Resposta válida usando vglobal ::v/\S/norm D↵

  • Agora, usando o comando ex de alinhamento à esquerda em vez denormal D


Bem-vindo ao PPCG! Não sei ao certo por que você pediu desculpas, porque esta é uma resposta válida por si só.
Mego

Obrigado! Ele se expande na resposta de @ L3viathan e usa a mesma "linguagem", então eu teria comentado sua solução para limitar o número (já grande) de respostas, se eu pudesse.
Morgan

Não estamos muito preocupados em ter muitas respostas ou ter várias soluções no mesmo idioma. Embora incentivemos comentários em vez de novas respostas para pequenas melhorias em relação às respostas existentes, ainda não há problema em postar uma nova resposta (principalmente porque você ainda não pode comentar).
Mego

0

C, 168 bytes

#define P putchar(*t++)
s;e(char*t){s=0;while(*t>10)if(*t!=32|*t!=9)return 0;else t++,s++;return s;}
r(char*t){while(*t==10)P;if(!*t)return;if(!e(t))while(*t)P;t+=e(t);}

Detalhado

#include <stdio.h>

int e (char * t)
{
    int s = 0;

    // till the end of the line
    while (*t!='\0' && *t!='\n')
        // if it's not a space
        if (*t!=' ' || *t!='    ')
            // ignore the line
            return 0;
        else
            // count the space
            t++, s++;

    // return number of spaces
    return s;
}

void r (char * t)
{
    // skip to empty lines
    while (*t != '\0' && *t == '\n') putchar('\n'), t++;

    // stop at end of string
    if (*t == '\0') return;

    // if there is contnet print it
    if (!e(t)) while(*t != '\0') putchar(*t), t++;

    // skip to the end of line
    t += e(t);
}

int main (int argc, char**argv)
{
    if (argc > 1) r(argv[1]);
    putchar('\n');
    return 0;
}

0

C, 100 bytes

c,i,j;f(char*s){for(i=j=c=0;s[i];s[++j]^10?c=s[j]^32:(printf(!c?"\n":"%.*s",j-i+1,s+i),c=0,i=j+1));}

Veja como funciona online .


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.