Diberikan string yang berpotensi kotak, beralih kotak. Ini menjadi lebih jelas dalam kasus uji dan penjelasan.
Input output
Masukkan format
Input akan berupa string tunggal yang dipisahkan oleh CR, LF, atau CRLF, atau daftar string. Format input terserah Anda untuk memutuskan.
Format output
Format output harus dalam format yang sama dengan input.
Penjelasan + Contoh
Mari kita ambil string kotak sebagai contoh:
+-------------+
|Hello, World!|
+-------------+
Untuk beralih kotak, kami menghapus baris pertama dan terakhir dan kolom pertama dan terakhir. Anda dapat mengasumsikan bahwa tidak akan ada spasi spasi tambahan setelah baris terakhir (dengan baris tambahan opsional pada akhir baris terakhir), dan tidak ada spasi tambahan spasi pada baris apa pun, tidak termasuk baris baru tentunya.
Ini akan menjadi:
Hello, World!
Jalan lain
Jika string tidak ada dalam kotak, tambahkan kotak ke dalamnya. Ini cukup sederhana; prepend +---...---+
pada garisnya sendiri dengan k
tanda hubung di mana k
adalah panjang dari garis terpanjang, dan kemudian untuk setiap baris, padukan dengan spasi spasi agar sesuai dengan panjang garis terpanjang dan kemudian tambahkan dan tambahkan karakter pipa ( "|"
). Terakhir, tambahkan baris yang berisi +---...---+
pengaturan yang sama dengan baris pertama.
Sebagai contoh:
Hello, World!
menjadi:
+-------------+
|Hello, World!|
+-------------+
Anda dapat mengasumsikan bahwa tidak ada garis di input yang akan memiliki spasi spasi.
Contoh lain dari string yang seharusnya memiliki kotak diletakkan di sekitarnya:
Hello,
World!
menjadi
+----------+
|Hello, |
| World!|
+----------+
Contoh dari sesuatu yang masih harus dikotakkan:
+--------+
| |
--------+
menjadi:
+----------+
|+--------+|
|| ||
| --------+|
+----------+
Aturan + Spesifikasi
- Celah Standar Berlaku
- Tidak ada jalur input yang akan memiliki spasi putih terdepan atau tambahan baik secara keseluruhan maupun di setiap baris, terlepas dari apakah sudah dimasukkan dalam kotak atau tidak
- Kotak hanya akan memiliki
+
sebagai sudutnya dan|
untuk tepi vertikal dan-
untuk sisi horizontal. - Kotak harus memiliki nilai tambah di tempatnya untuk dianggap sebagai kotak; jika memiliki tinggi atau lebar 2 (yaitu, tidak ada konten), itu harus tetap terbuka, yang akan menghasilkan banyak baris baru, tergantung pada tinggi kotak.
- Jika input memiliki kotak tetapi teks di luar kotak, semuanya harus dikotakkan.
- Program Anda harus memeriksa seluruh perimeter string. Jika satu karakter di sepanjang bagian luar tidak benar (baik karakter yang hilang atau berbeda dari yang seharusnya), maka itu harus kotak, bukan tanpa kotak.
- String yang tidak dikotakkan itu sendiri mungkin berisi
+ | -
. Jika string yang tidak kotak itu sendiri memiliki kotak di sekitarnya, kembalikan string dengan kotak tersebut; seharusnya hanya dibuka satu kali saja.
Kasus Tepi
1: Kotak kecil
Memasukkan:
++
++
Output adalah baris kosong atau baru
Memasukkan:
+----+
+----+
Output kosong atau baris baru
Memasukkan:
++
||
||
++
Output adalah 2 baris baru atau 3 baris baru
2: Kotak Sebagian
Memasukkan:
+-------+
| Hello |
+ ------+
Keluaran:
+---------+
|+-------+|
|| Hello ||
|+ ------+|
+---------+
3: Teks di luar kotak
Memasukkan:
+-------+
a| Hello |
+-------+
Keluaran:
+----------+
| +-------+|
|a| Hello ||
| +-------+|
+----------+
Jawaban:
JavaScript (ES2017), 199 byte
Solusi naif. Mungkin atau tidak menjadi yang terbaik, kita akan lihat ...
sumber
'+--+\n|hi|\n|world|\n+----------+'
. Ini menghilangkan garis, meskipun itu bukan persegi panjang.SOGL V0.12 , 72 byte
Coba Di Sini!
+7 byte (
⁰I{_=}¹χ
) karena elementwise sama dengan tidak diterapkan+1 byte (
▓
) karena input tidak dijamin menjadi persegi+1 byte (
A
) karena saya malas dan tidak mengimplementasikan input yang diketik (jadi ini mengharapkan input pada stack. Untuk kemudahan penggunaan, tautan online termasuk → sehingga kotak input dapat digunakan)sumber
⁰I{_=}¹χ
adalah +8 byte bukan +7.=
, tetapi karena itu tidak bekerja, itu berubah panjang dengan -1 + 8 = +7Jelly , 46 byte
Cobalah online!
sumber
Retina ,
197195 byteCobalah online! Penjelasan:
Tahap ini cukup rumit, jadi saya akan memecahnya sedikit.
+
berarti bahwa tahap berulang sampai tidak ada lagi pengganti yang dapat ditemukan.m`^
berarti panggung cocok pada awal setiap baris.((.)*)
kemudian cocok dengan seluruh baris. Sekarang$1
hanyalah garis yang cocok, tetapi$2
merupakan daftar karakter yang cocok.(¶
kemudian cocok dengan akhir baris dan karenanya awal baris berikutnya.(?<-2>.)*
menggunakan grup .NET balancing. The<-2>
Menghapus pertandingan dari$2
asalkan karakter dapat dicocokkan pada baris kedua. Pada titik ini, satu dari tiga hal dapat terjadi:$2
masih ada beberapa pertandingan tersisa.$2
tidak memiliki kecocokan yang tersisa, dan kami berada di akhir baris.(?(2)$|(.)))
membantu membedakan ini menggunakan suatu kondisi. Jika$2
masih ada sisa pertandingan, maka kita perlu ini karena baris kedua terlalu pendek, jadi kita cocok dengan akhir baris, tetapi jika$2
tidak ada sisa pertandingan, maka kita ingin baris kedua lebih panjang, jadi kami cocok karakter (yang masuk$4
sehingga kita tahu bahwa pertandingan terjadi). Kalau tidak, kedua baris memiliki panjang yang sama dan pertandingan gagal pada saat ini (mungkin cocok lagi pada baris berikutnya tentu saja).String pengganti adalah
$1$#4$* $3$#2$*
. The$#4
mengevaluasi ke1
jika kita cocok karakter tambahan pada baris kedua,0
jika tidak. Ini berarti$#4$*
menambahkan spasi ke baris pertama jika baris kedua lebih panjang. Demikian pula$#2$*
menambahkan spasi ke baris kedua jika baris pertama lebih panjang. (Bahkan, akhirnya menambahkan jumlah ruang yang tepat. Jika kita hanya menyeimbangkan dua baris, a+
bisa ditambahkan ke grup tangkapan keempat untuk mencapai ini secara langsung untuk kasus baris kedua yang lebih panjang juga.)Hasil dari semua ini adalah bahwa tahap ini menyambungkan input ke dalam persegi panjang. Kita sekarang dapat menggambar kotak di sekitarnya.
Tempatkan
|
di setiap sisi.Tempatkan
+-...-+
di atas.Dan lagi di bagian bawah.
Lihat apakah kami telah membuat kotak ganda. Jika demikian, baris kosong tambahan ditambahkan di bagian atas dan bawah untuk tahapan yang tersisa agar cocok untuk menghapus kedua kotak.
Jika ada garis kosong yang tertinggal, hapus dua karakter dari awal dan akhir setiap baris.
Jika ada baris kosong di depan, hapus baris tersebut dan dua baris berikutnya (yang akan
-
tersisa di bagian atas kotak). Jika ada garis kosong yang tertinggal, hapus dan dua baris sebelumnya. Kesepakatan(\G|¶)
dengan kasus di mana hanya ada enam baris (dan karena itu 5¶
detik) karena kotak tidak memiliki konten.sumber