Pozbądź się białych znaków na pustych liniach


17

Ach, jeszcze jedno z moich samolubnych zastosowań tego Stosu .

Będąc właścicielem Chromebooka, jestem częstym użytkownikiem Ace IDE, edytora używanego przez Cloud9. Ma wiele narzędzi do radzenia sobie z nadmiarem białych znaków, ale brakuje mu jednego: usuwania pustych linii.

Twoja dzisiejsza misja polega na tym, że biorąc pod uwagę dane z miejsca, które mogę skopiować i wkleić do [ ;)], wypisać coś identycznego, zapisać wszystkie spacje i tabulatory na pustych liniach.

Podam kilka przykładów, gdzie #s oznacza białe znaki do usunięcia.


WEJŚCIE 1:

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

WYNIK:

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

WEJŚCIE 2:

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

WYNIK:

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

WEJŚCIE 3:

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

WYNIK:

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

Możesz przetwarzać dane wejściowe w dowolny sposób. Wyjście gdziekolwiek, o ile mogę z niego skopiować i wkleić [ ;)].

Obowiązują standardowe luki, wygrywa najkrótsza odpowiedź w bajtach!


Czy musimy zostawić pustą linię tam, gdzie jest napisane [empty line], czy w ogóle żadnej linii?
Leaky Nun

6
Aha, i zanim ktokolwiek to zrobi, nie wejdzie w świętą wojnę „przestrzeni kontra tabulatorzy”. W ten sposób twoje odpowiedzi zostaną nukane z karą 10 000 bajtów: P
Papayaman1000

1
Czy wszystkie te wyjaśnienia są konieczne? Po prostu nuke spacje i tabulatory w liniach, które nie mają innych znaków.
Papayaman1000,

1
Czy możemy założyć, że dane wejściowe nie będą zawierać końcowych spacji w żadnych liniach (oczywiście z wyjątkiem samych białych spacji)? Żaden z przykładów tego nie robi.
ETHprodukcje

1
Jeśli linia zawierająca spacje ma końcową spację, czy można ją usunąć?
Cyfrowa trauma

Odpowiedzi:


15

Japt , 10 8 6 5 4 bajtów

mx1R

Wypróbuj online!

Wyjaśnienie

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

Więc mx1Rdzieli ciąg, przez Rktóry jest nowy wiersz, przycina prawą stronę każdej linii za pomocąx1 i ponownie łączy ciągi z nową linią.

Zaoszczędzono 2 bajty dzięki produktom ETH.


1
Gratulacje! Nie grałeś w siatkówkę!
Leaky Nun

Bardzo dobrze! Możesz zapisać kolejny bajt za pomocą ®x1}R.
ETHprodukcje

Zadrapanie, które możesz zrobić, mx1Raby rozwiązać cały problem w 4 bajtach ASCII :-) (To x1jest automatycznie interpretowane mjako_x1}
ETHproductions

@ETHproductions O rany, dzięki za wskazówki. Nie rozumiem, dlaczego mx1Rmiałoby działać, ale fajnie, że działa!
Tom


23

Siatkówka , 5 bajtów

