Chuyển đổi hộp!


9

Đưa ra một chuỗi có khả năng được đóng hộp, chuyển đổi hộp. Điều này trở nên rõ ràng hơn trong các trường hợp thử nghiệm và giải thích.

Đầu ra đầu vào

Định dạng đầu vào

Đầu vào sẽ là một chuỗi đơn được phân tách bằng CR, LF hoặc CRLF hoặc danh sách các chuỗi. Các định dạng đầu vào là tùy thuộc vào bạn để quyết định.

Định dạng đầu ra

Định dạng đầu ra phải cùng định dạng với đầu vào.

Giải thích + Ví dụ

Hãy lấy một chuỗi được đóng hộp làm ví dụ:

+-------------+
|Hello, World!|
+-------------+

Để chuyển đổi hộp, chúng tôi xóa hàng đầu tiên và cuối cùng và cột đầu tiên và cuối cùng. Bạn có thể giả định rằng sẽ không có khoảng trắng ở cuối dòng cuối cùng (với dòng mới tùy chọn ở cuối dòng cuối cùng) và không có khoảng trắng ở cuối dòng nào, không tính dòng mới tất nhiên.

Điều này sẽ trở thành:

Hello, World!

Cách khác

Nếu chuỗi không nằm trong một hộp, hãy thêm một hộp vào nó. Điều này khá đơn giản; thêm +---...---+vào dòng riêng của nó bằng kdấu gạch ngang có kđộ dài của dòng dài nhất và sau đó cho mỗi dòng, đệm nó với khoảng trắng ở cuối để khớp với độ dài của dòng dài nhất, sau đó thêm vào và nối thêm ký tự ống ( "|"). Cuối cùng, nối một dòng chứa +---...---+thiết lập tương tự như dòng đầu tiên.

Ví dụ:

Hello, World!

trở thành:

+-------------+
|Hello, World!|
+-------------+

Bạn có thể cho rằng không có dòng nào trong đầu vào sẽ có khoảng trắng ở cuối.

Một ví dụ khác về một chuỗi nên có một hộp đặt xung quanh nó:

Hello,
    World!

trở thành

+----------+
|Hello,    |
|    World!|
+----------+

Một ví dụ về một cái gì đó vẫn nên được đóng hộp:

+--------+
|        |
 --------+

trở thành:

+----------+
|+--------+|
||        ||
| --------+|
+----------+

Quy tắc + Thông số kỹ thuật

  • Áp dụng sơ hở tiêu chuẩn
  • Không có dòng đầu vào nào có bất kỳ khoảng trắng đầu hoặc cuối nào cả về tổng thể và trong mỗi dòng, bất kể nó có được đóng hộp hay không
  • Các hộp sẽ chỉ có +các góc của chúng và |cho các cạnh dọc và -cho các cạnh ngang.
  • Một hộp phải có điểm cộng của nó để được coi là một hộp; nếu nó có chiều cao hoặc chiều rộng 2 (nghĩa là không có nội dung), thì nó vẫn phải được bỏ hộp, điều này sẽ dẫn đến một loạt các dòng mới, tùy thuộc vào chiều cao của hộp.
  • Nếu đầu vào có một hộp nhưng văn bản bên ngoài hộp, toàn bộ nên được đóng hộp.
  • Chương trình của bạn phải kiểm tra toàn bộ chu vi của chuỗi. Nếu một ký tự dọc bên ngoài không chính xác (thiếu hoặc một ký tự khác với ký tự), thì nó phải được đóng hộp, không được bỏ hộp.
  • Chuỗi unboxed chính nó có thể chứa + | -. Nếu chính chuỗi không có hộp có một hộp bao quanh nó, hãy trả lại chuỗi có hộp; nó chỉ nên được mở hộp một lần.

Vỏ cạnh

1: Hộp nhỏ

Đầu vào:

++
++

Đầu ra là trống hoặc một dòng mới

Đầu vào:

+----+
+----+

Đầu ra trống hoặc một dòng mới

Đầu vào:

++
||
||
++

Đầu ra là 2 dòng mới hoặc 3 dòng mới

2: Hộp một phần

Đầu vào:

+-------+
| Hello |
+ ------+

Đầu ra:

+---------+
|+-------+|
|| Hello ||
|+ ------+|
+---------+

3: Văn bản bên ngoài hộp

Đầu vào:

 +-------+
a| Hello |
 +-------+

Đầu ra:

+----------+
| +-------+|
|a| Hello ||
| +-------+|
+----------+

1
"Không có dòng đầu vào nào có bất kỳ khoảng trắng đầu hoặc cuối nào cả về tổng thể và trong mỗi dòng, bất kể nó có được đóng hộp hay không." Một số trường hợp thử nghiệm của bạn có khoảng trắng hàng đầu. Đầu vào hình chữ nhật sẽ là quá nhiều để hỏi?
Neil

@Neil Có lẽ anh ta có nghĩa là không có khoảng trắng hàng đầu nhất quán , nghĩa là mỗi dòng bắt đầu bằng 3 khoảng trắng sẽ không phải là trường hợp nhưng các dòng bắt đầu bằng 1, 2, 0, 3 khoảng trắng sẽ không có khoảng trắng.
Erik the Outgolfer

này một hộp hay không?
dùng41805

@Cowsquack Từ thông số kỹ thuật có vẻ như không phải vậy.
Erik the Outgolfer

@Neil Xin lỗi, ý tôi là bất kỳ khoảng trắng nào ở đầu sẽ khiến nó không phải là một hộp.
HyperNeutrino

Câu trả lời:


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

