สลับกล่อง!


9

กำหนดสตริงที่อาจมีกล่องในสลับกล่อง สิ่งนี้จะชัดเจนขึ้นในกรณีทดสอบและคำอธิบาย

อินพุต / เอาต์พุต

รูปแบบอินพุต

อินพุตจะเป็นสตริงเดี่ยวคั่นด้วย CR, LF หรือ CRLF หรือรายการสตริง รูปแบบอินพุตขึ้นอยู่กับคุณที่จะตัดสินใจ

รูปแบบผลลัพธ์

รูปแบบเอาต์พุตต้องอยู่ในรูปแบบเดียวกับอินพุต

คำอธิบาย + ตัวอย่าง

ลองมาดูสตริงบรรจุกล่องเป็นตัวอย่าง:

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

ในการสลับกล่องเราจะลบแถวแรกและแถวสุดท้ายและคอลัมน์แรกและคอลัมน์สุดท้าย คุณอาจคิดว่าจะไม่มีช่องว่างต่อท้ายหลังบรรทัดสุดท้าย (พร้อมบรรทัดใหม่ที่เป็นตัวเลือกที่ท้ายบรรทัดสุดท้าย) และไม่มีช่องว่างต่อท้ายบนบรรทัดใด ๆ ไม่นับบรรทัดใหม่ของหลักสูตร

นี่จะกลายเป็น:

Hello, World!

วิธีอื่น ๆ

หากสตริงไม่ได้อยู่ในกล่องให้เพิ่มกล่องลงไป มันค่อนข้างง่าย เติม+---...---+เส้นของตัวเองด้วยkเครื่องหมายขีดคั่นโดยที่kความยาวของบรรทัดที่ยาวที่สุดและจากนั้นสำหรับแต่ละบรรทัดให้วางด้วยช่องว่างต่อท้ายเพื่อจับคู่ความยาวของบรรทัดที่ยาวที่สุดจากนั้นเติมและผนวกอักขระไพพ์ ( "|") ในที่สุดผนวกบรรทัดที่มีการ+---...---+ตั้งค่าเช่นเดียวกับบรรทัดแรก

ตัวอย่างเช่น:

Hello, World!

กลายเป็น:

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

คุณอาจจะสมมติไม่มีเส้นในการป้อนข้อมูลที่จะมีช่องว่างต่อท้าย

ตัวอย่างของสตริงที่ควรมีกล่องวางไว้รอบ ๆ :

Hello,
    World!

กลายเป็น

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

ตัวอย่างของสิ่งที่ควรได้รับการบรรจุอยู่:

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

กลายเป็น:

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

กฎ + ข้อมูลจำเพาะ

  • ช่องโหว่มาตรฐานใช้
  • บรรทัดของอินพุตจะไม่มีช่องว่างนำหน้าหรือต่อท้ายทั้งโดยรวมและในแต่ละบรรทัดโดยไม่คำนึงว่ามีการบรรจุในกล่องหรือไม่
  • กล่องจะมี+มุมและ|ขอบแนวตั้งและ-ด้านแนวนอนเท่านั้น
  • กล่องจะต้องมีข้อดีในสถานที่ที่จะได้รับการพิจารณาเป็นกล่อง; หากมีความสูงหรือความกว้าง 2 (นั่นคือไม่มีเนื้อหา) ก็ควรจะยังไม่ได้ทำกล่องซึ่งจะส่งผลให้มีการขึ้นบรรทัดใหม่ขึ้นอยู่กับความสูงของกล่อง
  • ถ้าอินพุตมีกล่อง แต่มีข้อความด้านนอกของกล่องสิ่งทั้งหมดควรได้รับการบรรจุไว้
  • โปรแกรมของคุณจะต้องตรวจสอบขอบเขตทั้งหมดของสตริง ถ้าตัวเดียวพร้อมนอกไม่ถูกต้อง (อย่างใดอย่างหนึ่งที่หายไปหรือตัวละครที่แตกต่างจากสิ่งที่มันควรจะเป็น) แล้วมันควรจะได้รับการบรรจุอยู่ในกล่องไม่ไม่มีกล่อง
  • + | -สตริงไม่มีกล่องตัวเองอาจจะมี ถ้าสตริงที่ไม่มีกล่องตัวเองมีกล่องอยู่รอบ ๆ ให้ส่งคืนสตริงพร้อมกล่อง ควรจะถูก unbox ครั้งเดียวเท่านั้น

คดีขอบ

1: กล่องเล็ก ๆ

การป้อนข้อมูล:

++
++

เอาต์พุตว่างเปล่าหรือขึ้นบรรทัดใหม่

