Singkirkan spasi putih pada baris kosong


17

Ah, satu lagi kegunaan egoisku dari tumpukan ini .

Menjadi pemilik Chromebook, saya sering menggunakan Ace IDE, editor yang digunakan oleh Cloud9. Ini memiliki banyak alat untuk menangani kelebihan spasi putih, tetapi terutama tidak memiliki satu: membersihkan baris kosong.

Misi Anda hari ini adalah, diberi input dari tempat saya dapat menyalin-tempel ke [ ;)], menampilkan sesuatu yang identik, menyimpan semua ruang dan tabulator pada baris yang kosong.

Saya akan memberikan beberapa contoh, dengan #s yang mewakili karakter spasi putih untuk dihapus.


INPUT 1:

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

KELUARAN:

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

INPUT 2:

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

KELUARAN:

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

INPUT 3:

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

KELUARAN:

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

Anda dapat memproses input sesuka Anda. Output di mana saja, selama saya bisa copy-paste dari itu [ ;)].

Celah standar berlaku, jawaban terpendek dalam byte menang!


Apakah kita harus meninggalkan garis kosong di tempat yang tertulis [empty line], atau tidak ada garis sama sekali?
Leaky Nun

6
Oh, dan, sebelum ada orang yang melakukannya, jangan memasuki perang suci 'ruang vs tabulasi'. Melakukan hal itu membuat jawaban Anda nuked dengan hukuman 10.000 byte: P
Papayaman1000

1
Dan apakah semua klarifikasi ini diperlukan? Hanya nuke spasi dan tabulator pada garis yang tidak memiliki karakter lain.
Papayaman1000

1
Bisakah kita berasumsi bahwa input tidak akan mengandung spasi spasi pada baris apa pun (kecuali yang semua spasi, jelas)? Tak satu pun dari contoh itu yang melakukannya.
ETHproduk

1
Jika sebuah baris yang mengandung non-spasi putih memiliki spasi tambahan, apakah boleh untuk menghapus spasi itu?
Digital Trauma

Jawaban:


15

Japt , 10 8 6 5 4 byte

mx1R

Cobalah online!

Penjelasan

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

Jadi mx1Rpisahkan string dengan Ryang merupakan baris baru, pangkas sisi kanan setiap baris menggunakan x1dan bergabung dengan string lagi dengan baris baru.

Disimpan 2 byte berkat produk ETH.


1
Selamat! Anda bermain golf Retina!
Leaky Nun

Sangat bagus! Anda dapat menyimpan byte lain dengan ®x1}R.
ETHproduk

Gores itu, Anda hanya dapat melakukan mx1Runtuk menyelesaikan seluruh masalah dalam 4 byte ASCII :-) (Ini x1secara otomatis ditafsirkan oleh msebagai_x1}
ETHproductions

@ ETProduksi Oh wow, terima kasih atas tipsnya. Tidak bisa melihat mengapa ini mx1Rbisa berhasil, tapi itu asyik!
Tom


23

Retina , 5 byte