Giải pháp ngây thơ. Có thể hoặc không phải là tốt nhất, chúng ta sẽ thấy ...


"Có thể hay không là tốt nhất, chúng ta sẽ thấy ..." thật tuyệt khi thấy một ngôn ngữ không chơi gôn như JS để giải quyết vấn đề này trong <200 byte ... xem tôi đã làm gì ở đó? ;)
Erik the Outgolfer 25/07/17

Haha, nghe có vẻ như một quảng cáo cho một cái gì đó "bây giờ dưới 2 đô la!" khi nó có giá 1,99: P
Sản xuất ETH

Đó gọi là cướp công nghiệp lol.
Erik the Outgolfer

Điều này hoạt động cho các trường hợp thử nghiệm, nhưng tôi không nghĩ rằng nó hoạt động cho một cái gì đó như thế này : '+--+\n|hi|\n|world|\n+----------+'. Nó loại bỏ các dòng, mặc dù nó không phải là hình chữ nhật.
Rick Hitchcock

3

SOGL V0.12 , 72 byte

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

Hãy thử nó ở đây!

+7 byte ( ⁰I{_=}¹χ) vì phần tử bằng nhau không được triển khai
+1 byte ( ) vì đầu vào không được đảm bảo là
byte +1 ( A) cho tôi lười biếng và không triển khai các đầu vào được nhập (vì vậy điều này mong đợi đầu vào trên ngăn xếp. dễ sử dụng, liên kết trực tuyến bao gồm → vì vậy hộp đầu vào có thể được sử dụng)


⁰I{_=}¹χlà +8 byte chứ không phải +7.
Erik the Outgolfer

@EriktheOutgolfer nên thay thế =, nhưng vì nó không hoạt động, nó thay đổi độ dài -1 + 8 = +7
dzaima


2

Võng mạc , 197 195 byte

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

Hãy thử trực tuyến! Giải trình:

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

Bản thân giai đoạn này khá phức tạp, vì vậy tôi sẽ phá vỡ nó một chút. +có nghĩa là giai đoạn lặp lại cho đến khi không thể thay thế nữa. m`^có nghĩa là sân khấu phù hợp khi bắt đầu bất kỳ dòng nào. ((.)*)sau đó khớp với toàn bộ dòng Bây giờ $1chỉ đơn giản là dòng phù hợp, nhưng $2là một danh sách các trận đấu tức là các ký tự. sau đó khớp với cuối dòng và do đó bắt đầu dòng tiếp theo. (?<-2>.)*sử dụng nhóm cân bằng .NET. Việc <-2>xóa các $2kết quả trùng khớp miễn là một ký tự có thể được khớp trên dòng thứ hai. Tại thời điểm này, một trong ba điều có thể xảy ra:

  • Không có đủ ký tự trên dòng thứ hai. $2vẫn còn một số trận đấu còn lại.
  • Hai dòng có độ dài chính xác như nhau. $2không còn trận đấu nào, và chúng tôi ở cuối hàng.
  • Dòng thứ hai dài hơn, vì vậy có ít nhất một ký tự còn lại.

(?(2)$|(.)))giúp phân biệt những điều này bằng cách sử dụng một điều kiện. Nếu $2vẫn còn một số trận đấu còn lại, thì chúng tôi cần điều này là vì dòng thứ hai quá ngắn, vì vậy chúng tôi khớp với cuối dòng, nhưng nếu $2không có trận đấu nào còn lại, thì chúng tôi muốn dòng thứ hai dài hơn, vì vậy chúng tôi khớp một nhân vật (đi vào $4để chúng ta biết rằng trận đấu đã xảy ra). Mặt khác, hai dòng có cùng độ dài và trận đấu thất bại tại thời điểm này (dĩ nhiên nó có thể khớp với nhau ở dòng sau).

Chuỗi thay thế là $1$#4$* $3$#2$*. Việc $#4đánh giá 1nếu chúng ta khớp một ký tự bổ sung trên dòng thứ hai, 0nếu không. Điều này có nghĩa là $#4$*thêm một khoảng trắng cho dòng đầu tiên nếu dòng thứ hai dài hơn. Tương tự $#2$*thêm khoảng trắng vào dòng thứ hai nếu dòng đầu tiên dài hơn. (Trên thực tế, nó kết thúc bằng cách thêm chính xác số lượng khoảng trống. Nếu chúng ta chỉ cân bằng hai dòng, một dòng +có thể đã được thêm vào nhóm chụp thứ tư để đạt được điều này trực tiếp cho trường hợp của dòng thứ hai dài hơn.)

Kết quả cuối cùng là giai đoạn này đệm đầu vào thành một hình chữ nhật. Bây giờ chúng ta có thể vẽ một hộp xung quanh nó.

%`^|$
|

Đặt |s ở mỗi bên.

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

Đặt +-...-+lên trên cùng.

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

Và một lần nữa ở phía dưới.

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

Xem nếu chúng tôi đã tạo ra một hộp đôi. Nếu vậy, các dòng trống bổ sung được thêm vào ở trên cùng và dưới cùng cho các giai đoạn còn lại để khớp để xóa cả hai hộp.

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

Nếu có một dòng trống ở cuối, hãy xóa hai ký tự khỏi đầu và cuối của mỗi dòng.

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

Nếu có một dòng trống hàng đầu, hãy xóa nó và hai dòng tiếp theo (sẽ là dòng -còn lại ở đầu hộp). Nếu có một dòng trống ở cuối, hãy xóa nó và hai dòng trước đó. Các (\G|¶)thỏa thuận với trường hợp chỉ có sáu dòng (và do đó là 5 giây) vì hộp không có nội dung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.