Hapus ruang pemimpin umum

19

Saat menulis dengan Python, terkadang Anda menginginkan string multiline dalam suatu fungsi, misalnya

def f():
    s = """\
    Line 1
    Line 2
    Line 3"""

(Garis miring terbalik adalah untuk menghapus baris baru terkemuka)

Namun, jika Anda benar-benar mencetak s, Anda akan mendapatkannya

    Line 1
    Line 2
    Line 3

Bukan itu yang kita inginkan sama sekali! Ada terlalu banyak spasi putih terkemuka!

Tantangan

Diberikan string multiline yang hanya terdiri dari karakter alfanumerik, spasi, dan baris baru, hapus semua spasi umum dari awal setiap baris. Setiap baris dijamin memiliki setidaknya satu karakter non-spasi, dan tidak akan memiliki spasi tambahan. Outputnya mungkin tidak memiliki spasi putih, apakah itu sebelum atau sesudah seluruh output atau satu baris individual (dengan pengecualian satu baris tambahan opsional baru).

Input mungkin melalui STDIN atau argumen fungsi, dan output mungkin melalui STDOUT atau nilai pengembalian fungsi. Anda tidak dapat menggunakan bawaan apa pun yang dirancang untuk mendeduksi string multiline atau melakukan tugas yang tepat ini, misalnya Python textwrap.dedent.

Ini adalah , jadi solusi dalam byte paling sedikit menang. Celah standar berlaku.

Uji kasus

"a"                                  ->   "a"
"   abc"                             ->   "abc"
"   abc\n def\n  ghi"                ->   "  abc\ndef\n ghi"
"    a\n    b\n    c"                ->   "a\nb\nc"
"    a\n    b\n    c\nd"             ->   "    a\n    b\n    c\nd"
"   a   b\n     c     d\n    e f"    ->   "a   b\n  c     d\n e f"

Sebagai contoh, test case terakhir adalah

   a   b
     c     d
    e f

dan akan terlihat seperti ini setelah membuka ruang utama:

a   b
  c     d
 e f
Sp3000
sumber
Bisakah output memiliki spasi spasi?
orlp
@ orlp Tidak mungkin tidak, akan menjelaskan.
Sp3000

Jawaban:

12

CJam, 20 14 byte

qN/_z{S-}#f>N*

Algoritma :

  • Kami pertama-tama membagi input pada baris baru dan mengambil salinan (qN/_ )
  • Kemudian kolom terkecil dengan karakter non spasi dihitung dengan mentransposkan array yang dipisahkan baris baru dan kemudian hanya mencari indeks baris non-semua-ruang pertama (z{S-}# )
  • Kemudian kita cukup menghapus banyak karakter dari setiap baris (f> )
  • Akhirnya, kami bergabung dengan baris baru lagi ( N*)

Ekspansi Kode

qN/               e# Read the entire input and split it on newline
   _z             e# Take a copy and transpose rows with columns.
                  e# Now we would have a bunch of all space rows. These rows are the ones
                  e# we want to remove (in form of columns) 
     {  }#        e# Get the index of the first item from the transposed array that returns
                  e# true for this block
      S-          e# From each part, remove spaces. If the part is all-space, it will return
                  e# an empty string, which is false in CJam. We finally will get the index
                  e# of the first non-all-space row (or column)
          f>      e# We take that index and remove that many characters from starting of each
                  e# row of the initial newline separated input
            N*    e# Join the array back using newlines and automatically print the result

Cobalah online di sini

Pengoptimal
sumber
8

Pyth, 19 18 17 14 byte

jbu>R!rhCG6G.z

Implementasinya cukup keren.

  1. u .zmeraih semua lini stdin dalam array, menempatkan dalam G. Kemudian ia mengevaluasi tubuh bagian dalam, memasukkan hasilnya G, dan terus melakukan ini sampai tidak lagi berubah (titik tetap).

  2. !rhCG6transposes G, dapatkan elemen pertama dari array yang ditransposisikan (kolom pertama), menghapusnya dari spasi apa pun, dan memeriksa apakah ada karakter non-spasi putih yang tersisa.

  3. Nilai dari 2 adalah boolean, yang dapat dilihat sebagai int 0 atau 1. >R Gmeraih angka ini dan memotong banyak karakter di sebelah kiri setiap baris G. Langkah 1, 2 dan 3 digabungkan pada dasarnya berarti bahwa ia akan terus menghapus kolom spasi sampai tidak ada kolom spasi kosong yang tersisa.

  4. jb bergabung dengan array garis dengan baris baru dan mencetaknya.

orlp
sumber
2
Bisakah Anda memberikan sedikit penjelasan tentang ini? Ini sangat aneh bagiku!
bobbel
2
@bobbel Penjelasan ditambahkan.
orlp
Sangat bagus, terima kasih! Belum pernah dengar! Untuk mencoba ini secara online saya menemukan: pyth.herokuapp.com/...
bobbel
8

sed - 26 byte

:;/(^|\n)\S/q;s/^ //mg;b

jalankan bersama -rz

Cukup mudah:

  /(^|\n)\S/q;           - quit if there is a line that starts with non-space
              s/^ //mg;  - remove exactly one space in each line
:;                     b - repeat

-ropsi mengaktifkan regexps yang diperluas, -zmembaca seluruh input sebagai string tunggal (sebenarnya menggunakan NUL-byte sebagai pembatas garis)

aragaer
sumber
Bukankah Anda perlu :;N;$!batau serupa untuk memulai, untuk mengumpulkan garis input ke dalam ruang pola tunggal? Sunting: tidak Anda tidak; untuk itulah -zbendera itu digunakan.
Toby Speight
Anda dapat menggunakan ini untuk golf :;/^\S/M!s/^ //mg;t, sekarang tidak memerlukan-r
Kritixi Lithos
7

SWI-Prolog, 233 223 217 byte

a(A):-b(A,0,0,0,N),w(A,N,0).
b([A|T],P,K,M,N):-P=1,(A=10,b(T,0,0,M,N);b(T,1,0,M,N));A\=32,(M=0;K<M),b(T,1,0,K,N);I=K+1,b(T,0,I,M,N).
b(_,_,_,N,N).
w([A|T],N,P):-P<N,A=32,Q=P+1,w(T,N,Q);put(A),A=10,w(T,N,0);w(T,N,P);!.

Sunting : Sepenuhnya mengubah jawaban saya. Sekarang menggunakan kode karakter, bukan string.

Contoh memanggil ini akan menjadi a(` a b\n c d\n e f`). , dengan backquotes. Anda mungkin perlu menggunakan tanda kutip ganda "sebagai gantinya jika Anda memiliki distribus SWI-Prolog yang lama.

Fatalisasi
sumber
5

Julia, 93 92 81 byte

Disimpan 10 byte berkat Glen O.

s->for i=(p=split(s,"\n")) println(i[min([search(j,r"\S")[1]for j=p]...):end])end

Ini menciptakan fungsi tanpa nama yang menerima string dan mencetak ke stdout.

Penjelasan + tidak dikumpulkan:

function f(s)
    # Split s into an array on newlines
    p = split(s, "\n")

    # Get the smallest amount of leading space by finding the
    # position of the first non-space character on each line
    # and taking the minimum
    m = min([search(j, r"\S")[1] for j in p]...)

    # Print each line starting after m
    for i in p
        println(i[m:end])
    end
end
Alex A.
sumber
Anda dapat menghemat ruang dengan mencari non-ruang pertama, daripada menghitung jumlah ruang. Daripada minimum([length(search(j, r"^ +")) for j in p])+1, gunakan minimum([search(j,r"[^ ]")[1]for j=p]). Karena tantangan menyatakan bahwa semua baris akan memiliki teks non-spasi, itu aman, dan menghemat 9 byte (termasuk 3 disimpan dengan menggunakan =bukan `dalam ). Still looking to see if more can be saved. (I wish I could drop the [1]`, tetapi pencarian menghasilkan array enumerator bertipe Any, sedangkan minimum membutuhkan an Int type)
Glen O
Maafkan kesalahan di atas - tampaknya, saya telah menggunakan suntingan saya - ini bukan 9 byte, tetapi 6, karena saya gagal untuk mencatat bahwa Anda telah menggunakan = dalam bentuk golf. Lagi pula, saya dapat menyimpan dua karakter lagi dengan mendefinisikan p dalam memulai loop for:s->for i=(p=split(s,"\n")) println(i[minimum([search(j,r"[^ ]")[1]for j=p]):end])end
Glen O
OK, ini satu lagi untuk mencukur sedikit - daripada menggunakan minimum(x)kapan xarray, gunakan min(x...), untuk satu byte ekstra disimpan (saya akan menambahkan ini ke daftar tips golf Julia saya).
Glen O
@ GlenO Bagus, terima kasih atas sarannya. Juga, karena Julia menggunakan PCRE, karakter non-ruang dapat dicocokkan dengan \Sbukan [^ ], yang menyimpan byte.
Alex A.
Hei, terima kasih telah menyebutkan itu - Saya tidak pandai dengan regex, tapi ternyata itu \Sberguna untuk solusi saya juga.
Glen O
4

Jawa, 159

Karena ada kekurangan Jawa yang mencolok ...

void f(String...a){int s=1<<30,b;a=a[0].split("\n");for(String x:a)s=(b=x.length()-x.trim().length())<s?b:s;for(String x:a)System.out.println(x.substring(s));}

Hanya loop yang membandingkan panjang dengan panjang yang dipangkas, lalu meludahkan substring. Tidak ada yang terlalu mewah. Untuk bilah gulir-cacat:

void f(String...a){
    int s=1<<30,b;
    a=a[0].split("\n");
    for(String x:a)
        s=(b=x.length()-x.trim().length())<s?b:s;       
    for(String x:a)
        System.out.println(x.substring(s));
}
Geobit
sumber
4

Perl, 47 33

Terima kasih @ThisSuitIsBlackNot untuk saran untuk menggunakan loop implisit Perl

#!/usr/bin/perl -00p
/^( +).*(\n\1.*)*$/&&s/^$1//mg

Di atas dinilai sebagai 30 byte untuk baris kode + 3 untuk 00pbendera.

Versi asli, sebagai fungsi:

sub f{$_=@_[0];/^( +).*(\n\1.*)*$/&&s/^$1//mgr}

Ini menempatkan argumen ke dalam $_, kemudian mencoba untuk dengan serakah mencocokkan spasi putih yang ada di semua lini dengan /^( +).*(\n\1.*)*$/- jika berhasil, $1sekarang berisi awalan umum terpanjang, dan kami menjalankan penggantians/^$1//mgr untuk menghapusnya dari awal setiap baris dan mengembalikan string yang dihasilkan.

Uji

$ cat 53219.data
   a   b
     c     d
    e f
$ ./53219.pl <53219.data 
a   b
  c     d
 e f
Toby Speight
sumber
Sangat keren. Anda dapat memotong beberapa byte dengan menjalankan baris perintah: perl -00pe '/^( +).*(\n\1.*)*$/&&s/^$1//mg'(30 byte + 3 untuk 00p).
ThisSuitIsBlackNot
/mepergi untuk melihat ke atas -00p; terima kasih @ ThisSuit
Toby Speight
3

Python 2, 86 79 75 Bytes

Ini hampir pasti dapat dipersingkat lagi, tetapi saat ini tidak buruk.

Terima kasih kepada xnor karena telah menghemat 4 byte!

s=input().split('\n')
for k in s:print k[min(x.find(x.strip())for x in s):]
Kade
sumber
1
Cara yang sedikit lebih pendek untuk menghitung ruang utama adalah x.find(x.strip()).
xnor
@xnatau panggilan yang bagus, terima kasih! Saya sudah menunggu solusi 60 byte dari Anda sepanjang hari; P
Kade
input()di Python 2 akan tersedak data ini.
Steven Rumbalski
@ SvenvenRumbalski, saya berasumsi bahwa input dikelilingi oleh tanda kutip. Saya dulu menambahkan 2 ke jumlah byte ke akun untuk ini, tetapi banyak orang mengatakan bahwa saya tidak perlu.
Kade
1
Program ini menyedihkan:):
HyperNeutrino
3

Ruby: 77 73 70 66 65 58 57 40 karakter

f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}

Contoh dijalankan:

irb(main):001:0> f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}
=> #<Proc:0x00000001855948@(irb):1 (lambda)>

irb(main):002:0> puts f["   a   b\n     c     d\n    e f"]
a   b
  c     d
 e f
=> nil

irb(main):003:0> f["   a   b\n     c     d\n    e f"] == "a   b\n  c     d\n e f"
=> true
manatwork
sumber
2
Bagaimana dengan f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}?
Ventero
Itu bagus, @Ventero. Terima kasih.
manatwork
2

C #, 18 + 145 = 163 byte

Membutuhkan (18 byte):

using System.Linq;

Metode (145 byte):

string R(string s){var l=s.Split('\n');return string.Join("\n",l.Select(x=>string.Concat(x.Skip(l.Select(z=>z.Length-z.Trim().Length).Min()))));}

Metode ini menghitung jumlah ruang terdepan terendah pada garis dan membuat string baru yang dibangun dari semua garis, dengan karakter N dilewati (di mana N adalah angka yang dihitung sebelumnya).

ProgramFOX
sumber
1

C #, total 149 byte

Praktis solusi yang sama dengan ProgramFOX, meskipun jumlah karakter yang harus dipotong dihitung secara manual.

using System.Linq;

Dan fungsinya sendiri:

string D(string s){var l=s.Split('\n');int i=0;while(l.All(a=>a[i]==' '))i++;return string.Join("\n",l.Select(b=>b.Substring(i)));}
Sok
sumber
@ProgramFOX Saya belum melihat solusi Anda sampai setelah saya me-refresh halaman btw: o)
Sok
1

Python 3, 100

def f(s):t=s.split("\n");return"\n".join([c[min([len(c)-len(c.lstrip(" "))for c in t]):]for c in t])
satu-satunya
sumber
1

JavaScript, ES6, 89 86 byte

Yang ini benar-benar hanya menggunakan pencocokan dan penggantian RegEx.

f=x=>eval(`x.replace(/(^|\\n) {${--`
${x}`.match(/\n */g).sort()[0].length}}/g,"$1")`)

// Snippet related stuff
B.onclick=x=>P.innerHTML=f(T.value)
<textarea id=T></textarea><br>
<button id=B>Trim</button>
<pre id=P></pre>

Seperti biasa, hanya Firefox, sejak ES6. Akan menambahkan versi ES5 nanti.

Pengoptimal
sumber
1
Sepertinya akan lebih pendek untuk menulis literal Ekspresi Reguler sebagai string dan kemudian
mengevaluasi
@ vihan1086 Anda mungkin benar. Biarkan saya mencobanya.
Pengoptimal
1

K, 31 byte

{`0:(&/{(0;#*=x)@*x}'" "=x)_'x}

Mengambil input daftar string dan mencetak hasilnya ke stdout.

kirbyfan64sos
sumber
1

Haskell, 52 byte

unlines.until(any(/=' ').map head)(map tail).lines

Contoh penggunaan: unlines.until(any(/=' ').map head)(map tail).lines $ " abc\n def\n ghi"->" abc\ndef\n ghi\n"

Bagaimana itu bekerja:

                                           lines    -- split the input at newlines into a list of lines
        until                                       -- repeat the 2nd argument, i.e.
                                 map tails          -- cut off the heads of all lines
                                                    -- until the the first argument returns "True", i.e.
             any(/=' ').map head                    -- the list of heads contains at least one non-space
unlines                                             -- transform back to a single string with newlines in-between
nimi
sumber
1

Python, 94/95

lambda (94 byte):

f=lambda s:'\n'.join(l[min(l.find(l.strip()) for l in s.split('\n')):] for l in s.split('\n'))

def (95 byte)

def f(s):l=s.split('\n');m=min(i.find(i.strip())for i in l);return '\n'.join(i[m:] for i in l);
TheCrypt
sumber
1

bash + sed + coreutils, 74 , 56 , 55

Uji data

s="\
   a   b
     c     d
    e f"

Menjawab

cut -c$[`grep -o '^ *'<<<"$s"|sort|line|wc -c`]-<<<"$s"

Keluaran

a   b
  c     d
 e f
Thor
sumber
2
Beberapa perubahan golf sederhana membawa ini ke 56 dalam hitungan saya:cut -c$[`grep -o '^ *'<<<"$s"|sort|sed q|wc -c`]-<<<"$s"
Digital Trauma
1
@ DigitalTrauma: Bagus, saya lupa tentang $[]aritmatika. Menggunakan cutuntuk pemilihan kolom jauh lebih baik. Saya tidak pernah melihat sed qsebagai alternatif head -n1, ini adalah trik golf yang bagus. Terima kasih!
Thor
2
Mengenai head -n1vs sed q, ada linealat dalam paket util-linux.
manatwork
@Manatwork: Itu menghemat satu karakter, saya akan menggunakannya. Perhatikan bahwa itu sudah usang dan mungkin hilang di masa depan, ini dari deprecated.txt di pohon sumber util-linux: "Mengapa: tidak berguna, tidak ada yang menggunakan perintah ini, kepala (1) lebih baik".
Thor
1

R, 118 111 byte

Menggunakan fungsi string yang luar biasa dari R :) Ini mirip / sama dengan solusi lain yang sudah diposting. Masukan melalui STDIN dan kucing ke STDOUT.

cat(substring(a<-scan(,'',sep='|'),Reduce(min,lapply(strsplit(a,' '),function(x)min(which(x>''))-1))),sep='\n')

Tes dan penjelasan

> cat(substring(a<-scan(,'',sep='|'),Reduce(min,lapply(strsplit(a,' '),function(x)min(which(x>''))-1))),sep='\n')
1:                  a<-scan(,'',sep='|') # get the input lines
2:                                                         strsplit(a,' ') # split lines on spaces
3:                                                  lapply(                ,function(x)min(which(x>''))-1) # get min index - 1 for non space of each line
4:                                      ,Reduce(min,                                                      ) # get the min of those
5:        substring(                                                                                       ) # trim it off
6:    cat(                                                                                                  ,sep='\n') # output each line
7:
Read 6 items
              a<-scan(,'',sep='|') # get the input lines
                                                     strsplit(a,' ') # split lines on spaces
                                              lapply(                ,function(x)min(which(x>''))-1) # get min index - 1 for non space of each line
                                  ,Reduce(min,                                                      ) # get the min of those
    substring(                                                                                       ) # trim it off
cat(                                                                                                  ,sep='\n') # output each line
> 
MickyT
sumber
Hei, selamat atas perwakilan 3k!
Alex A.
@AlexA. Cheers, tidak berpikir itu penting bagiku ... tapi :)
MickyT
Maksud Anda hidup Anda tidak berputar di sekitar titik-titik Internet palsu? : P
Alex A.
@AlexA. Semoga tidak :) selamat atas
6k
1

Julia, 72 62 61 57 54 49 byte

g=s->ismatch(r"^\S"m,s)?s:g(replace(s,r"^ "m,""))

Tidak Disatukan:

g(s)=
if ismatch(r"^\S"m,s)       # Determines if there's a newline followed by something other than a space
                            # Note: the m in r"^ "m says to work in multiline mode.
    s                       # If there is, return the string as the final result.
else                        # otherwise...
    m=replace(s,r"^ "m,"")  # Remove first space after each newline, and space at start of string.
    g(m)                    # Feed back into the function for recursion
end

Solusi yang lebih lama (57 byte):

g(s)=ismatch(r"
\S","
"s)?s:g(replace(s,"
 ","
")[2:end])

Solusi asli (72 byte):

g(s)=all([i[1]<33for i=split(s,"\n")])?g(replace(s,"\n ","\n")[2:end]):s
Glen O
sumber
1

k (24 byte)

Mengambil string sebagai argumen dan mengembalikan string (dengan trailing baris baru).

{`/:(&//&:'~^s)_'s:`\:x}

Contoh:

k) f:{`/:(&//&:'~^s)_'s:`\:x};
k) f"   a   b\n     c     d\n    e f"
"a   b\n  c     d\n e f\n
skeevey
sumber
1

05AB1E , 10 byte

|©ζ®gð*Ûζ»

Cobalah online!

Tuan Xcoder
sumber
Tunggu, *ulangi string b beberapa kali? .. Tidak tahu tentang fitur itu *. Saya biasanya melakukan s∍(swap dan memperpanjang) ketika saya ingin mengulangi karakter tertentu.
Kevin Cruijssen
Ya, memang, itu berfungsi untuk string, terutama karena vektorisasi tidak cukup masuk akal dalam kasus string dan иmenghasilkan daftar karakter.
Tn. Xcoder
0

Gawk, 101 100

{match($0,/^( +)/,t);if(t[1]<s||s==""){s=t[1]};z[NR]=$0;}END{for(r in z){sub(s,"",z[r]);print z[r]}}

Sebagai contoh...

cat input.txt | gawk '{match($0,/^( +)/,t);if(t[1]<s||s==""){s=t[1]};z[NR]=$0;}END{for(r in z){sub(s,"",z[r]);print z[r]}}'

Keluaran...

a   b
  c     d
 e f
Rip Leeb
sumber
Petunjuk yang baru saja diuji: jangan tangkap /^( +)//^ +/(maka Anda akan memiliki nilai yang dibutuhkan t[0]sebagai ganti t[1]); ubah s==""!s; hapus {dan }sekitar kode setelah if; hapus ;sebelumnya }; menggunakan fungsi spesifik Gawk untuk dapat menghapus {dan }sekitar kode setelah for: {sub(s,"",z[r]);print z[r]}print gensub(s,"",1,z[r]).
manatwork
Maaf untuk mengatakan, tetapi kedua kode asli Anda dan yang dengan optimasi ukuran saya gagal pada input dengan garis tidak diindentasikan, selain yang terakhir. (Misalnya "␠one \ nzero \ n␠one \ n␠␠two".)
manatwork
0

C GCC, 74 Bytes

main(_,z){z=1;while(-~(_=getchar()))putchar(_==32&&z?0:(z=_==10?1:0,_));}

Hanya menghapus semua spasi putih, tidak berhubungan dengan baris sebelumnya, meminta bantuan untuk menyelesaikan. JUGA, dalam hal ruang putih umum, apakah OP berarti bahwa garis mana yang memiliki ruang terdepan paling sedikit, yaitu jumlah ruang yang harus dihapus dari setiap garis?

Jake
sumber
Ya, menggunakan garis dengan spasi terdepan paling sedikit sudah benar.
Sp3000
0

Ditumpuk , tidak bersaing, 43 byte

:lines'^ +'match$#'"!MIN' '*0# '^'\+''mrepl

Cobalah online!

