Toggle the Box!

9

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 ktanda hubung di mana kadalah 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 ||
| +-------+|
+----------+
HyperNeutrino
sumber
1
"Tidak ada jalur input yang akan memiliki spasi whitespace terkemuka atau tertinggal baik secara keseluruhan dan di setiap baris, terlepas dari apakah sudah masuk kotak atau tidak." Beberapa kasus uji Anda memiliki spasi putih terkemuka. Apakah input persegi panjang terlalu banyak untuk ditanyakan?
Neil
@ Neil Dia mungkin berarti tidak ada spasi putih terdepan yang konsisten , yaitu setiap baris yang dimulai dengan 3 spasi tidak akan menjadi kasus tetapi garis yang dimulai dengan 1, 2, 0, 3 spasi akan karena itu tidak konsisten.
Erik the Outgolfer
Apakah ini kotak atau tidak?
user41805
@ Cowsquack Dari spek sepertinya tidak.
Erik the Outgolfer
@ Neil Maaf, maksud saya setiap spasi di awal akan menjadikannya bukan kotak.
HyperNeutrino

Jawaban:

6

JavaScript (ES2017), 199 byte

s=>/^\+-*\+\n(\|.*\|\n)*\+-*\+$/.test(s,s=s.split`
`,s.map(z=>z[y]?y=z.length:0,y=0))?s.slice(1,-1).join`
`.replace(/.(.*)./g,"$1"):(x=`+${'-'.repeat(y)}+`)+`
|${s.map(z=>z.padEnd(y)).join`|
|`}|
`+x

Solusi naif. Mungkin atau tidak menjadi yang terbaik, kita akan lihat ...

Produksi ETH
sumber
"Mungkin atau tidak menjadi yang terbaik, kita akan lihat ..." masih asyik melihat bahasa non-golf seperti JS untuk menyelesaikan ini dalam <200 byte ... lihat apa yang saya lakukan di sana? ;)
Erik the Outgolfer
Haha, terdengar seperti iklan untuk sesuatu "sekarang di bawah 2 dolar!" ketika harganya 1,99: P
ETHproduk
Itu disebut lol perampokan industri .
Erik the Outgolfer
Ini bekerja untuk uji kasus, tapi saya tidak berpikir itu bekerja untuk sesuatu seperti ini: '+--+\n|hi|\n|world|\n+----------+'. Ini menghilangkan garis, meskipun itu bukan persegi panjang.
Rick Hitchcock
3

SOGL V0.12 , 72 byte

2-┌* +1Ο;2-⁴┌@ŗΖ+|ŗ∙⁴++B
▓Aa1w⁄;lGB╬8a⁰I{_=}¹χ?ajk{jk}⁰←a1w⁄;l2+G2+B00╬5

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)

dzaima
sumber
⁰I{_=}¹χadalah +8 byte bukan +7.
Erik the Outgolfer
@EriktheOutgolfer juga penggantian seharusnya =, tetapi karena itu tidak bekerja, itu berubah panjang dengan -1 + 8 = +7
dzaima
2

Jelly , 46 byte

ẋ2jЀ
z©⁶”|çZṖ”-çµḢ⁾-+yWWçWẎZ
ḊṖZḊṖÇ
Ỵ®2ĿÇ⁼$?Y

Cobalah online!

Erik the Outgolfer
sumber
Um ini mentranspos (ritsleting) input saat membuatnya menjadi persegi panjang
HyperNeutrino
@HyperNeutrino Saya tidak ingat melakukan itu ketika saya menjawab ...
Erik the Outgolfer
2

Retina , 197 195 byte

+m`^((.)*)(¶(?<-2>.)*(?(2)$|(.)))
$1$#4$* $3$#2$* 
%`^|$
|
^.(.*).
+$.1$*-+¶$&
.(.*).$
$&¶+$.1$*-+
^(\+-*\+)¶(\|\+-*\+\|)¶(\|\|.*\|\|¶)*\2¶\1$
¶$&¶
..(.*)..(?=(.|¶)*¶$)
$1
^¶-*¶-*¶|(\G|¶)-*¶-*¶$

Cobalah online! Penjelasan:

+m`^((.)*)(¶(?<-2>.)*(?(2)$|(.)))
$1$#4$* $3$#2$* 

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 $1hanyalah garis yang cocok, tetapi $2merupakan 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:

  • Tidak ada cukup karakter di baris kedua. $2masih ada beberapa pertandingan tersisa.
  • Kedua garis itu memiliki panjang yang persis sama. $2tidak memiliki kecocokan yang tersisa, dan kami berada di akhir baris.
  • Baris kedua lebih panjang, jadi setidaknya ada satu karakter yang tersisa.

(?(2)$|(.)))membantu membedakan ini menggunakan suatu kondisi. Jika $2masih ada sisa pertandingan, maka kita perlu ini karena baris kedua terlalu pendek, jadi kita cocok dengan akhir baris, tetapi jika $2tidak ada sisa pertandingan, maka kita ingin baris kedua lebih panjang, jadi kami cocok karakter (yang masuk $4sehingga 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 $#4mengevaluasi ke 1jika kita cocok karakter tambahan pada baris kedua, 0jika 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.

^.(.*).
+$.1$*-+¶$&

Tempatkan +-...-+di atas.

.(.*).$
$&¶+$.1$*-+

Dan lagi di bagian bawah.

^(\+-*\+)¶(\|\+-*\+\|)¶(\|\|.*\|\|¶)*\2¶\1$
¶$&¶

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.

..(.*)..(?=(.|¶)*¶$)
$1

Jika ada garis kosong yang tertinggal, hapus dua karakter dari awal dan akhir setiap baris.

^¶-*¶-*¶|(\G|¶)-*¶-*¶$

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.

Neil
sumber