%G`\S

Cobalah online!

Pendekatan yang tidak begitu jelas menghadiahi kami dengan skor yang lebih baik :)

Penjelasan

Gmenunjukkan ini sebagai tahap Grep, menjaga hanya garis-garis di mana kecocokan dengan regex yang diberikan ( \S, cocok dengan karakter non-spasi) dapat ditemukan. Jika bukan karena permulaan %ini akan benar-benar menghapus garis, bukan hanya "mengosongkan" mereka.

Ini %adalah pengubah yang menerapkan tahap satu kali untuk setiap baris dan kemudian bergabung dengan hasil dengan baris baru: dalam kasus kami ini berarti bahwa string kosong yang dikembalikan oleh Grep untuk garis spasi-saja akan menjadi garis kosong di hasilnya.


Baru saja memposting ini, bagus. :)
Martin Ender

Saya rasa saya masih harus banyak belajar tentang Retina.
Leaky Nun

17

sed , 6 byte

/\S/!g

Cobalah online!

/  /!  # 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
Saya mungkin akan menggunakan spengganti. Menggunakan kecocokan biasa dan gmerupakan cara cerdas untuk menghemat beberapa byte.
Trauma Digital

1
@DigitalTrauma Itu solusi pertama saya. Ini menyimpan 1 byte.
Riley

1
Sayang sekali sedtidak memiliki \Satau "sesuatu yang bukan spasi". Atau apakah itu? /\S/!g
aragaer

@aragaer Ada! Bagus!
Riley

9

V , 5 , 4 byte

ÇÓ/D

Cobalah online!

Penjelasan:

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

Hexdump:

00000000: c7d3 2f44                                ../D

Apakah Anda yakin itu hanya 5? V sering menggunakan lebih dari 1 byte per karakter.
Papayaman1000

1
@ papayamam1000 V tidak pernah menggunakan lebih dari satu byte per karakter. Di sini ia menggunakan pengkodean Latin1, di mana semua simbol non-ASCII adalah satu byte. Saya telah menambahkan hexdump
DJMcMayhem

sangat baik, begitu juga.
Papayaman1000

"a non-whitespace character" bagaimana hal ini tidak mengecualikan linew dengan banyak karakter spasi putih dari penghapusan?
Adám

9

JavaScript (ES6), 26 byte

Saya tidak mengerti mengapa ini mendapatkan begitu banyak upvotes!

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

Cobalah

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]

Input dan output adalah array string. Bergabunglah '\n'.

Untuk program asli yang dikerjakan I / O:

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

Cobalah online!

Disimpan 8 byte berkat @Rod!
Disimpan 19 byte berkat @LeakyNun!


@ LeakyNun Oh hm, lupa aku bisa melakukan itu. Terima kasih!
HyperNeutrino

2
Saya pikir kode asli Anda lebih selaras dengan tantangan. Itu meminta Anda untuk dapat menyalin teks tempel ke input, jadi benar-benar kode Anda harus mengambil string tunggal, bukan array, dan membaginya.
Notts90

6

CJam , 18 16 byte

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

Perhatikan bahwa string berisi 1 spasi dan 1 tab.

Cobalah online!

Penjelasan

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

Retina , 8 byte

m`^\s+$

Tantangan yang sangat tidak berguna. mmembuatnya multiline (mengabaikan baris baru). \scocok dengan spasi dan tab.

Cobalah online!


Retina selalu yang pertama. Bahkan ketika posternya meminta klarifikasi [yang perlu] dalam komentar.
Papayaman1000

@ Papayaman1000 Orang-orang melakukan itu sepanjang waktu. Kemudian mereka dapat mengubah jawaban mereka jika aturan ternyata berbeda dari yang diharapkan.
HyperNeutrino

6
Tantangan ini mungkin tidak terlalu menarik, tetapi menyebutnya benar - benar sia-sia tampaknya berlebihan
Luis Mendo

5
Ini kata-kata Anda, dan hanya Anda yang tahu maksud kata-kata Anda. Mengeditnya atau tidak, dan kata-kata baru mana yang akan digunakan, sepenuhnya adalah keputusan Anda
Luis Mendo

3
@HyperNeutrino tindakan yang benar adalah menutup tantangan sebagai tidak jelas dan membukanya kembali setelah klarifikasi tersebut ditambahkan.
Martin Ender

5

Vim, 20 18 16 13 10 byte

Saya bukan ahli Vim, tetapi pertanyaan ini membutuhkan jawaban Vim.

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

<cr> adalah carriage return.

Changelog:

  • :normbukannya :normal(-2 byte)
  • Beralih ke *alih-alih +berarti kita akan mencocokkan garis yang sudah kosong, tetapi itu tidak masalah. Dan sekarang kita dapat menyingkirkan \v( opsi yang sangat ajaib ) (-2 byte)
  • Pendekatan baru: Alih-alih mengganti setiap baris yang cocok dengan baris kosong, kami mengganti setiap baris yang tidak memiliki karakter tanpa spasi dengan baris kosong. (-3 byte)
  • Sebenarnya, penggantian normal lebih pendek (terima kasih, @DJMcMayhem) (-3 byte)

1
Ini lebih pendek sebagai perintah pengganti: :%s/^\s*$<cr>
DJMcMayhem

5

AWK , 12 11 byte

!NF{$0=""}1

Cobalah online!

Aku hanya merasa AWK seharusnya punya jawaban juga

Ini bekerja dengan:

  1. Memeriksa apakah tidak ada bidang dalam input. AWK secara default menggunakan semua spasi putih sebagai pemisah antar bidang
  2. Jika tidak ada bidang, ubah jalur input ke string kosong
  3. Cetak garis. Karena 1 adalah nilai kebenaran, ia menjalankan perintah default yang mencetak baris

Dihapus satu byte karena titik koma tidak diperlukan setelah kurung kurawal
jmriego

Anda memberi saya ide ... ^^ Saya mengembalikan ini dan berakhir dengan 2 byte: 'NF'
Olivier Dulac

hai ... kukira kita harus menyingkirkan jalur kosong ... :(
Olivier Dulac

1
Saya melakukan persis sama dengan percobaan pertama saya dan untuk alasan yang sama. Saya tahu perasaan itu :)
jmriego

kabar baiknya adalah: sekarang saya tahu bagaimana cara menyingkirkan mereka yang ada di program saya sendiri (atau ketika menampilkan file) dengan oneliner awk yang sangat kecil ^^. Jawaban Anda bagus dan ketat. Sudah selesai dilakukan dengan baik.
Olivier Dulac

5

APL (Dyalog) , 11 10 byte

'\s+$'R''

⎕Radalah operator yang memperoleh fungsi yang menggantikan barang. Dalam hal ini, apa pun yang cocok dengan RegEx diganti dengan string kosong.


4

Ruby, 22 byte

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

Solusi regex langsung


3

Java 7, 57 byte

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

Penjelasan:

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

Kode uji:

Coba di sini.

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+$$//}

Cobalah

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

Sebagian besar sama seperti di atas.

  • -pmenjalankan kode untuk setiap baris input, memasukkan baris ke $_dan mencetak apa pun yang tersisa$_ .
  • s menggantikan di tempat, sedangkan S mengembalikan hasilnya.
  • Tidak perlu :g/ :globalkarena -pmengurusnya.

1

Python 2 , 26 byte

lambda l:map(str.rstrip,l)

Cobalah online!Input dan output daftar string.

Ini mengambil keuntungan dari putusan dalam komentar bahwa trailing spasi dapat dihapus pada baris yang tidak kosong.


1

Vim, 13 9 byte

:v/\S/le↵

Suntingan:

  • Jawaban asli: :v/\S/d↵(berdasarkan pertanyaan vim ini pada SO ).
    Itu menghapus baris kosong, yang bukan perilaku yang diharapkan.

  • Jawaban yang valid menggunakan vglobal ::v/\S/norm D↵

  • Sekarang gunakan perintah ex -kiri rata bukannyanormal D


Selamat datang di PPCG! Saya tidak begitu yakin mengapa Anda meminta maaf, karena ini adalah jawaban yang valid sendiri.
Mego

Terima kasih! Itu diperluas pada jawaban @ L3viathan dan menggunakan "bahasa" yang sama, jadi saya akan mengomentari solusinya untuk membatasi jumlah (sudah besar) jawaban jika saya bisa.
Morgan

Kami tidak terlalu khawatir dengan memiliki banyak jawaban, atau memiliki banyak solusi dalam bahasa yang sama. Meskipun kami mendorong komentar alih-alih jawaban baru untuk peningkatan kecil atas jawaban yang ada, tetap oke untuk mengirim jawaban baru (terutama mengingat Anda belum dapat berkomentar).
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);}

Terperinci

#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 byte

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

Lihat itu berfungsi online .


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.