การป้อนข้อมูล:

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

เอาต์พุตว่างหรือขึ้นบรรทัดใหม่

การป้อนข้อมูล:

++
||
||
++

ผลลัพธ์คือ 2 บรรทัดใหม่หรือ 3 บรรทัดใหม่

2: กล่องบางส่วน

การป้อนข้อมูล:

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

เอาท์พุท:

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

3: ข้อความนอกกรอบ

การป้อนข้อมูล:

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

เอาท์พุท:

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

1
"ไม่มีบรรทัดอินพุตใดที่จะมีช่องว่างนำหน้าหรือต่อท้ายทั้งโดยรวมและในแต่ละบรรทัดโดยไม่คำนึงว่ากล่องนั้นถูกบรรจุอยู่หรือไม่ก็ตาม" กรณีทดสอบหลายรายการของคุณมีช่องว่างนำหน้า อินพุตสี่เหลี่ยมจะถามมากเกินไปหรือไม่
Neil

@Neil เขาอาจหมายถึงไม่มีช่องว่างนำหน้าที่สอดคล้องกันนั่นคือแต่ละบรรทัดที่ขึ้นต้นด้วย 3 ช่องว่างจะไม่เป็นกรณี แต่บรรทัดที่ขึ้นต้นด้วย 1, 2, 0, 3 ช่องว่างอาจเป็นเพราะช่องว่างนั้นไม่สอดคล้องกัน
Erik the Outgolfer

คือนี้กล่องหรือไม่?
user41805

@ Cowsquack จากสเป็คดูเหมือนว่ามันไม่ได้
Erik the Outgolfer

@ Neil ขออภัยฉันหมายความว่าช่องว่างใด ๆ ที่จุดเริ่มต้นจะทำให้ไม่เป็นช่อง
HyperNeutrino

คำตอบ:


6

JavaScript (ES2017), 199 ไบต์

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

ทางออกไร้เดียงสา อาจจะดีที่สุดเราจะเห็น ...


"อาจจะดีหรือไม่ดีเราจะเห็น ... " แต่ก็ยังเจ๋งที่เห็นภาษาที่ไม่ใช่กอล์ฟเช่น JS เพื่อแก้ปัญหานี้ใน <200 ไบต์ ... ดูว่าฉันทำอะไรที่นั่น? ;)
Erik the Outgolfer

ฮ่าฮ่าฟังดูเหมือนโฆษณาสำหรับบางอย่าง "ตอนนี้ราคาไม่ถึง 2 ดอลลาร์!" เมื่อค่าใช้จ่าย 1.99: P
ETHproductions

ที่เรียกว่าอุตสาหกรรมการปล้นฮ่า ๆ
Erik the Outgolfer

งานนี้สำหรับกรณีทดสอบ '+--+\n|hi|\n|world|\n+----------+'แต่ผมไม่คิดว่ามันทำงานบางอย่างเช่นนี้: มันลบเส้นแม้ว่ามันจะไม่ได้เป็นรูปสี่เหลี่ยมผืนผ้า
Rick Hitchcock

3

SOGL V0.12 , 72 ไบต์

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

ลองที่นี่!

+7 ไบต์ ( ⁰I{_=}¹χ) เนื่องจาก elementwise เท่ากับไม่ได้รับการใช้งาน
+1 ไบต์ ( ) เนื่องจากอินพุตไม่ได้รับประกันว่าจะเป็นตาราง
+1 ไบต์ ( A) สำหรับฉันที่ขี้เกียจและไม่ได้ใช้อินพุตที่พิมพ์ (ดังนั้นสิ่งนี้คาดว่าอินพุตสำหรับสแต็ก ใช้งานง่ายลิงค์ออนไลน์รวมไปถึง→เพื่อให้สามารถใช้กล่องป้อนข้อมูลได้)


⁰I{_=}¹χคือ +8 ไบต์ไม่ใช่ +7
Erik the Outgolfer

@EriktheOutgolfer การเปลี่ยนที่ควรจะเป็น=แต่มันไม่ได้ผลมันเปลี่ยนความยาวเป็น -1 + 8 = +7
dzaima

2

เยลลี่ขนาด 46 ไบต์

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

ลองออนไลน์!


อืม transposes นี้ (รหัสไปรษณีย์) อินพุตเมื่อทำให้มันเป็นรูปสี่เหลี่ยมผืนผ้า
HyperNeutrino

@HyperNeutrino ฉันจำไม่ได้ว่ามันทำอย่างนั้นเมื่อฉันตอบ ...
Erik the Outgolfer

2

เรติน่า , 197 195 ไบต์

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

ลองออนไลน์! คำอธิบาย:

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

