Tugas Anda kali ini adalah mengimplementasikan varian expand(1)
utilitas POSIX yang memperluas tab ke spasi.
Program Anda adalah untuk mengambil spesifikasi tabstop dan kemudian membaca input pada standar masuk dan mengganti karakter tab pada input dengan jumlah ruang yang sesuai untuk mencapai tabstop berikutnya. Hasilnya harus ditulis dengan standar keluar .
Spesifikasi tabstop
Sebuah spesifikasi tabstop terdiri dari baik satu nomor, atau daftar dipisahkan koma tabstops. Dalam kasus nomor tunggal, itu diulang seolah-olah kelipatannya terjadi dalam daftar yang dipisahkan koma (yaitu 4
bertindak sebagai 4,8,12,16,20,...
). Setiap entri dalam daftar yang dipisahkan koma adalah bilangan bulat positif yang secara opsional diawali oleh a +
. Sebuah +
awalan menunjukkan perbedaan relatif terhadap nilai sebelumnya dalam daftar dipisahkan koma. Nilai pertama dalam daftar harus mutlak (mis. Tidak diperbaiki). Tabstop menentukan kolom karakter non-spasi berikutnya (mengikuti tab diperluas), dengan kolom paling kiri diambil sebagai angka 0. Tab harus selalu diperluas ke setidaknya satu spasi.
Input output
Spesifikasi tabstop dapat diambil sebagai parameter baris perintah pertama untuk program, atau dibaca dari standar sebagai baris input pertama (diakhiri oleh baris baru), sesuai kebijakan Anda. Setelah tabstop telah dibaca, input yang tersisa (semua input, dalam kasus sebelumnya) sampai EOF akan diproses dan diperluas. Output yang diperluas harus ditulis dengan standar keluar.
Semua tabstop yang diperluas, dan semua input, diasumsikan memiliki lebar maksimum 80 kolom. Semua tabstop yang diperluas secara ketat meningkat.
Contoh
Spesifikasi tabstop 4,6,+2,+8
setara dengan 4,6,8,16
, dan dengan input keduanya
ab<Tab>c
<Tab><Tab>d<Tab>e<Tab>f
diperluas ke ( ␣
menunjukkan spasi)
ab␣␣c
␣␣␣␣␣␣d␣e␣␣␣␣␣␣␣f
01234567890123456 (Ruler for the above, not part of the output)
1111111
Penilaian adalah golf kode murni ; kode menang paling pendek.
sumber
x+($1?i:0)
sebagai yang lebih pendek$1?x+i:x
?:
) juga bisa menandai awal simbol , tetapi karena simbol tidak dapat dimulai dengan angka,:0
tidak apa-apa tanpa spasi. Atau sesuatu. Itu aneh. Kurung juga sangat penting.t<<x+($1?i:0);i=x
pernyataan pertama tidak berubahx
, bukan? Saya pikir Anda perlu membalikkannya sebagaii=x+($1?i:0);t<<i
i=t=[]
(karenai
dijamin tidak diperlukan saat pertama kali sekitar); menyederhanakan tab-stop parse ke{t<<i=$2.to_i+($1?i:0)}
, dan menghilangkanl
seluruhnya (i
sudah memegang nilai itu). Tapi satu yang bagus untuk tidak peduli tentang penghentian tab adalah peningkatan ketat: itu menyelamatkan Anda 4 karakter, dan saya bisa meminjamnya untuk menghemat 2.C, 228 karakter
Berikut adalah solusi C untuk memulai. Masih banyak golf yang bisa dilakukan di sini (lihat semua
if
s danfor
s danputchar
s ...). Diuji dengan contoh testcase, serta dengan input yang sama tetapi4
dan8
untuk spesifikasi tab.sumber