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)))))
()
?