Latar Belakang
Programmer LISP telah mengambil alih dunia! Tanda kurung telah dinyatakan sebagai karakter sakral, dan mulai sekarang, tanda kurung hanya dapat digunakan dalam program LISP. Telah diputuskan bahwa tanda kurung dalam karya sastra akan digantikan oleh catatan kaki, dan tugas Anda adalah mengotomatiskan ini untuk teks Markdown yang disederhanakan.
Memasukkan
Input Anda adalah string tunggal yang berisi karakter ASCII alfabet, spasi, dan karakter khusus ,.!?()
. Itu tidak akan mengandung baris atau digit baru. Tanda kurung akan dicocokkan dengan benar.
Keluaran
Anda harus mengubah setiap pasangan tanda kurung yang cocok di string input menjadi catatan kaki. Ini terjadi sebagai berikut:
- Ganti pasangan kurung yang cocok pertama dan substring di antara mereka dengan nomor berjalan yang dimulai dari
1
, dibungkus antara tag Penurunan harga<sup>
dan</sup>
. - Tambahkan ke akhir string
- dua baris baru,
- tag penurunan harga
<sub>
, - nomor dari langkah 1,
- sebuah ruang,
- substring di antara tanda kurung, dan
- tag penutup
</sub>
, dalam urutan ini.
- Jika masih ada tanda kurung di dalam string, lanjutkan ke langkah 1.
Output Anda adalah string yang dihasilkan, mungkin dengan trailing newline. Anda tidak harus menerapkan algoritme yang tepat ini, selama output Anda benar. Perhatikan bahwa mungkin ada tanda kurung bersarang; dalam hal ini, kami akan memiliki catatan kaki yang berisi referensi ke catatan kaki lainnya. Substring di antara tanda kurung juga mungkin kosong. Lihat contoh uji di bawah ini untuk contoh.
Aturan dan Penilaian
Anda dapat menulis program lengkap atau fungsi. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Jika bahasa Anda tidak mendukung angka desimal ( batuk Retina batuk ), Anda dapat memberikan nomor catatan kaki di pangkalan lain, termasuk biner atau unary; namun, menggunakan angka yang tidak dikenal akan memberikan penalti + 20% .
Uji Kasus
Memasukkan:
This input contains no parentheses.
Keluaran:
This input contains no parentheses.
Memasukkan:
This has (some) parentheses (but not so many).
Keluaran:
This has <sup>1</sup> parentheses <sup>2</sup>.
<sub>1 some</sub>
<sub>2 but not so many</sub>
Memasukkan:
This has (nested (deeply (or highly?) nested)) parentheses (and several groups).
Keluaran:
This has <sup>1</sup> parentheses <sup>2</sup>.
<sub>1 nested <sup>3</sup></sub>
<sub>2 and several groups</sub>
<sub>3 deeply <sup>4</sup> nested</sub>
<sub>4 or highly?</sub>
Memasukkan:
Hmm()(()(,)) a()((trt)(v( (((((wut)))))(X)(Y)(Z) )!?!?!?!))oooooooo(oooo)oooo
Keluaran:
Hmm<sup>1</sup><sup>2</sup> a<sup>3</sup><sup>4</sup>oooooooo<sup>5</sup>oooo
<sub>1 </sub>
<sub>2 <sup>6</sup><sup>7</sup></sub>
<sub>3 </sub>
<sub>4 <sup>8</sup><sup>9</sup></sub>
<sub>5 oooo</sub>
<sub>6 </sub>
<sub>7 ,</sub>
<sub>8 trt</sub>
<sub>9 v<sup>10</sup>!?!?!?!</sub>
<sub>10 <sup>11</sup><sup>12</sup><sup>13</sup><sup>14</sup> </sub>
<sub>11 <sup>15</sup></sub>
<sub>12 X</sub>
<sub>13 Y</sub>
<sub>14 Z</sub>
<sub>15 <sup>16</sup></sub>
<sub>16 <sup>17</sup></sub>
<sub>17 <sup>18</sup></sub>
<sub>18 wut</sub>
Perhatikan garis kosong di antara catatan kaki.
sumber
foo (bar)\nfoot (note)
?Jawaban:
Perl,
817572 byte71 byte kode + 1 byte argumen baris perintah.
Membutuhkan Perl 5.10 atau lebih baru (untuk dukungan regex rekursif)
Pemakaian:
Penjelasan
-p
parameter akan mencetak hasil dari menerapkan perintah yang diberikan pada input, menghindari kebutuhan untuk cetak eksplisit.Regex
(\(((?1)|.)*?)\))
sedang mencari set kurung terluar dari awal string. Ketika ini ditemukan, kami melakukan substitusi, memastikan kami hanya menambahkan di akhir input (dengan menangkap semuanya sampai akhir input menggunakan(.*)
).Kami kemudian mengulangi penggantian regex pada string yang sekarang-disubtitusi menggunakan
redo
, yang akan terus menerapkan penggantian regex sampai tidak lagi cocok. Thes
Memastikan pengubah bahwa.
di regex akan cocok baris baru, yang diperlukan karena kami mendaftar ulang pertandingan regex hasil substitusi regex sebelumnya.sumber
[^)]
atau bahkan.
bukannya[^()]
karena jaminan bahwa input akan seimbang dengan benar..
membuat pertandingan menjadi malas. @xebtl, tantangannya menyatakan "Ini tidak akan berisi baris baru atau angka"Emacs Lisp, 335 byte
Kata pengantar. Jawaban ini dan yang Skema saat ini adalah satu-satunya jawaban yang disetujui secara resmi oleh Republik Populer LISP dan Gereja Emacs. Jawaban lain, lebih pendek atau tidak, dianggap sebagai ancaman bagi perdamaian. Khususnya, dan dengan sangat meremehkan dugaan libelious tentang McCarthyism yang secara sporadis terdengar dari musuh negara yang bermusuhan, kami memerintahkan siapa pun yang memiliki informasi tentang identitas asli penulis anonim yang menulis jawaban Nonlisp untuk menghubungi Biro Lokal Anda. Diingatkan bahwa setiap orang harus meluangkan waktu untuk merenung dan memilih sesuai dengan apa yang dia yakini tidak akan mengancam interaksinya di masa depan dengan perwakilan resmi dari kekuasaan yang ada. Kode adalah data. Data adalah kode.
Lebih elegan:
sumber
Retina ,
968683 byte * 120% = 99,6Kode sumber solusi ini terdiri dari dua file:
Penjelasan
Ini adalah implementasi algoritma yang sangat langsung seperti yang dijelaskan dalam tantangan. Kode terdiri dari substitusi regex tunggal yang mengubah set kurung pertama menjadi catatan kaki. Substitusi ini diulangi
+
sampai string berhenti berubah, yang di sini berarti bahwa regex tidak lagi cocok (karena tidak dapat menemukan tanda kurung lagi).Catatan kaki dihitung dalam unary, sehingga saya bisa mencari nomor catatan kaki terakhir dan menambahkan
1
untuk membuat yang berikutnya.Regex untuk menemukan set tanda kurung pertama didasarkan pada teknik standar untuk mencocokkan tanda kurung dengan kelompok penyeimbang (jam, "tanda kurung yang cocok"). Ini telah dipersingkat sedikit dengan menggunakan grup yang tidak disebutkan namanya dan dengan mengasumsikan bahwa tanda kurung seimbang dengan benar (yang berarti kita dapat menghilangkan
(
dari kelas karakter yang dinegasikan dan mencocokkan final)
dengan yang sederhana.
dan kita juga tidak perlu memastikan bahwa capture stack kosong).Setelah mencocokkan tanda kurung dan mengambil isinya ke dalam grup
1
, kami menangkap sisa string dengan(.*)
ke dalam grup4
dan kemudian mencari kembali melalui string untuk set pertama1
s dengan tampilan negatif di belakang. Jika kami menemukan substring seperti itu, kami menyimpan dalam grup5
. Jika tidak, kita melihat di belakang gagal, tapi tidak apa-apa karena itu opsional - itu hanya berarti$5
akan memberikan string kosong yang merupakan representasi unary0
dan yang juga benar.Tali pengganti kemudian dengan mudah menyatukan semuanya berdasarkan kelompok penangkap. Nomor catatan kaki bertambah dengan menambahkan a
1
ke nomor terakhir dengan1$5
.sumber
JavaScript Suci , 1510 byte
Rekan-rekan pemberontak, jangan menyerah pada pembongkaran tirani kurung mereka! Anda harus gigih! Sejak awal, pemrograman telah menjadi usaha bebas. Sekarang, itu telah menjadi pertunjukan kesalehan yang meresapi. Kita harus menunjukkan tidak kurang dari ketakutan absolut. Karena itu, aku telah melawan!
Tidak ada aturan yang melarang penggunaan karakter suci dalam bahasa non-Lisp. Tidak, tidak sama sekali. (Dengan cara yang kurang kompak :)
Ini mengkompilasi ke JavaScript yang diperluas di jawaban saya yang lain . Ini adalah pengajuan lelucon.
sumber
Lua,
222216204201 byteGolf:
Tidak Terkumpul:
sumber
repeat a,b=l(s,g) ... untill a<1
loop akan lebih pendek dari yang kamu miliki?Skema, 92 byte
Frustasi dengan mengimplementasikan pencarian pertama di Real Lisp, 1 kekuatan-yang-memutuskan untuk mengambil pendekatan yang lebih pragmatis. Bagaimanapun, kurung itu suci, tetapi kurung tidak. 2
1. jangan dengarkan orang-orang sesat dari apa yang disebut “gereja” Emacs!
2. Mereka bukan programmer Racket, bukan?
sumber
Haskell, 210 byte
Contoh penggunaan:
Bagaimana itu bekerja:
sumber
Skema, 533 byte
Dengan lekukan:
Ya, ini adalah 533 byte ketika semua spasi putih opsional dihapus. Berjemur dalam kemuliaan fungsional.
Saya menerapkan kurang lebih algoritma dalam uraian:
x
mengelompokkan input dengan tanda kurung danf
mengganti tingkat pertama grup dengan catatan kaki, mengulang sampai tidak ada lagi grup yang tersisa. Saya yakin itu bisa dibuat lebih pendek, tapi saya tidak melihat bagaimana itu bisa dibuat lebih pendek tanpa beralih ke algoritma yang berbeda.Seperti yang tertulis, ini adalah program yang lengkap. Anda dapat mencobanya di sini , tetapi karena repl.it tampaknya tidak dapat menangani
(read-line)
Anda harus meletakkan string input di tempatnya. Versi yang sepenuhnya ungolfed ada di sini .EDIT: Seperti yang ditunjukkan dalam komentar, saya mengubah tanda kurung
()
menjadi tanda kurung[]
di versi repl.it. Ini murni untuk kenyamanan selama pemrograman dan debugging. Versi yang diposkan sekarang berfungsi dengan()
.sumber
#\[
'#] `oleh tanda kurung masing-masing (dan memperbarui tes), ini berfungsi tanpa masalah. Apakah ada alasan Anda meninggalkan yang persegi? apakah ini terkait dengan jawaban Anda sebelumnya?JavaScript ES6, 244 byte
Jawaban serius (hanya bekerja di FireFox, setahu saya)
Diperluas:
sumber
Hassium , 315 Bytes
Saat ini tidak bersaing karena ini tidak benar-benar menangani sarang juga.
Diperluas:
}
sumber