Loại bỏ khoảng trắng trên các dòng trống


17

À, còn một cách sử dụng ích kỷ khác của tôi về Stack này .

Là chủ sở hữu Chromebook, tôi là người dùng thường xuyên của Ace IDE, trình chỉnh sửa được Cloud9 sử dụng. Nó có rất nhiều công cụ để xử lý khoảng trắng thừa, nhưng đáng chú ý là thiếu một thứ: xóa các dòng trống.

Nhiệm vụ của bạn hôm nay là, được đưa ra một đầu vào từ một nơi tôi có thể sao chép-dán vào [ ;)], xuất ra một cái gì đó giống hệt nhau, lưu tất cả các khoảng trắng và các tab trên các dòng trống.

Tôi sẽ đưa ra một số ví dụ, với #các ký tự đại diện cho khoảng trắng sẽ bị xóa.


VÀO 1:

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

ĐẦU RA:

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

VÀO 2:

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

ĐẦU RA:

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

VÀO 3:

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

ĐẦU RA:

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

Bạn có thể xử lý đầu vào theo cách bạn muốn. Xuất ra bất cứ nơi nào, miễn là tôi có thể sao chép-dán từ nó [ ;)].

Áp dụng sơ hở tiêu chuẩn, câu trả lời ngắn nhất trong byte thắng!


Chúng ta có phải để lại một dòng trống ở nơi nó nói [empty line], hoặc không có dòng nào cả?
Leaky Nun

6
Ồ, và, trước khi bất cứ ai làm điều đó, không được tham gia vào cuộc chiến thần thánh 'không gian so với người lập bảng'. Làm như vậy sẽ khiến câu trả lời của bạn bị phạt với mức phạt 10.000 byte: P
Papayaman1000

1
Và có phải tất cả những làm rõ cần thiết? Chỉ cần nuke khoảng trắng và lập bảng trên các dòng không có ký tự khác.
Papayaman1000

1
Chúng ta có thể giả sử rằng đầu vào sẽ không chứa khoảng trắng theo dõi trên bất kỳ dòng nào (ngoại trừ các khoảng trắng tất cả, rõ ràng)? Không có ví dụ nào.
Sản phẩm ETH

1
Nếu một dòng chứa không phải khoảng trắng có khoảng trắng ở cuối, thì có thể loại bỏ khoảng trắng đó không?
Chấn thương kỹ thuật số

Câu trả lời:


15

Japt , 10 8 6 5 4 byte

mx1R

Hãy thử trực tuyến!

Giải trình

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

Vì vậy, mx1Rtách chuỗi bằng Rmột dòng mới, cắt phần bên phải của mỗi dòng bằng cách sử dụng x1và nối lại chuỗi với một dòng mới.

Đã lưu 2 byte nhờ vào ETHproductions.


1
Xin chúc mừng! Bạn Retina ngoài sân golf!
Leaky Nun

Rất đẹp! Bạn có thể lưu một byte khác với ®x1}R.
Sản phẩm ETH

Không có gì, bạn chỉ có thể làm mx1Rđể giải quyết toàn bộ vấn đề trong 4 byte ASCII :-) (Điều x1này được tự động hiểu m_x1}
ETHproductions

@ETHproductions Oh wow, cảm ơn vì lời khuyên. Không thể thấy lý do tại sao mx1Rsẽ làm việc, nhưng nó thật tuyệt!
Tom


23

Võng mạc , 5 byte

