Позбудьтеся пробілів у порожніх рядках


17

А, ще одне моє егоїстичне використання цього Стек .

Будучи власником Chromebook, я часто користуюся програмою Ace IDE - редактора, який використовується Cloud9. У ньому є безліч інструментів для боротьби із зайвим пробілом, але, зокрема, не вистачає одного: очищення порожніх рядків.

Ваша місія сьогодні полягає в тому, щоб отримати дані з місця, на яке я можу скопіювати і вставити [ ;)], вивести щось ідентичне, зберегти всі пробіли та табулятори на порожніх рядках.

Наведу декілька прикладів, з яких #символи пробілу повинні бути видалені.


ВХОД 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
О, і, перш ніж хтось це зробить, не потрапляючи у священну війну «просторів проти табуляторів». Якщо ви отримаєте відповіді,
накладені

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
Вітаємо! Ви поза гольфу Retina!
Leaky Nun

Дуже хороша! Ви можете зберегти ще один байт за допомогою ®x1}R.
ETHproductions

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

@ETHproductions О, вау, дякую за поради. Не можу зрозуміти, чому mx1Rб це працювало, але це здорово, що це робить!
Том


23

Сітківка , 5 байт

%G`\S

Спробуйте в Інтернеті!

Не настільки очевидний підхід нагороджує нас кращим балом :)

Пояснення

Gпозначає це як етап Grep, зберігаючи лише ті рядки, де можна знайти збіг із заданим регулярним виразом ( \S, що не відповідає пробілам). Якби не старт, %це повністю видалить лінії, а не просто "випорожнить" їх.

Це %модифікатор, який застосовує етап один раз до кожного рядка, а потім з'єднує результати з новими рядками: у нашому випадку це означає, що порожня рядок, повернута Грепом для рядків, що містять пробіли, стане результатом порожнього рядка.


Був ось-ось, щоб опублікувати це, приємно. :)
Мартін Ендер

Я здогадуюсь ще багато чого дізнатися про сітківку.
Leaky Nun

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
Я, мабуть, використав би sвбивство. Використання простого збігу і 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
DJMcMayhem

дуже добре, так і є.
Papayaman1000

"непробільний символ", як це не виключає видалення рядків з кількома символами пробілу?
Adám

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!
Збережено 19 байт завдяки @LeakyNun!


@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
Виклик Tha може бути не дуже цікавим, але називати його справді безглуздо здається надмірним
Луїс Мендо,

5
Це ваше формулювання, і тільки ви знаєте наміри своїх слів. Відредагувати його чи ні, і які нові формулювання використовувати, - це повністю ваше рішення
Луїс Мендо,

3
@HyperNeutrino правильний хід дій полягає в тому, щоб закрити виклик як неясний і повторно відкрити його, як тільки ці уточнення будуть додані.
Мартін Ендер

5

Vim, 20 18 16 13 10 байт

Я аж ніяк не експерт Vim, але на це запитання потрібна відповідь Vim.

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

<cr> - повернення вагона.

Журнал змін:

  • :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, замінюється порожнім рядком.



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↵

Зміни:

  • Оригінальна відповідь: :v/\S/d↵(ґрунтується на цьому vim-питанні про SO ).
    Він видаляє порожні рядки, що не є очікуваною поведінкою.

  • Дійсна відповідь за допомогою vglobal ::v/\S/norm D↵

  • Тепер використовується команда вирівнювання ліворуч ex, а неnormal D


Ласкаво просимо до PPCG! Я не дуже впевнений, чому ви вибачились, бо це правильна відповідь сама по собі.
Мего

Дякую! Він розширюється на відповідь @ L3viathan і використовує ту саму «мову», тож я б прокоментував його рішення, щоб обмежити (вже велику) кількість відповідей, якби міг.
Морган

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

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.