Ini berfungsi dengan menemukan jumlah spasi di awal setiap baris ( '^ +'match$#'"!), mendapatkan minimum, ulangi spasi yang berkali-kali, dan menggantinya dengan apa pun di setiap baris.

Conor O'Brien
sumber
0

Vim, 33 , 31 byte

qq/\v%^(\s.*\n?)*%$
:%s/.
@qq@q## Heading ##

Cobalah online!

Versi lama:

qq:g/\v%^(\s.*\n?)*%$/%s/.
n@qq@q
DJMcMayhem
sumber
-1

CoffeeScript, 112 byte

f=(x)->(a=x.split "\n").map((v)->v[Math.min.apply(null,a.map((v)->(r=/^ +/.exec v)&&r[0].length))...]).join "\n"
rink.attendant.6
sumber
-1

JavaScript (ES6), 106 98 byte

Baris baru diperlukan dan masing-masing dihitung 1 byte:

f=x=>(a=x.split`
`).map(v=>v.slice(Math.min(...a.map(v=>(r=/^ +/.exec(v))&&r[0].length)))).join`
`

Demo

Seperti jawaban ES6 lainnya, mereka hanya berfungsi di Firefox saat ini.

f=x=>(a=x.split`
`).map(v=>v.slice(Math.min(...a.map(v=>(r=/^ +/.exec(v))&&r[0].length)))).join`
`

// For demonstration purposes
console.log = x => X.innerHTML += x + `\n<hr>`;

console.log(f("a"));
console.log(f("   abc"));
console.log(f("   abc\n def\n  ghi"));
console.log(f("    a\n    b\n    c"));
console.log(f("    a\n    b\n    c\nd"));
console.log(f("   a   b\n     c     d\n    e f"));
<pre id=X></pre>

rink.attendant.6
sumber
11
Akan lebih bagus jika downvoter bisa menjelaskan ...
rink.attendant.6
-1

JavaScript ES6, 85 byte

s=>s.split`
`.map(z=>z.slice(Math.min(...s.match(/^ */gm).map(l=>l.length)))).join`
`

Baris baru itu signifikan

Demo ES5:

function t(s) {
  return s.split("\n").map(function(z) {
    return z.slice(Math.min.apply(0, s.match(/^ */gm).map(function(l) {
      return l.length;
    })));
  }).join('');
}

// Demo
document.getElementById('go').onclick = function() {
  document.getElementById('r').innerHTML = t(document.getElementById('t').value)
};
Input:
<br>
<textarea id="t"></textarea>
<br>
<button id="go">Run</button>
<br>Output:
<br>
<pre style="background-color:#DDD;" id="r"></pre>

Downgoat
sumber
-1

JavaScript ( ES6 ) 56

Rekursif, mencoba untuk menghapus satu spasi pada satu waktu dari setiap baris sampai ditemukan non-spasi.

Tes menjalankan cuplikan di bawah ini - menjadi ES6, hanya Firefox

f=s=>(r=s.replace(/^./gm,x=>(k|=x>' ',''),k=0),k?s:f(r))

// Test
test=
[[ "a", "a" ]
,["   abc", "abc" ]
,["   abc\n def\n  ghi", "  abc\ndef\n ghi" ]
,["    a\n    b\n    c", "a\nb\nc" ]
,["    a\n    b\n    c\nd", "    a\n    b\n    c\nd" ]
,["   a   b\n     c     d\n    e f","a   b\n  c     d\n e f" ]]

var tb=''
test.forEach(t=>{
  t[2]=f(t[0])
  t[3]=t[2]==t[1]?'OK':'FAIL'
  tb+='<tr><td>'+t.join('</td><td>')+'</td></tr>'
})
B.innerHTML=tb
td { white-space: pre; font-family: monospace; border: 1px solid#444; vertical-align:top}
#I,#O { height:100px; width: 200px }
<b>Your test:</b>
<table><tr><td><textarea id=I></textarea></td>
<th><button onclick='O.innerHTML=f(I.value)'>-></button></th>
<td id=O></td></tr></table>
<b>Test cases:</b><br>
<table ><tr><th>Input</th><th>Expected</th><th>Output</th><th>Result</th></tr>
<tbody id=B></tbody></table>

edc65
sumber