pengantar
Sebagian besar pegolf kode di sini menambahkan penjelasan pada kiriman mereka, jadi lebih mudah untuk memahami apa yang terjadi. Biasanya codelines pergi ke kiri dan penjelasan yang sesuai ke kanan dengan semacam pemisah. Agar terlihat cantik, pemisah semua berada di kolom yang sama. Juga teks penjelasan panjang biasanya dibungkus ke baris berikutnya, sehingga pembaca tidak harus menggulir secara horizontal untuk membaca semuanya.
Namun, ketika Anda ingin mengedit penjelasan ini karena Anda membuat beberapa golf gila, Anda sering menghabiskan waktu untuk membuat penjelasan Anda lagi. Karena ini adalah tugas yang sangat berulang, Anda ingin menulis sebuah program untuk ini.
Tantangan
Diberikan beberapa baris kode dengan penjelasan dan pemisah, menampilkan kode yang diformat dengan baik dengan penjelasan.
Contoh
Memasukkan
shM-crz1dc4. "ANDBYOROF # z = input rz1 # ubah input menjadi huruf besar masukan masukan cd # pada spasi c4. "ANDBYOROF # membuat daftar kata - kata dari string yang dikemas yang akan diabaikan - # saring kata-kata itu hM # hanya mengambil huruf pertama dari semua kata s # gabungkan mereka menjadi satu string
Keluaran
shM-crz1dc4. "ANDBYOROF # z = input rz1 # ubah input menjadi huruf besar masukan masukan cd # pada spasi c4. "ANDBYOROF # membuat daftar kata - kata dari string yang dikemas # diabaikan - # saring kata-kata itu hM # hanya mengambil huruf pertama dari semua kata s # gabungkan mereka menjadi satu string
Satu cookie untuk yang pertama yang bisa mengetahui apa yang dilakukan kode ini.
Algoritma pemformatan
- Temukan baris kode terpanjang (tidak termasuk penjelasan dan spasi antara kode dan pemisah).
- Tambahkan 5 spasi setelah baris kode ini dan tambahkan pemisah yang sesuai dengan penjelasan. Sekarang ini adalah garis referensi.
- Sesuaikan setiap baris lain ke baris referensi ini, sehingga pemisah semua berada di kolom yang sama.
- Bungkus semua baris yang lebih panjang dari 93 karakter ke baris baru dengan cara berikut:
- Temukan kata terakhir yang ujungnya ada di kolom 93 atau lebih rendah.
- Ambil semua kata setelah ini dan bungkus ke baris baru dengan pemisah utama dan spasi yang benar. Ruang antara kedua kata tersebut harus dihapus, sehingga baris pertama diakhiri dengan karakter kata dan baris kedua dimulai dengan satu setelah pemisah.
- Jika baris yang dihasilkan masih lebih dari 93 karakter, lakukan hal yang sama lagi sampai setiap baris di bawah 94 karakter.
Catatan
- Sebuah kata terdiri dari karakter yang bukan spasi. Kata-kata dipisahkan oleh satu ruang.
- Pembungkus kata selalu memungkinkan. Ini berarti bahwa tidak ada kata yang terlalu panjang sehingga tidak memungkinkan pembungkusnya.
- Input hanya akan berisi ASCII yang dapat dicetak dan tidak akan memiliki spasi spasi tambahan
- Pemisah hanya akan muncul sekali per baris.
- Sementara penjelasan dapat memiliki panjang tidak terbatas, pemisah dan kode hanya dapat memiliki panjang
93 - 5 = 87
karakter maksimum gabungan . 5 karakter adalah spasi antara kode dan pemisah. Panjang kode dan pemisah akan selalu setidaknya satu karakter. - Input mungkin berisi baris kosong. Itu tidak akan mengandung karakter apa pun (kecuali baris baru jika Anda mengambil input sebagai string multiline). Baris-baris kosong itu juga harus ada di output.
- Setiap baris akan memiliki beberapa kode, pemisah, dan penjelasan. Pengecualian adalah baris kosong.
- Anda dapat mengambil input dalam format apa pun yang wajar, asalkan tidak diproses terlebih dahulu. Jelaskan dalam jawaban Anda mana yang Anda gunakan.
- Output dapat berupa string multiline atau daftar string.
Aturan
- Fungsi atau program lengkap diizinkan.
- Aturan default untuk input / output.
- Celah standar berlaku.
- Ini adalah kode-golf , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.
Uji kasus
Format input di sini adalah daftar string yang mewakili garis dan string tunggal untuk pemisah. Keduanya dipisahkan oleh koma. Output adalah daftar string.
['shM-crz1dc4. "ANDBYOROF # z = input', '', 'rz1 # konversikan input ke huruf besar', 'cd # split input pada spasi', 'c4." ANDBYOROF # buat daftar kata dari paket. string yang harus diabaikan ',' - # saring kata-kata itu ',' hM # hanya mengambil huruf pertama dari semua kata ',' s # gabung menjadi satu string '], "#" -> [' shM-crz1dc4 . "ANDBYOROF # z = input ',' ',' rz1 # konversikan input ke huruf besar ',' cd # pisahkan input pada spasi ',' c4." ANDBYOROF # buat daftar kata dari string yang dikemas yang harus ' , '# diabaikan', '- # filter kata-kata itu ',' hM # hanya ambil huruf pertama dari semua kata ',' s # gabung menjadi satu string '] ['codecodecode e # Penjelasan', 'sdf dsf sdf e # A Sangat sangat sangat sangat sangat sangat sangat sangat sangat sangat lama sangat lama sangat lama sangat panjang sangat lama sangat lama penjelasan panjang dan itu terus semakin lama', '', 'beberapa lebih banyak codee # dan lebih banyak penjelasan '], "e #" -> [' codecodecode e # Penjelasan ',' sdf dsf sdf e # A Sangat sangat sangat sangat sangat sangat sangat sangat sangat sangat sangat sangat lama sangat lama sangat lama ',' e # panjang panjang penjelasan panjang dan panjang terus bertambah ',' e # dan lebih lama ',' ',' beberapa kode lagi e # dan beberapa penjelasan lainnya ']
Selamat Coding!
length of the longest code-line + 5
. Ini juga berlaku untuk garis yang hanya berisi penjelasan, karena dibungkus.Jawaban:
Ruby,
245237220216212209205 byteFungsi anonim. Pendekatan yang cukup mendasar (temukan panjang maks, tambah 5, lalu lakukan pemrosesan pada setiap baris, dengan rekursi untuk menangani pembungkus) dan mungkin ada pendekatan lain yang menyimpan lebih banyak byte.
Saya menghapus jawaban sebelumnya yang tidak memenuhi semua persyaratan; Saya tidak ingin memiliki kode setengah-dijawab sebagai jawaban (sudah mendapatkan downvotes karena tidak lengkap juga) tetapi harus melakukan semua pertanyaan yang ditanyakan, sekarang.
Changelog:
map
panggilan pertama dan mengeluarkan beberapastrip
fungsi yang tidak perlu berdasarkan janji bahwa kata-kata dalam penjelasan selalu memiliki satu ruang di antara mereka. Juga," "
ditugaskan ke konstanta sekarang karena saya banyak menggunakannya.map
panggilan bersama dengan memanfaatkan kekuatan fungsi tingkat tinggi, yang berarti bahwa panggilan peta pertama akan mengatur variabel panjangl
dengan benar bahkan jika itu dipanggil setelah deklarasi fungsi helpers
. -4 byte.\n
dengan baris baru yang sebenarnya, ditambah sedikit trik menggunakanif
lebih dari operator ternary (kapanjoin
dipanggil pada array dengannil
nilai, mereka menjadi string kosong).join
ternyata bisa diganti dengan a*
.sumber
93 - 5 = 87
karakter maksimum gabungan . Lima karakter adalah spasi antara kode dan pemisah. Kode dan pemisah akan selalu setidaknya sepanjang satu karakter." Bagian kode Anda melewati batas, dengan 97 karakter, sehingga program memiliki perilaku yang tidak ditentukan.LiveScript,
243236233228219225 byteCara kerjanya: kebanyakan seperti kode Java. Mulai dengan aliasing length (LiveScript memungkinkan untuk membuat fungsi dari operator dengan menggunakan tanda kurung).
.=
adalaha = a.b
- yang kami gunakan di sini untuk memetakan.=> blabla ..
adalah konstruksi kaskade Smalltalk-ish: sisi kiri=>
dapat diakses seperti..
untuk sisa blok; dan akan dikembalikan. Di sini, itu adalah elemen yang dibagi pada k. Catatan: Saya menggunakan interpolasi string, karena/
hanya berarti "split" dengan string literal.LS memungkinkan kita untuk menggunakan
a-=/regexp/
lambda ini (juga bekerja dengan string literal): itu hanya gula untuk.replace
panggilan.Akhirnya,
>?=
adalah>?
operator -assin kombinasi , yang mengembalikan lebih besar dari dua operan.LS memiliki gaya Python / Haskell untuk pemahaman, dengan tidak ada yang mewah di dalamnya, kecuali "string * times" untuk mengulang ruang cukup lama.
Ini untuk pemahaman berfungsi sebagai topik (lihat blok tentang kaskade anove).
Kami kemudian loop ke setiap elemen array (yang kami baru saja membangun dengan pemahaman), dan jika ada garis yang lebih besar dari 93char, kami menemukan indeks terakhir, terbagi di sana, dan mendorong garis yang dipisahkan tepat setelah iterasi saat ini ( ... Sehingga iterasi berikutnya akan terpecah lagi jika garis terlalu besar).
Hanya hal terakhir yang disukai
a[j to]
adalah rentang (dari j hingga akhir), tetapi karena menggunakan metode Array kita harus menggabungkannya kembali ke string, yang kita lakukan menggunakan overloaded*
:*''
.contoh
keluaran:
sumber
Java, 347 + 19 = 366 byte
Membutuhkan
Demikianlah +19 byte.
Mengambil dalam format
f.accept(List<String> code, String seperator)
. Format di tempat. Versi yang membuat dan mengembalikan yang baruList<String>
mungkin sepele untuk diimplementasikan tetapi perlu biaya beberapa byte.Indentasi + contoh penggunaan:
... Saya mungkin harus menjalankan ini sendiri: P
sumber
replace(" *"+s)
tidak berhasil tapireplaceAll(" *"+s)
apakah saya ingin mendengarnya - saya tidak bisa mengetahuinya.replace
menggunakan string tetapireplaceAll
menggunakan regex. </badguess>PowerShell,
224217235 byteMemperbarui logika untuk menentukan panjang string kode maks. Diperbarui untuk memungkinkan beberapa pemisah yang menyertakan karakter meta regex.
Penjelasan Kecil
Ini membutuhkan keseluruhan string baris baru untuk input.
Contoh Output dengan beberapa Lorem Ipsum
sumber
MATLAB,
270265262 byteProgram menerima input
I
dalam bentuk array sel string di mana setiap elemen array sel adalah baris input yang terpisah. Itu juga menerima input kedua yang menunjukkan apa karakter komentar (yaitu#
). Fungsi mengembalikan string multi-line yang diformat dengan benar.Penjelasan singkat
Contoh Input
Contoh Output
sumber