%G`\S

Hãy thử trực tuyến!

Một cách tiếp cận không quá rõ ràng thưởng cho chúng tôi một số điểm tốt hơn :)

Giải trình

Gchỉ ra đây là giai đoạn Grep, chỉ giữ lại những dòng có khớp với biểu thức chính quy ( \Sphù hợp với các ký tự không phải khoảng trắng). Nếu không bắt đầu, %điều này sẽ loại bỏ hoàn toàn các dòng thay vì chỉ "làm trống" chúng.

Công cụ %sửa đổi áp dụng giai đoạn một lần cho mỗi dòng và sau đó nối kết quả với dòng mới: trong trường hợp của chúng tôi, điều này có nghĩa là chuỗi trống được Grep trả về cho các dòng chỉ có khoảng trắng sẽ trở thành một dòng trống trong kết quả.


Chỉ là về việc đăng này, tốt đẹp. :)
Martin Ender

Tôi đoán tôi vẫn còn nhiều điều để tìm hiểu về Retina.
Leaky Nun

17

sed , 6 byte

/\S/!g

Hãy thử trực tuyến!

/  /!  # 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
Tôi có lẽ đã sử dụng một substlation. Sử dụng kết hợp đơn giản và glà một cách thông minh để lưu một vài byte.
Chấn thương kỹ thuật số

1
@DigitalTrauma Đó là giải pháp đầu tiên của tôi. Điều này đã lưu 1 byte.
Riley

1
Quá tệ sedkhông có \Shoặc "một cái gì đó không phải là khoảng trắng". Hay không? /\S/!g
aragaer

@aragaer Có! Đẹp!
Riley

9

V , 5 , 4 byte

ÇÓ/D

Hãy thử trực tuyến!

Giải trình:

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

Hexdump:

00000000: c7d3 2f44                                ../D

Bạn có chắc chỉ có 5? V thường sử dụng nhiều hơn 1 byte cho mỗi ký tự.
Papayaman1000

1
@ papayamam1000 V không bao giờ sử dụng nhiều hơn một byte cho mỗi ký tự. Ngay tại đây, nó sử dụng mã hóa Latin1, trong đó tất cả các ký hiệu không phải ASCII đó là một byte. Tôi đã thêm một hexdump
DJMcMayhem

rất tốt, vì vậy nó là.
Papayaman1000

"một ký tự không phải khoảng trắng" làm thế nào điều này không miễn trừ dòng với nhiều ký tự khoảng trắng từ xóa?
Adám

9

JavaScript (ES6), 26 byte

Tôi không hiểu tại sao điều này lại nhận được rất nhiều sự ủng hộ!

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

Thử nó

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 byte

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

Đầu vào và đầu ra là các chuỗi của chuỗi. Tham gia trên '\n'.

Đối với chương trình gốc mà chuỗi I / O:

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

Hãy thử trực tuyến!

Đã lưu 8 byte nhờ @Rod!
Đã lưu 19 byte nhờ @LeakyNun!


@LeakyNun Oh hm, quên rằng tôi có thể làm điều đó. Cảm ơn!
HyperNeutrino

2
Tôi nghĩ rằng mã ban đầu của bạn phù hợp hơn với thử thách. Nó yêu cầu bạn có thể sao chép văn bản dán vào một đầu vào, vì vậy thực sự mã của bạn nên lấy một chuỗi, không phải là mảng và phân tách nó.
Notts90

6

CJam , 18 16 byte

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

Lưu ý rằng chuỗi chứa 1 khoảng trắng và 1 tab.

Hãy thử trực tuyến!

Giải trình

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

Võng mạc , 8 byte

m`^\s+$

Một thử thách thực sự vô nghĩa. mlàm cho nó đa dòng (bỏ qua dòng mới). \sphù hợp với cả không gian và tab.

Hãy thử trực tuyến!


Võng mạc luôn là đầu tiên. Ngay cả khi poster của nó đang yêu cầu làm rõ [cần thiết] trong các bình luận.
Papayaman1000

@ Papayaman1000 Mọi người làm điều đó mọi lúc. Sau đó, họ có thể thay đổi câu trả lời của mình nếu các quy tắc hóa ra khác với những gì được mong đợi.
HyperNeutrino

6
Thử thách có thể không thú vị lắm, nhưng gọi nó thực sự vô nghĩa dường như quá mức
Luis Mendo

5
Đó là từ ngữ của bạn, và chỉ có bạn biết ý định của lời nói của bạn. Chỉnh sửa nó hay không, và sử dụng từ ngữ mới nào, hoàn toàn là quyết định của bạn
Luis Mendo

3
@HyperNeutrino quá trình hành động chính xác là đóng thách thức vì không rõ ràng và mở lại sau khi những giải thích đó được thêm vào.
Martin Ender

5

Vim, 20 18 16 13 10 byte

Tôi không có nghĩa là một chuyên gia Vim, nhưng câu hỏi này cần một câu trả lời Vim.

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

<cr> là một sự trở lại vận chuyển.

Thay đổi:

  • :normthay vì :normal(-2 byte)
  • Chuyển sang *thay vì +có nghĩa là chúng ta sẽ khớp các dòng trống, nhưng điều đó không thành vấn đề. Và bây giờ chúng ta có thể thoát khỏi \v( tùy chọn rất kỳ diệu ) (-2 byte)
  • Cách tiếp cận mới: Thay vì thay thế mọi dòng khớp với một dòng trống, chúng tôi thay thế mọi dòng không có ký tự không có khoảng trắng bằng một dòng trống. (-3 byte)
  • Trên thực tế, một sự thay thế bình thường ngắn hơn (cảm ơn, @DJMcMayhem) (-3 byte)

