Latar Belakang
(Berdasarkan kisah nyata yang mengharukan)
Di waktu saya, saya sudah sering bermain-main dengan Lisp dan bahasa serupa. Saya sudah menulis dengan mereka, menjalankannya, menafsirkannya, mendesainnya, dan membuat mesin menulis untuk saya ... Dan jika ada satu hal yang menggangguku, ia melihat Lisp yang tidak mematuhi gaya pemformatan spesifik saya.
Sayangnya, beberapa editor teks ( batuk XCode batuk ) cenderung melucuti tab dan spasi indah saya setiap kali kode disalin dan ditempelkan ... Ambil sintaks mirip-Lisp seperti ini:
(A
(B
(C)
(D))
(E))
(Di mana ABCDE
fungsi arbitrer)
BEBERAPA editor teks memotong kode indah ini sampai akhir sebagai berikut:
(A
(B
(C)
(D))
(E))
Berantakan sekali! Itu tidak bisa dibaca!
Bantu aku, di sini?
Tantangan
Tujuan Anda dalam tantangan ini adalah untuk mengambil serangkaian fungsi yang dipisahkan oleh baris baru dalam format yang dijelaskan di bawah ini dan mengembalikan pengaturan yang lebih indah yang menyoroti keterbacaan dan keanggunan.
Input
Kita mendefinisikan fungsi F
dari arity N
argumen sebagai konstruk mirip dengan berikut ini:
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
di mana G1, G2, ..., GN
semua fungsi dalam dan dari diri mereka sendiri. Sebuah arity 0
fungsi A
hanyalah (A)
, sedangkan arity 2
fungsi B
adalah dalam bentuk(B (...) (...))
Kode Anda harus mengambil input sebagai serangkaian fungsi dengan satu baris baru sebelum tanda kurung utama setiap fungsi (kecuali untuk fungsi pertama). Contoh di atas adalah input yang valid.
Anda mungkin berasumsi:
- Tanda kurung seimbang.
- Sebuah fungsi tidak akan pernah harus menjorok lebih dari 250 kali.
- SETIAP fungsi dikelilingi oleh kurung:
()
- Nama fungsi hanya akan berisi karakter ASCII yang dapat dicetak.
- Nama fungsi tidak akan pernah mengandung tanda kurung atau spasi.
- Ada baris tambahan trailing opsional pada input.
Hasil
Kode Anda harus output yang sama set fungsi, di mana satu-satunya perubahan yang dibuat adalah penambahan spasi atau tab sebelum kurung terkemuka fungsi. Keluaran harus mematuhi aturan berikut:
- Fungsi pertama (dan fungsi tingkat atas kemudian) yang diberikan tidak boleh memiliki ruang sebelumnya
- Argumen ke lokasi horizontal fungsi adalah tepat satu tab di sebelah kanan lokasi horizontal fungsi itu.
- Tab adalah implementasi yang ditentukan, tetapi harus minimal 3 spasi.
- Anda dapat mencetak maksimal dua spasi setelah setiap baris.
Aturan
- Ini adalah kode-golf: kode terpendek menang!
- Celah Standar tidak diizinkan.
Contohnya
Memasukkan:
(A
(B
(C)
(D))
(E))
Keluaran:
(A
(B
(C)
(D))
(E))
Memasukkan:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Keluaran:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Memasukkan:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
Keluaran:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
sumber
()
?Jawaban:
Pyth,
24201918 byteTambahkan penghitung untuk setiap baris, hitung jumlah total tanda kurung yang ditemui sejauh ini, dan kurangi dari penghitung. Lalu kami indentasi oleh
counter
tab.sumber
*4
preferensi hardcoded dan berlebihan.FN.z+*ZC9N~Z-1/N\)
memungkinkan Anda menggunakan lebar indentasi editor Anda dan menyimpan satu byte.\<tab>
atauC9
.Common Lisp -
486414 bytes (versi Rube Goldberg)Pendekatan
Daripada melakukan seperti orang lain dan menghitung tanda kurung dengan tangan, mari kita memanggil pembaca Lisp dan melakukannya dengan Cara yang Benar :-)
(
,)
atau spasi putih sebagai string.read
fungsi standar untuk membuat daftar aktual.p
masing-masing daftar itu, yang secara rekursif menuliskannya ke output standar dengan format yang diminta. Secara khusus, string dicetak tanpa tanda kutip.Sebagai konsekuensi dari pendekatan ini:
Contoh
Membaca dari file, menggunakan pembungkus ini:
Inilah hasilnya:
(tampaknya tab dikonversi menjadi spasi di sini)
Cukup dicetak (versi golf)
Bertentangan dengan versi asli yang lebih aman, kami berharap input valid.
sumber
Retina ,
8983 byteDi mana
<tab>
singkatan dari karakter tab aktual (0x09) dan<empty>
singkatan dari baris kosong. Setelah melakukan penggantian itu, Anda dapat menjalankan kode di atas dengan-s
bendera. Namun, saya tidak menghitung bendera itu, karena Anda juga bisa meletakkan setiap baris di file sumbernya sendiri, dalam hal ini 7 baris baru akan diganti dengan 7 byte penalti untuk file sumber tambahan.Ini adalah program lengkap, mengambil input pada STDIN dan mencetak hasilnya ke STDOUT.
Penjelasan
Setiap pasangan garis mendefinisikan substitusi regex. Ide dasarnya adalah untuk menggunakan kelompok penyeimbang .NET untuk menghitung kedalaman saat ini hingga yang diberikan
(
, dan kemudian menyisipkan banyak tab sebelum itu(
.Pertama, kami menyiapkan input. Kami tidak dapat benar-benar menulis kembali sejumlah tab bersyarat, jika kami tidak dapat menemukannya di suatu string input untuk menangkapnya. Jadi kita mulai dengan menduplikasi seluruh input, dipisahkan oleh tab. Perhatikan bahwa
s`
just mengaktifkan pengubah single-line (atau "dot-all"), yang memastikan bahwa.
juga cocok dengan baris baru.Sekarang kita mengubah setiap karakter setelah tab menjadi tab juga. Ini memberi kita jumlah tab yang cukup di akhir string, tanpa memodifikasi string asli sejauh ini.
Ini adalah daging solusinya. The
m
dans
mengaktifkan mode multi-line (sehingga^
cocok awal dari garis) dan mode single-line. The+
memberitahu Retina terus mengulangi substitusi ini sampai output berhenti berubah (dalam hal ini, itu berarti sampai pola tidak lagi cocok string).Pola itu sendiri cocok dengan awalan input hingga yang tidak diproses
(
(yaitu,(
yang tidak memiliki tab sebelumnya, tetapi harus). Pada saat yang sama menentukan kedalaman awalan dengan kelompok penyeimbang, sehingga ketinggian tumpukan2
akan sesuai dengan kedalaman saat ini, dan oleh karena itu untuk jumlah tab yang perlu kita tambahkan. Itulah bagian ini:Itu cocok dengan
(
, mendorongnya ke2
tumpukan, atau cocok dengan)
, popping menangkap terakhir dari2
tumpukan, atau cocok dengan sesuatu yang lain dan meninggalkan tumpukan tidak tersentuh. Karena tanda kurung dijamin seimbang, kita tidak perlu khawatir untuk mencoba keluar dari tumpukan kosong.Setelah kami melewati string seperti ini dan menemukan yang belum diproses
(
untuk dihentikan, lookahead kemudian melompat ke depan hingga akhir string, dan menangkap tab ke dalam grup3
sambil muncul dari2
tumpukan hingga kosong:Dengan menggunakan
+
di sana, kami memastikan bahwa pola hanya cocok dengan apa pun jika setidaknya satu tab harus dimasukkan ke dalam kecocokan - ini menghindari loop tak terbatas ketika ada beberapa fungsi level root.Terakhir, kita singkirkan tab pembantu di akhir string untuk membersihkan hasilnya.
sumber
C:
9594 karakterIni belum bermain golf, dan dari pertanyaan saya tidak yakin apakah tab dapat diterima, yang saya gunakan di sini.
Tidak Disatukan:
Sunting: Dibuat agar berhenti di EOF.
sumber
if(c<11)
bukanif(c==10)
?Julia,
10399979488 byteIni mendefinisikan fungsi tanpa nama yang menerima string dan mencetak versi indentasi. Untuk menyebutnya, berikan nama, mis
f=p->...
. Perhatikan bahwa input harus berupa string Julia yang valid, sehingga tanda dolar ($
) harus diloloskan.Penjelasan + tidak dikumpulkan:
Contoh, berpura-pura setiap set empat spasi adalah tab:
Setiap saran lebih dari diterima!
sumber
Haskell,
8381solusi poin yang sangat gratis.
sumber
h=
.Perl, 41
40
karakter+1
untuk-p
.Jalankan dengan:
sumber
Python 2 -
8878 BytesSolusi yang cukup mudah (dan tidak terlalu singkat):
sumber
'\t'
bukannya' '
menyimpan satu byte; 2) tidak perlu menetapkaninput.split()
ke variabel, karena hanya digunakan sekali (sama untukc
, dan juga - hanyad
memindahkanprint
pernyataan); 3) operator diutamakan berarti tanda kurung di sekitarl*c
tidak diperlukan. Juga, sepertinyaf
tidak digunakan untuk apa pun - apakah itu peninggalan versi sebelumnya?raw_input
alih-alihinput
(dan jangan lupa tanda kurung setelah itu!).CJam, 20 byte
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber