それ以外の空の行の空白を取り除く


17

ああ、このStackのわがままな使い方のもう1つです。

Chromebookの所有者である私は、Cloud9で使用されるエディターであるAce IDEの頻繁なユーザーです。余分な空白を処理するためのツールはたくさんありますが、特に不足しているものが1つあります。空の行をクリアすることです。

今日のあなたの使命は、コピーして[ ;)]に貼り付けることができる場所からの入力を与え、同じものを出力し、それ以外の場合は空の行にすべてのスペースとタブレーターを保存することです。

#削除する空白文字を表す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
ああ、そして、誰もがやる前に、「宇宙対タブレーター」の聖戦に入ることはない。P:それを行うことは万バイトのペナルティで被爆あなたの答えを取得
Papayaman1000

1
そして、これらすべての説明が必要ですか?他の文字を持たない行のスペースとタブレータだけを削除します。
パパイヤマン1000

1
入力の行の末尾に空白が含まれないことを想定できますか(明らかにすべての空白を除く)。どの例もありません。
-ETHproductions

1
非空白を含む行の末尾に空白がある場合、その空白を削除しても大丈夫ですか?
デジタル外傷

回答:


15

Japt10 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して各行の右側をトリミングし、文字列を再び改行で結合します。

ETHproductionsのおかげで2バイト節約されました。


1
おめでとう!あなたはRetinaをゴルフアウトしました!
リーキー修道女

非常に素晴らしい!で別のバイトを保存できます®x1}R
-ETHproductions

あなただけ行うことができ、それをスクラッチmx1R(:-) ASCIIの4バイトで全体の問題を解決するために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
私はおそらく、s権を使ったでしょう。単純な一致を使用するgことは、数バイトを節約する賢い方法でした。
デジタル外傷

1
@DigitalTraumaそれが私の最初の解決策でした。これにより1バイト節約されました。
ライリー

1
余りにも悪いものsedがない\Sか、「空白ではない何か」。それともそうですか?/\S/!g
-aragaer

@aragaerあります!いいね!
ライリー

9

V5、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バイト以上を使用します。
パパイヤマン1000

1
@ papayamam1000 Vは、文字ごとに1バイト以上を使用しません。ここでは、Latin1エンコードを使用しています。これらの非ASCIIシンボルはすべて1バイトです。
16進ダンプを

非常によく、そうです。
パパイヤマン1000

「非空白文字」これは、複数の空白文字を含むlinewを削除から除外しないのですか?
アダム

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の363 55 36バイト

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

入力と出力は文字列の配列です。に参加し'\n'ます。

I / Oの文字列を含む元のプログラムの場合:

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

オンラインでお試しください!

@Rodのおかげで8バイト節約されました!
@LeakyNunのおかげで19バイトを節約できました!


@LeakyNunああ、私はそれができることを忘れていました。ありがとう!
ハイパーニュートリノ

2
あなたの元のコードは、課題にもっと合っていたと思います。入力にペーストテキストをコピーできるように要求するため、実際にはコードは配列ではなく単一の文字列を取り、それを分割する必要があります。
Notts90

6

CJam18 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スペースとタブの両方に一致します。

オンラインでお試しください!


網膜は常に最初です。そのポスターがコメントの[疑いなく必要]の説明を求めている間でさえ。
パパイヤマン1000

@ Papayaman1000人々はいつもそうしています。その後、ルールが予想と異なることが判明した場合、回答を変更できます。
ハイパーニュートリノ

6
Thaチャレンジはあまり面白くないかもしれませんが、それを本当に無意味だと呼ぶのは過剰に思えます
ルイスメンドー

5
それはあなたの言葉遣いであり、あなただけがあなたの言葉の意図知っています。、それを編集するかどうか、および使用する新しい表現することは、完全にあなたの決定である
ルイスMendo

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

AWK12 11バイト

!NF{$0=""}1

オンラインでお試しください!

私はちょうどAWKにも答えがあるべきだと感じていました

以下によって動作します:

  1. 入力にフィールドがないかどうかを確認します。AWKはデフォルトで、フィールド間の区切り文字としてすべての空白を使用します
  2. フィールドがない場合は、入力行を空の文字列に変更します
  3. 行を印刷します。1は真実の値であるため、行を出力するデフォルトのコマンドを実行します

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.


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.