ขั้นตอนนี้ค่อนข้างซับซ้อนในตัวเองดังนั้นฉันจะทำลายมันลงเล็กน้อย +หมายความว่าสเตจทำซ้ำจนกว่าจะไม่สามารถหาผู้แทนที่ได้อีก m`^หมายความว่าสเตจตรงจุดเริ่มต้นของบรรทัดใด ๆ ((.)*)จากนั้นจับคู่ทั้งบรรทัด ตอนนี้$1เป็นเพียงแค่สายที่จับคู่ แต่$2เป็นรายการของการแข่งขันเช่นตัวละคร จากนั้นตรงกับจุดสิ้นสุดของบรรทัดและดังนั้นการเริ่มต้นของบรรทัดถัดไป (?<-2>.)*ใช้. NET สมดุลกลุ่ม การ<-2>ลบการแข่งขันจาก$2ตราบเท่าที่ตัวละครสามารถจับคู่ในบรรทัดที่สอง ณ จุดนี้หนึ่งในสามสิ่งสามารถเกิดขึ้นได้:

  • บรรทัดที่สองมีอักขระไม่เพียงพอ $2ยังมีการแข่งขันเหลืออีก
  • เส้นสองเส้นมีความยาวเท่ากันทุกประการ $2ไม่มีการแข่งขันที่เหลือและเราอยู่ที่ท้ายบรรทัด
  • บรรทัดที่สองยาวกว่าดังนั้นมีอักขระอย่างน้อยหนึ่งตัวเหลืออยู่

(?(2)$|(.)))ช่วยแยกแยะสิ่งเหล่านี้โดยใช้เงื่อนไข หาก$2ยังมีการแข่งขันเหลืออยู่เราต้องให้สิ่งนี้เป็นเพราะบรรทัดที่สองสั้นเกินไปดังนั้นเราจึงจับคู่จุดสิ้นสุดของบรรทัด แต่ถ้า$2ไม่มีการจับคู่ที่เหลือเราต้องการให้บรรทัดที่สองยาวกว่าดังนั้นเราจึงจับคู่ ตัวละคร (ซึ่งจะเข้าไป$4เพื่อให้เรารู้ว่าการแข่งขันเกิดขึ้น) มิฉะนั้นเส้นสองเส้นจะมีความยาวเท่ากันและการจับคู่ล้มเหลว ณ จุดนี้ (อาจตรงกันอีกครั้งในภายหลังในภายหลัง)

$1$#4$* $3$#2$*สตริงทดแทน $#4ประเมิน1ถ้าเราจับคู่ตัวอักษรเพิ่มเติมในบรรทัดที่สอง, 0หากไม่ได้ ซึ่งหมายความว่า$#4$*จะเพิ่มช่องว่างในบรรทัดแรกหากบรรทัดที่สองยาวกว่า $#2$*เพิ่มช่องว่างในบรรทัดที่สองในทำนองเดียวกันหากบรรทัดแรกยาวกว่า (อันที่จริงแล้วมันจะเพิ่มจำนวนช่องว่างที่ถูกต้องหากเราทำการปรับสมดุลสองบรรทัดเท่านั้น+อาจถูกเพิ่มเข้าไปในกลุ่มการจับภาพที่สี่

ผลที่สุดของทั้งหมดนี้คือสเตจนี้ตัดอินพุตให้เป็นสี่เหลี่ยม ตอนนี้เราสามารถวาดกล่องล้อมรอบมัน

%`^|$
|

วาง|s ในแต่ละด้าน

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

วาง+-...-+ไว้ด้านบน

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

และอีกครั้งที่ด้านล่าง

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

ดูว่าเราได้สร้างกล่องคู่หรือไม่ หากเป็นเช่นนั้นจะมีการเพิ่มบรรทัดว่างพิเศษที่ด้านบนและด้านล่างสำหรับสเตจที่เหลือเพื่อจับคู่เพื่อลบทั้งสองกล่อง

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

หากมีบรรทัดว่างต่อท้ายให้ลบอักขระสองตัวออกจากจุดเริ่มต้นและจุดสิ้นสุดของทุกบรรทัด

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

หากมีเส้นว่างนำหน้าให้ลบออกและอีกสองบรรทัดถัดไป (ซึ่งจะเป็นบรรทัดที่-เหลือที่ด้านบนของช่อง) หากมีบรรทัดว่างต่อท้ายให้ลบออกและสองบรรทัดก่อนหน้า (\G|¶)เกี่ยวข้องกับกรณีที่มีเพียงหกบรรทัด (และ 5 s) เพราะกล่องมีเนื้อหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.