กำจัดช่องว่างบนบรรทัดอื่นที่ว่างเปล่า


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]หรือไม่บรรทัดเลย?
Leun Nun

6
โอ้และก่อนที่ทุกคนทำมันจะไม่มีการเข้าสู่สงครามศักดิ์สิทธิ์ 'space vs tabulators' การทำเช่นนั้นจะทำให้คำตอบของคุณได้รับโทษ 10,000 ไบต์: P
Papayaman1000

1
และการชี้แจงทั้งหมดนี้จำเป็นหรือไม่ เพียงแค่ช่องว่าง nuke และ tabulators บนบรรทัดที่ไม่มีตัวอักษรอื่น
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จะทำงาน แต่มันเจ๋งที่มัน!
ทอม

4
แต่นี้จดจ้องช่องว่างทั้งหมดที่ด้านขวาสุดของเส้น
แม่ชีที่รั่วไหล

23

เรติน่า 5 ไบต์

%G`\S

ลองออนไลน์!

วิธีการที่ไม่ชัดเจนทำให้เราได้คะแนนที่ดีกว่า :)

คำอธิบาย

Gบ่งชี้ว่านี่เป็นสเตจ Grep โดยรักษาเฉพาะบรรทัดที่ตรงกับ regex ที่ระบุ (สามารถ\Sจับคู่อักขระที่ไม่ใช่ช่องว่าง) หากไม่ใช่เพื่อเริ่มต้น%สิ่งนี้จะเป็นการลบบรรทัดทั้งหมดแทนที่จะ "ล้าง" พวกเขา

%เป็นตัวปรับแต่งซึ่งใช้เวทีครั้งเพื่อแต่ละบรรทัดและจากนั้นร่วมผลกับการขึ้นบรรทัดใหม่ A: ในกรณีของเราที่นี้หมายถึงว่าสตริงที่ว่างเปล่ากลับโดย Grep สำหรับสายช่องว่างอย่างเดียวจะกลายเป็นบรรทัดว่างในผล


เป็นเพียงเกี่ยวกับการโพสต์นี้ดี :)
Martin Ender

ฉันเดาว่าฉันยังมีอีกหลายคนที่ต้องเรียนรู้เกี่ยวกับจอประสาทตา
แม่ชีที่รั่วไหล

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 ไบต์
Riley

1
น่าเสียดายที่sedไม่มี\Sหรือ "สิ่งที่ไม่ใช่ช่องว่าง" หรือไม่ /\S/!g
aragaer

@aragaer มี! ดี!
Riley

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

"ตัวละครที่ไม่ใช่ช่องว่าง" วิธีนี้ไม่ได้ยกเว้น 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 3 , 63 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'))

ลองออนไลน์!

บันทึก 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
ความท้าทายของท่าอาจไม่น่าสนใจมากนัก แต่การเรียกมันว่าไร้จุดหมายจริงๆดูเหมือนจะมากเกินไป
Luis Mendo

5
มันเป็นถ้อยคำของคุณและมีเพียงคุณเท่านั้นที่รู้เจตนาของคำพูดของคุณ การแก้ไขหรือไม่และการใช้ถ้อยคำใหม่ใดเป็นการตัดสินใจของคุณโดยสิ้นเชิง
Luis Mendo

3
@HyperNeutrino แนวทางการดำเนินการที่ถูกต้องคือการปิดการท้าทายเนื่องจากไม่มีความชัดเจนและเปิดใหม่อีกครั้งเมื่อมีการเพิ่มการชี้แจงเหล่านั้น
Martin Ender

5

เป็นกลุ่ม, 20 18 16 13 10 ไบต์

ฉันไม่เคยเป็นผู้เชี่ยวชาญมาก่อน แต่คำถามนี้ต้องการคำตอบเป็นกลุ่ม

:%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'
Olivier Dulac

โอ้ ... ฉันคิดว่าเราต้องกำจัดบรรทัดว่างเปล่า ... :(
Olivier Dulac

1
ฉันทำเช่นเดียวกับการลองครั้งแรกของฉันและด้วยเหตุผลเดียวกัน ฉันรู้ว่ารู้สึก :)
jmriego

ข่าวดีก็คือ: ตอนนี้ฉันรู้วิธีที่จะกำจัดสิ่งเหล่านั้นในโปรแกรมของฉันเอง (หรือเมื่อแสดงไฟล์) ด้วยตัวอักษรตัวเล็ก ๆ จริงๆ ^^ คำตอบของคุณดีและแน่นหนา ทำได้ดี.
Olivier Dulac

5

APL (Dyalog) , 11 10 ไบต์

'\s+$'R''

⎕Rเป็นโอเปอเรเตอร์ที่ได้รับฟังก์ชั่นที่แทนที่สิ่งต่าง ๆ ในกรณีนี้สิ่งใดที่ตรงกับ RegEx จะถูกแทนที่ด้วยสตริงว่าง


4

ทับทิมขนาด 22 ไบต์

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

วิธีการแก้ปัญหา 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

เป็นกลุ่ม, 13 9 ไบต์

:v/\S/le↵

การแก้ไข:

  • คำตอบเดิม: :v/\S/d↵(ตามคำถามเป็นกลุ่มนี้ใน SO )
    มันลบบรรทัดว่างเปล่าซึ่งไม่ใช่พฤติกรรมที่คาดหวัง

  • คำตอบที่ถูกต้องโดยใช้vglobal ::v/\S/norm D↵

  • ตอนนี้ใช้คำสั่ง ex -leftอดีตแทนnormal D


ยินดีต้อนรับสู่ PPCG! ฉันไม่แน่ใจจริงๆว่าทำไมคุณต้องขอโทษเพราะนี่เป็นคำตอบที่ถูกต้องสำหรับตัวเอง
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;
}

0

C, 100 ไบต์

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

เห็นมันทำงานแบบออนไลน์


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.