บทนำ
ความท้าทายนี้ได้รับแรงบันดาลใจจากGrimeซึ่งเป็นภาษาจับคู่รูปแบบ 2D ของฉัน โดยทั่วไปคุณจะได้รับ "ไวยากรณ์" ที่อธิบายกริดสองมิติของตัวอักษรและงานของคุณคือการสร้างกริดตามไวยากรณ์ นอกจากนี้ตารางควรมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ในแง่อ่อน
อินพุต
ข้อมูลของคุณเป็นสตริงที่มีอักขระตัวพิมพ์เล็ก ASCII และสัญลักษณ์และ|
-
เพื่อความเรียบง่ายอินพุตไม่มีอักขระตัวพิมพ์เล็กซ้ำ ๆ สตริงเป็นข้อมูลจำเพาะสำหรับคลาสของกริดสี่เหลี่ยมของอักขระและแยกวิเคราะห์จากซ้ายไปขวาโดยใช้สแต็กดังนี้
- กำหนดอักขระตัวพิมพ์เล็ก
c
กดไปที่สแต็กm×n
กริดของอักขระc
สำหรับใด ๆm, n ≥ 1
สำหรับการใด ๆ - ได้รับท่อ
|
, pop สองกริดA
และB
จากสแต็ค (B
อยู่ชั้นบนสุด) และผลักดันตารางAB
ได้โดยการเชื่อมโยงไปทางขวาของB
A
สิ่งนี้ต้องการA
และB
มีความสูงเท่ากัน - ได้รับยัติภังค์
-
, pop สองกริดA
และB
จากสแต็ค (B
อยู่ชั้นบนสุด) และผลักดันตารางA/B
ได้โดยการเชื่อมโยงที่ด้านล่างของB
A
สิ่งนี้ต้องการA
และB
มีความกว้างเท่ากัน
รับประกันได้ว่าสำหรับตัวเลือกบางอย่างm
และn
ทำในระหว่างกระบวนการแยกวิเคราะห์ (ซึ่งอาจแตกต่างกันสำหรับตัวอักษรแต่ละตัว), ข้อกำหนดการป้อนข้อมูลอย่างถูกต้องอธิบายสี่เหลี่ยมผืนผ้าบางอย่างซึ่งถูกทิ้งไว้บนกองในตอนท้าย
เอาท์พุต
เอาต์พุตของคุณเป็นตารางสี่เหลี่ยมของอักขระที่ระบุโดยอินพุต กริดต้องมีขนาดเล็กที่สุดในแง่ที่ว่าการลบแถวหรือคอลัมน์ใด ๆ จะทำให้มันไม่ถูกต้อง คุณสามารถส่งคืนสตริงที่คั่นด้วยการขึ้นบรรทัดใหม่ (โดยมีหรือไม่มีการขึ้นบรรทัดใหม่), อาร์เรย์ของอักขระ 2 มิติหรืออาร์เรย์ของสตริงแล้วแต่จำนวนใดจะเป็นรูปแบบที่สะดวกที่สุด
โปรดทราบว่าคุณไม่จำเป็นต้องดำเนินการอินพุตตามที่อธิบายไว้ข้างต้น สิ่งสำคัญเพียงอย่างเดียวคือผลลัพธ์ของคุณถูกต้อง
ตัวอย่าง
พิจารณาสเปค
par-s||e-
ก่อนอื่นเราเลือกที่จะกด1×2
สี่เหลี่ยมp
และ1×1
สี่เหลี่ยมของa
และr
(เหตุผลนี้จะชัดเจนในภายหลัง) จากนั้นเราป๊อปอัพa
และr
สี่เหลี่ยมและผลักดันการเรียงต่อกันตามแนวตั้ง
a
r
ต่อไปเราจะกด1×2
สี่เหลี่ยมs
เปิดและสี่เหลี่ยมด้านบนแล้วกดการเรียงต่อกันในแนวนอน
as
rs
จากนั้นเราก็ปรากฎสี่เหลี่ยมนั้นและp
สี่เหลี่ยมและผลักดันการต่อกัน
pas
prs
ในที่สุดเราก็กด3×1
สี่เหลี่ยมจัตุรัสของe
ผุดขึ้นและสี่เหลี่ยมด้านบนแล้วกดการเรียงต่อกันตามแนวตั้ง
pas
prs
eee
นี่คือผลลัพธ์ของโปรแกรมหรืออย่างน้อยหนึ่งในความเป็นไปได้ สังเกตว่าถึงแม้ว่า
ppas
ppas
pprs
eeee
ถูกสร้างขึ้นโดยสเปคด้วยไม่ใช่เอาต์พุตที่ถูกต้องเนื่องจากแถวและคอลัมน์จำนวนมากสามารถลบออกได้
เป็นตัวอย่างที่ละเอียดยิ่งขึ้นให้พิจารณา
co|m|p|il|e|r|-
ข้อกำหนดนี้สร้างสี่เหลี่ยมผืนผ้า
comp
iler
ซึ่งเป็นผลลัพธ์ที่ถูกต้อง อย่างไรก็ตามมันก็สร้าง
commp
iiler
ซึ่งใช้ได้เช่นกันเนื่องจากไม่สามารถลบแถวหรือคอลัมน์เดียวโดยไม่ทำให้ถูกต้อง
กฎระเบียบ
คุณสามารถให้โปรแกรมเต็มหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต
กรณีทดสอบเพิ่มเติม
คุณสามารถใช้สิ่งเหล่านี้เพื่อทดสอบโปรแกรมของคุณ
Input:
a
Output:
a
Input:
co|mp|l|-ex|i|f|-y|
Example output:
cccoy
mplly
exify
Input:
ja-r|g-o|ni-|ze|d-|
Example output:
jronze
arondd
ggoidd
Input:
un|co|p-yr|i|gh-t-ab|-|le-||-
Example output:
unnnnnnn
coyriggl
ppyrihhe
ppyritte
ppyriabe
n
และm
ไม่ได้ถูกเลือก รับประกันว่ามีค่าที่เหมาะสมสำหรับพวกเขาอยู่ แต่มันเป็นงานของโปรแกรมของคุณเพื่อหาพวกเขา
un|co|p-|yr|i|gh--t-ab|-|le-||-
เป็นไปไม่ได้ที่จะถูกต้อง อันสุดท้าย-
มี arity เท่ากับ 2 ในขณะที่มีเพียง 1 องค์ประกอบบนสแต็ก