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 kode-golf , 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
sumber
Jawaban:
CJam,
2014 byteAlgoritma :
qN/_
)z{S-}#
)f>
)N*
)Ekspansi Kode
Cobalah online di sini
sumber
Pyth,
19181714 byteImplementasinya cukup keren.
u .z
meraih semua lini stdin dalam array, menempatkan dalamG
. Kemudian ia mengevaluasi tubuh bagian dalam, memasukkan hasilnyaG
, dan terus melakukan ini sampai tidak lagi berubah (titik tetap).!rhCG6
transposesG
, dapatkan elemen pertama dari array yang ditransposisikan (kolom pertama), menghapusnya dari spasi apa pun, dan memeriksa apakah ada karakter non-spasi putih yang tersisa.Nilai dari 2 adalah boolean, yang dapat dilihat sebagai int 0 atau 1.
>R G
meraih angka ini dan memotong banyak karakter di sebelah kiri setiap barisG
. Langkah 1, 2 dan 3 digabungkan pada dasarnya berarti bahwa ia akan terus menghapus kolom spasi sampai tidak ada kolom spasi kosong yang tersisa.jb
bergabung dengan array garis dengan baris baru dan mencetaknya.sumber
sed - 26 byte
jalankan bersama
-rz
Cukup mudah:
-r
opsi mengaktifkan regexps yang diperluas,-z
membaca seluruh input sebagai string tunggal (sebenarnya menggunakan NUL-byte sebagai pembatas garis)sumber
:;N;$!b
atau serupa untuk memulai, untuk mengumpulkan garis input ke dalam ruang pola tunggal? Sunting: tidak Anda tidak; untuk itulah-z
bendera itu digunakan.:;/^\S/M!s/^ //mg;t
, sekarang tidak memerlukan-r
SWI-Prolog,
233223217 byteSunting : 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.sumber
Julia,
939281 byteDisimpan 10 byte berkat Glen O.
Ini menciptakan fungsi tanpa nama yang menerima string dan mencetak ke stdout.
Penjelasan + tidak dikumpulkan:
sumber
minimum([length(search(j, r"^ +")) for j in p])+1
, gunakanminimum([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)s->for i=(p=split(s,"\n")) println(i[minimum([search(j,r"[^ ]")[1]for j=p]):end])end
minimum(x)
kapanx
array, gunakanmin(x...)
, untuk satu byte ekstra disimpan (saya akan menambahkan ini ke daftar tips golf Julia saya).\S
bukan[^ ]
, yang menyimpan byte.\S
berguna untuk solusi saya juga.Jawa, 159
Karena ada kekurangan Jawa yang mencolok ...
Hanya loop yang membandingkan panjang dengan panjang yang dipangkas, lalu meludahkan substring. Tidak ada yang terlalu mewah. Untuk bilah gulir-cacat:
sumber
Perl,
4733Terima kasih @ThisSuitIsBlackNot untuk saran untuk menggunakan loop implisit Perl
Di atas dinilai sebagai 30 byte untuk baris kode + 3 untuk
00p
bendera.Versi asli, sebagai fungsi:
Ini menempatkan argumen ke dalam
$_
, kemudian mencoba untuk dengan serakah mencocokkan spasi putih yang ada di semua lini dengan/^( +).*(\n\1.*)*$/
- jika berhasil,$1
sekarang berisi awalan umum terpanjang, dan kami menjalankan penggantians/^$1//mgr
untuk menghapusnya dari awal setiap baris dan mengembalikan string yang dihasilkan.Uji
sumber
perl -00pe '/^( +).*(\n\1.*)*$/&&s/^$1//mg'
(30 byte + 3 untuk00p
)./me
pergi untuk melihat ke atas-00p
; terima kasih @ ThisSuitPython 2,
867975 BytesIni hampir pasti dapat dipersingkat lagi, tetapi saat ini tidak buruk.
Terima kasih kepada xnor karena telah menghemat 4 byte!
sumber
x.find(x.strip())
.input()
di Python 2 akan tersedak data ini.):
Ruby:
7773706665585740 karakterContoh dijalankan:
sumber
f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}
?C #, 18 + 145 = 163 byte
Membutuhkan (18 byte):
Metode (145 byte):
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).
sumber
C #, total 149 byte
Praktis solusi yang sama dengan ProgramFOX, meskipun jumlah karakter yang harus dipotong dihitung secara manual.
Dan fungsinya sendiri:
sumber
Python 3, 100
sumber
JavaScript, ES6,
8986 byteYang ini benar-benar hanya menggunakan pencocokan dan penggantian RegEx.
Seperti biasa, hanya Firefox, sejak ES6. Akan menambahkan versi ES5 nanti.
sumber
K, 31 byte
Mengambil input daftar string dan mencetak hasilnya ke stdout.
sumber
Haskell, 52 byte
Contoh penggunaan:
unlines.until(any(/=' ').map head)(map tail).lines $ " abc\n def\n ghi"
->" abc\ndef\n ghi\n"
Bagaimana itu bekerja:
sumber
Python, 94/95
lambda (94 byte):
def (95 byte)
sumber
bash + sed + coreutils,
74,56, 55Uji data
Menjawab
Keluaran
sumber
cut -c$[`grep -o '^ *'<<<"$s"|sort|sed q|wc -c`]-<<<"$s"
$[]
aritmatika. Menggunakancut
untuk pemilihan kolom jauh lebih baik. Saya tidak pernah melihatsed q
sebagai alternatifhead -n1
, ini adalah trik golf yang bagus. Terima kasih!head -n1
vssed q
, adaline
alat dalam paket util-linux.R,
118111 byteMenggunakan fungsi string yang luar biasa dari R :) Ini mirip / sama dengan solusi lain yang sudah diposting. Masukan melalui STDIN dan kucing ke STDOUT.
Tes dan penjelasan
sumber
Julia,
726261575449 byteTidak Disatukan:
Solusi yang lebih lama (57 byte):
Solusi asli (72 byte):
sumber
k (24 byte)
Mengambil string sebagai argumen dan mengembalikan string (dengan trailing baris baru).
Contoh:
sumber
05AB1E , 10 byte
Cobalah online!
sumber
*
ulangi string b beberapa kali? .. Tidak tahu tentang fitur itu*
. Saya biasanya melakukans∍
(swap dan memperpanjang) ketika saya ingin mengulangi karakter tertentu.и
menghasilkan daftar karakter.Gawk,
101100Sebagai contoh...
Keluaran...
sumber
/^( +)/
→/^ +/
(maka Anda akan memiliki nilai yang dibutuhkant[0]
sebagai gantit[1]
); ubahs==""
→!s
; hapus{
dan}
sekitar kode setelahif
; hapus;
sebelumnya}
; menggunakan fungsi spesifik Gawk untuk dapat menghapus{
dan}
sekitar kode setelahfor
:{sub(s,"",z[r]);print z[r]}
→print gensub(s,"",1,z[r])
.C GCC, 74 Bytes
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?
sumber
Ditumpuk , tidak bersaing, 43 byte
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.sumber
Vim,
33, 31 byteCobalah online!
Versi lama:
sumber
Stax , 9 byte
Jalankan dan debug itu
sumber
CoffeeScript, 112 byte
sumber
JavaScript (ES6),
10698 byteBaris baru diperlukan dan masing-masing dihitung 1 byte:
Demo
Seperti jawaban ES6 lainnya, mereka hanya berfungsi di Firefox saat ini.
sumber
JavaScript ES6, 85 byte
Baris baru itu signifikan
Demo ES5:
sumber
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
sumber