Избавьтесь от пробелов в пустых строках


17

Ах, еще одно мое эгоистичное использование этого стека .

Будучи владельцем Chromebook, я частый пользователь Ace IDE, редактора, используемого Cloud9. У него много инструментов для работы с лишним пробелом, но у него, в частности, нет одного: очистка пустых строк.

Ваша миссия сегодня состоит в том, чтобы, учитывая входные данные из места, которое я могу скопировать и вставить в [ ;)], вывести что-то идентичное, сохранить все пробелы и табуляторы в других пустых строках.

Я приведу несколько примеров, где #s представляет пробельные символы, которые нужно удалить.


ВХОД 1:

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

ВЫХОД:

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

ВХОД 2:

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

ВЫХОД:

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

ВХОД 3:

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

ВЫХОД:

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

Вы можете обработать ввод, как вам нравится. Выводите куда угодно, пока я могу скопировать и вставить из него [ ;)].

Применяются стандартные лазейки, выигрывает кратчайший ответ в байтах!


Нужно ли нам оставлять пустую строку там, где написано [empty line], или вообще нет строки?
Утренняя монахиня

6
О, и, прежде чем кто-либо сделает это, не вступайте в священную войну «пространства против табуляторов». При выполнении этого ваши ответы будут обстреляны со штрафом в 10 000 байт: P
Papayaman1000

1
И нужны ли все эти уточнения? Просто ядерные пробелы и табуляторы в строках, в которых нет других символов.
Papayaman1000

1
Можем ли мы предположить, что входные данные не будут содержать конечных пробелов ни в одной строке (за исключением, очевидно, всех пробельных строк)? Ни один из примеров не делает.
ETHproductions

1
Если строка, содержащая непробельные символы, имеет конечные пробелы, можно ли удалить эти пробелы?
Цифровая травма

Ответы:


15

Japt , 10 8 6 5 4 байта

mx1R

Попробуйте онлайн!

объяснение

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

Так mx1R разбивает строку поR которой , обрезает правую часть каждой строки, используяx1 и снова соединяет строки новой .

Сохранено 2 байта благодаря ETHproductions.


1
Поздравляем! Вы вне игры в сетчатку!
Утренняя монахиня

Очень хорошо! Вы можете сохранить другой байт с помощью ®x1}R.
ETHproductions

Поцарапайте это, вы можете просто сделать, mx1Rчтобы решить всю проблему в 4 байтах ASCII :-) (Это x1автоматически интерпретируется mкак_x1}
ETHproductions

@ETHproductions Ого, спасибо за советы. Не могу понять, почему mx1Rэто работает, но это круто!
Том


23

Сетчатка , 5 байт

%G`\S

Попробуйте онлайн!

Не столь очевидный подход вознаграждает нас лучшим результатом :)

объяснение

Gуказывает на это как этап Grep, сохраняя только те строки, где можно найти соответствие заданному регулярному выражению ( \Sсоответствует непробельным символам). Если бы не было для начала% это полностью удалило бы строки вместо того, чтобы просто «опустошить» их.

%Является модификатором , который применяет этап один раз к каждой строке , а затем присоединяется к результатам с новой строкой: в нашем случае это означает , что пустая строка , возвращаемая Grep для пробельных только линий станет пустой строкой в результате.


Просто собирался опубликовать это, милая. :)
Мартин Эндер

Я думаю, мне еще есть что узнать о Retina.
Утренняя монахиня

17

sed , 6 байт

/\S/!g

Попробуйте онлайн!

/  /!  # 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
Я, вероятно, использовал бы substitution. Использование простого совпадения и gумный способ сэкономить пару байтов.
Цифровая травма

1
@DigitalTrauma Это было мое первое решение. Это спасло 1 байт.
Райли

1
Жаль, sedчто нет \Sили «что-то, что не является пробелом». Или это? /\S/!g
aragaer

@aragaer Есть! Ницца!
Райли

9

V , 5 , 4 байта

ÇÓ/D

Попробуйте онлайн!

Объяснение:

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

HexDump:

00000000: c7d3 2f44                                ../D

Вы уверены, что это только 5? V часто использует более 1 байта на символ.
Papayaman1000

1
@ papayamam1000 V никогда не использует более одного байта на символ. Прямо здесь используется кодировка Latin1, где все эти символы, не входящие в ASCII, составляют один байт. Я добавил
hexdump

очень хорошо, так оно и есть.
Papayaman1000

«непробельный символ», как это не освобождает линию с несколькими пробельными символами от удаления?
Адам

9

JavaScript (ES6), 26 байт

Я не понимаю, почему так много голосов!

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

Попытайся

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 байт

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

Вход и выход - это массивы строк. Регистрация на '\n'.

Для исходной программы, которая содержит строки ввода / вывода:

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

Попробуйте онлайн!

Сохранено 8 байт благодаря @Rod!
Благодаря @LeakyNun сэкономлено 19 байт!


@ LeakyNun Ой, забыл, что я мог сделать это. Благодарность!
HyperNeutrino

2
Я думаю, что ваш оригинальный код был более созвучен этой задаче. Он просит вас иметь возможность скопировать вставленный текст во входные данные, поэтому ваш код должен взять одну строку, а не массив, и разбить ее.
Notts90

6

CJam , 18 16 байтов

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

Обратите внимание, что строка содержит 1 пробел и 1 табуляцию.

Попробуйте онлайн!

объяснение

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

Сетчатка , 8 байт

m`^\s+$