1
Đây là ngắn hơn như là một lệnh thay thế::%s/^\s*$<cr>
DJMcMayhem

5

AWK , 12 11 byte

!NF{$0=""}1

Hãy thử trực tuyến!

Tôi chỉ cảm thấy như AWK cũng nên có câu trả lời

Nó hoạt động bằng cách:

  1. Kiểm tra nếu không có trường trong đầu vào. AWK theo mặc định sử dụng tất cả các khoảng trắng làm dấu phân cách giữa các trường
  2. Nếu không có trường nào, hãy thay đổi dòng đầu vào thành một chuỗi trống
  3. In dòng. Vì 1 là giá trị trung thực, nó chạy lệnh mặc định đang in dòng

Đã xóa một byte vì dấu chấm phẩy là không cần thiết sau dấu ngoặc nhọn
jmriego

bạn đã cho tôi một ý tưởng ... ^^ Tôi đã hoàn nguyên điều này và kết thúc với 2 byte: 'NF'
Olivier Dulac

ow ... Tôi nghĩ rằng chúng ta phải loại bỏ các dòng trống ... :(
Olivier Dulac

1
Tôi đã làm chính xác như lần thử đầu tiên của tôi và vì lý do tương tự. Tôi biết cảm giác đó :)
jmriego

tin tốt là: bây giờ tôi biết cách loại bỏ những thứ đó trong các chương trình của riêng tôi (hoặc khi hiển thị một tập tin) với một oneliner thực sự rất nhỏ ^^. Nhân tiện, câu trả lời của bạn là tốt và chặt chẽ. Làm tốt.
Olivier Dulac

5

APL (Dyalog) , 11 10 byte

'\s+$'R''

⎕Rlà một toán tử có được một hàm thay thế các công cụ. Trong trường hợp này, mọi thứ khớp với RegEx đều được thay thế bằng một chuỗi rỗng.


4

Ruby, 22 byte

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

Giải pháp regex đơn giản


3

Java 7, 57 byte

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

Giải trình:

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

Mã kiểm tra:

Hãy thử nó ở đây.

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 byte

15

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

Thử nó

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

Phần lớn giống như trên.

  • -pchạy mã cho mỗi dòng đầu vào, đặt dòng vào $_và in bất cứ thứ gì còn lại trong$_ .
  • s thay thế tại chỗ, trong khi S trả về kết quả.
  • Không cần :g/ :globalnhư -pchăm sóc điều đó.

1

Python 2 , 26 byte

lambda l:map(str.rstrip,l)

Hãy thử trực tuyến!Đầu vào và đầu ra một danh sách các chuỗi.

Điều này lợi dụng phán quyết trong các ý kiến ​​rằng khoảng trắng theo sau có thể được loại bỏ trên các dòng không trống.


1

Vim, 13 9 byte

:v/\S/le↵

Chỉnh sửa:

  • Câu trả lời gốc: :v/\S/d↵(dựa trên câu hỏi vim này trên SO ).
    Nó xóa các dòng trống, không phải là hành vi dự kiến.

  • Câu trả lời hợp lệ bằng cách sử dụng vglobal ::v/\S/norm D↵

  • Bây giờ bằng cách sử dụng lệnh ex -align ex thay vìnormal D


Chào mừng đến với PPCG! Tôi không thực sự chắc chắn lý do tại sao bạn xin lỗi, bởi vì đây là một câu trả lời hợp lệ.
Mego

Cảm ơn bạn! Nó mở rộng câu trả lời của @ L3viathan và sử dụng cùng một "ngôn ngữ", vì vậy tôi đã nhận xét về giải pháp của anh ấy để hạn chế số lượng câu trả lời (đã lớn) nếu tôi có thể.
Morgan

Chúng tôi không quá quan tâm đến việc có nhiều câu trả lời hoặc có nhiều giải pháp trong cùng một ngôn ngữ. Mặc dù chúng tôi khuyến khích các bình luận thay vì các câu trả lời mới cho các cải tiến nhỏ đối với các câu trả lời hiện có, nhưng vẫn có thể đăng một câu trả lời mới (đặc biệt là bạn chưa thể bình luận).
Mego

0

C, 168 byte

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

Chi tiế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;
}


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.