%G`\S

Wypróbuj online!

Nie tak oczywiste podejście nagradza nas lepszym wynikiem :)

Wyjaśnienie

Gwskazuje to jako etap Grepa, zachowując tylko te wiersze, w których można znaleźć dopasowanie do podanego wyrażenia regularnego ( \S, pasuje do znaków spacji). Gdyby nie było na początku %, całkowicie usunęłoby to linie zamiast po prostu je „opróżniło”.

%To modyfikator, który odnosi się do stadium po każdym wierszu, a następnie dołącza do wyników z nowymi liniami: W naszym przypadku oznacza to, że pusty ciąg zwracany przez Grep dla białych linii tylko stanie się pusta linia w wyniku.


Właśnie miałem to opublikować, miło. :)
Martin Ender

Chyba wciąż muszę się wiele nauczyć o Retinie.
Leaky Nun

17

sed , 6 bajtów

/\S/!g

Wypróbuj 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
Prawdopodobnie sużyłbym upstytucji. Używanie zwykłego dopasowania i gbył sprytnym sposobem na zaoszczędzenie kilku bajtów.
Cyfrowa trauma

1
@DigitalTrauma To było moje pierwsze rozwiązanie. Zapisano 1 bajt.
Riley

1
Szkoda, sedże nie ma \Slub „coś, co nie jest spacją”. A może to? /\S/!g
aragaer 27.04.17

@aragaer Jest! Ładny!
Riley

9

V , 5 , 4 bajty

ÇÓ/D

Wypróbuj online!

Wyjaśnienie:

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

Hexdump:

00000000: c7d3 2f44                                ../D

Czy jesteś pewien, że to tylko 5? V często wykorzystuje więcej niż 1 bajt na znak.
Papayaman1000,

1
@ papayamam1000 V nigdy nie używa więcej niż jednego bajtu na znak. Tutaj używa kodowania Latin1, gdzie wszystkie te symbole spoza ASCII mają jeden bajt. Dodałem
zrzut heksowy

bardzo dobrze, tak jest.
Papayaman1000,

„znak inny niż biały”, jak to nie zwalnia linii z wieloma znakami spacji od usunięcia?
Adám

9

JavaScript (ES6), 26 bajtów

Nie rozumiem, dlaczego jest tak dużo entuzjastów!

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

Spróbuj

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 bajtów

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

Dane wejściowe i wyjściowe są tablicami ciągów. Dołącz'\n' .

W przypadku oryginalnego programu, który ciągi We / Wy:

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

Wypróbuj online!

Zaoszczędź 8 bajtów dzięki @Rod!
Zaoszczędź 19 bajtów dzięki @LeakyNun!


@LeakyNun Oh hm, zapomniałem, że mogę to zrobić. Dzięki!
HyperNeutrino

2
Myślę, że twój oryginalny kod był lepiej dostosowany do wyzwania. Prosi o możliwość skopiowania wklejania tekstu do danych wejściowych, więc tak naprawdę twój kod powinien wziąć pojedynczy ciąg, a nie tablicę, i podzielić go.
Notts90,

6

CJam , 18 16 bajtów

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

Zauważ, że ciąg zawiera 1 spację i 1 tabulator.

Wypróbuj online!

Wyjaśnienie

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+$

A really pointless challenge. m makes it multiline (ignores newline). \s matches both space and tab.

Try it online!


Retina is always first. Even while its poster is asking for [questionably necessary] clarifications in the comments.
Papayaman1000

@Papayaman1000 People do that all the time. Then they can change their answers if the rules turn out to be different from what's expected.
HyperNeutrino

6
Tha challenge may not be very interesting, but calling it really pointless seems excessive
Luis Mendo

5
It's your wording, and only you know the intent of your words. Editing it or not, and which new wording to use, is entirely your decision
Luis Mendo

3
@HyperNeutrino the correct course of action is to close the challenge as unclear and reopen it once those clarifications have been added.
Martin Ender

5

Vim, 20 18 16 13 10 bytes

I am by no means a Vim expert, but this question needs a Vim answer.

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

<cr> is a carriage return.

Changelog:

  • :norm instead of :normal (-2 bytes)
  • Switching to * instead of + means we will match already empty lines, but that doesn't matter. And now we can get rid of \v (very magic option) (-2 bytes)
  • New approach: Instead of replacing every line that matches with an empty line, we replace every line that doesn't have a no non-whitespace characters with an empty line. (-3 bytes)
  • Actually, a normal replacement is shorter (thanks, @DJMcMayhem) (-3 bytes)

1
This is shorter as a substitute command: :%s/^\s*$<cr>
DJMcMayhem

5

AWK, 12 11 bytes

!NF{$0=""}1

Try it online!

I was just feeling like AWK should have an answer too

It works by:

  1. Checking if there are no fields in the input. AWK by default uses all whitespace as separator between fields
  2. If there are no fields, change the input line to an empty string
  3. Print the line. As 1 is a truthy value, it runs the default command which is printing the line

Removed one byte as the semicolon is not necessary after the curly bracket
jmriego

you gave me an idea ... ^^ I reverted this and end up with 2 bytes: 'NF'
Olivier Dulac

ow... I thought we had to get rid of empty lines... :(
Olivier Dulac

1
I did exactly the same as my first try and for the same reason. I know that feel :)
jmriego

the good news is : now I know how to simply get rid of those in my own programs (or when displaying a file) with a really tiny awk oneliner ^^. Your answer is good and tight, by the way. Well done.
Olivier Dulac

5

APL (Dyalog), 11 10 bytes

'\s+$'R''

⎕R is an operator which derives a function which replaces stuff. In this case, anything matched by the RegEx is replaced with an empty string.


4

Ruby, 22 bytes

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

Straightforward regex solution


3

Java 7, 57 bytes

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

Explanation:

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

Test code:

Try it here.

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+$$//}

Try it

{         # 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+$$//'

Largely the same as above.

  • -p runs the code for every line of input, putting the line into $_ and printing whatever is left in $_.
  • s replaces in-place, whereas S returns the result.
  • No need for :g/:global as -p takes care of that.

1

Python 2, 26 bytes

lambda l:map(str.rstrip,l)

Try it online! Inputs and outputs a list of strings.

This takes advantage of the ruling in the comments that trailing whitespace may be removed on non-empty lines.


1

Vim, 13 9 bytes

:v/\S/le↵

Edits:

  • Original answer: :v/\S/d↵ (based on this vim question on SO).
    It deletes empty lines, which isn't the expected behavior.

  • Valid answer using vglobal: :v/\S/norm D↵

  • Now using the left-align ex command instead of normal D


Welcome to PPCG! I'm not really sure why you apologized, because this is a valid answer on its own.
Mego

Thank you! It expands on @L3viathan's answer and uses the same "language", so i'd have commented on his solution to limit the (already large) number of answers if I could.
Morgan

We aren't terribly concerned with having a lot of answers, or having multiple solutions in the same language. While we do encourage comments instead of new answers for small improvements upon existing answers, it's still OK to post a new answer (especially given that you can't comment yet).
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);}

Detailed

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

See it work online.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.