Действительно бессмысленный вызов. mделает его многострочным (игнорирует перевод строки). \sсоответствует как пробел, так и табуляция

Попробуйте онлайн!


Сетчатка всегда первая. Даже в то время как его плакат просит [сомнительно необходимые] разъяснения в комментариях.
Papayaman1000

@ Papayaman1000 Люди делают это постоянно. Затем они могут изменить свои ответы, если правила окажутся отличными от ожидаемых.
HyperNeutrino

6
Возможно, вызов не очень интересный, но называть его действительно бессмысленным кажется чрезмерным
Луис Мендо,

5
Это ваша формулировка, и только вы знаете смысл ваших слов. Редактировать это или нет, и какую новую формулировку использовать, полностью ваше решение
Луис Мендо

3
@HyperNeutrino правильный путь действий, чтобы закрыть проблему как неясную и открыть ее, как только эти пояснения были добавлены.
Мартин Эндер

5

Вим, 20 18 16 13 10 байт

Я ни в коем случае не эксперт Vim, но на этот вопрос нужен ответ Vim.

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

<cr> это возврат каретки.

Changelog:

  • :norm вместо того :normal (-2 байта)
  • Переключение *вместо +означает, что мы будем сопоставлять уже пустые строки, но это не имеет значения. И теперь мы можем избавиться от \v( очень волшебно вариант) (-2 байта)
  • Новый подход: вместо замены каждой строки, совпадающей с пустой строкой, мы заменяем каждую строку, в которой нет непробельных символов, пустой строкой. (-3 байта)
  • На самом деле нормальная замена короче (спасибо, @DJMcMayhem) (-3 байта)

1
Это короче в качестве замены команды::%s/^\s*$<cr>
DJMcMayhem

5

AWK , 12 11 байт

!NF{$0=""}1

Попробуйте онлайн!

Я просто чувствовал, что у AWK тоже должен быть ответ

Работает:

  1. Проверка, нет ли полей на входе. AWK по умолчанию использует все пробелы в качестве разделителя между полями
  2. Если полей нет, измените строку ввода на пустую строку
  3. Распечатать строку. Поскольку 1 является истинным значением, он запускает команду по умолчанию, которая печатает строку

Удален один байт, так как точка с запятой не нужна после фигурной скобки
jmriego

Вы дали мне идею ... ^^ Я отменил это и в итоге получил 2 байта: 'NF'
Оливье Дюлак

ой ... я думал, что мы должны избавиться от пустых строк ... :(
Оливье Дюлак

1
Я сделал то же самое, что и моя первая попытка, и по той же причине. Я знаю, что чувствую :)
jmriego

Хорошая новость: теперь я знаю, как просто избавиться от них в моих собственных программах (или при отображении файла) с помощью очень маленького awk oneliner ^^. Кстати, ваш ответ хороший и жесткий. Отлично сработано.
Оливье Дюлак

5

APL (Dyalog) , 11 10 байтов

'\s+$'R''

⎕Rэто оператор, который выводит функцию, которая заменяет вещи. В этом случае все, что соответствует RegEx, заменяется пустой строкой.


4

Рубин, 22 байта

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

Простое решение регулярных выражений


3

Java 7, 57 байт

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

Объяснение:

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

Тестовый код:

Попробуй это здесь.

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 байт

15

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

Попытайся

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

Во многом так же, как и выше.

  • -pзапускает код для каждой строки ввода, вставляет строку $_и печатает все, что осталось $_.
  • sзаменяет на месте, тогда как Sвозвращает результат.
  • Нет необходимости :g/ :globalкак -pзаботится об этом.

1

Python 2 , 26 байт

lambda l:map(str.rstrip,l)

Попробуйте онлайн!Вводит и выводит список строк.

Это использует преимущество в комментариях о том, что конечные пробелы могут быть удалены в непустых строках.


1

Vim, 13 9 байт

:v/\S/le↵

Редактирование:


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

Спасибо! Он расширяет ответ @ L3viathan и использует тот же «язык», поэтому я бы прокомментировал его решение, чтобы ограничить (уже большое) количество ответов, если бы мог.
Морган

Мы не очень заинтересованы в том, чтобы иметь много ответов или иметь несколько решений на одном языке. Хотя мы поощряем комментарии вместо новых ответов для небольших улучшений существующих ответов, все еще можно публиковать новые ответы (особенно если учесть, что вы пока не можете комментировать).
Mego

0

C 168 байт

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

Детальнее

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.