งูยืดมีลักษณะบางอย่างเช่นนี้
<||=|||:)~
แต่ละลำดับของแถบแนวตั้ง ( |
) ในงูที่ยืดออกซึ่งรู้จักกันในชื่อส่วนยืดนั้นสามารถขยายความกว้างเป็นสองเท่าแยกจากกันและถูกวาดด้วยเครื่องหมายสแลช ( /
, \
) เมื่อขยายออก
งูข้างต้นโดยเฉพาะมีสองส่วนที่ยืดได้ทำให้มีสี่ท่าที่เป็นไปได้:
<||=|||:)~
</\/\=|||:)~
<||=/\/\/\:)~
</\/\=/\/\/\:)~
รูปแบบทั่วไปของงูถ่างในท่ายืดน้อยที่สุดถูกกำหนดโดยregex นี้ :
<(\|+=)*\|+:\)~
ซึ่งสามารถระบุไว้ในคำว่า:
<
ตามด้วยหมายเลขของลำดับใด ๆ|
's เข้าร่วมกับอาการตามมาด้วย=
:)~
ดังนั้น<|:)~
และ<||:)~
และ<|=|:)~
และ<|=|=||=|||||=||:)~
เป็นงูยืด แต่<=:)~
และ<=|:)~
และ<||=:)~
และ<|==||:)~
ไม่ใช่
~(:|||=||>
งูยืดยังสามารถเผชิญซ้ายแทนขวาเช่น แบบฟอร์มเหมือนกันเพียงมิร์เรอร์
ท้าทาย
เขียนโปรแกรมที่ใช้ในสตริงบรรทัดเดียวของงูยืดสองตัวที่หันเข้าหากันโดยมีช่องว่างจำนวนหนึ่งอยู่ระหว่างนั้น งูทั้งสองจะอยู่ในท่ายืดน้อยที่สุด (แถบแนวตั้งทั้งหมดไม่มีสแลช) สตริงจะเริ่มต้นด้วยหางของงูที่หันไปทางขวาและจบลงด้วยหางของงูที่หันไปทางซ้าย
ตัวอย่างเช่นต่อไปนี้เป็นข้อมูลป้อนเข้าที่มีห้าช่องว่างระหว่างงู:
<|=||:)~.....~(:||||>
ฉันกำลังใช้เครื่องหมายจุด ( .
) แทนอักขระช่องว่างจริงเพื่อความชัดเจน
ช่องว่างระหว่างงูยังเป็นอินพุตที่ถูกต้อง:
<|=||:)~~(:||||>
เราพูดว่างูกำลังจูบกันเมื่อลิ้นของพวกมันสัมผัสเช่นนี้
โปรแกรมของคุณต้องการที่จะขยายการรวมกันของส่วนขยายของทั้งสองของงูเช่นงูบางอย่างที่มีจำนวนน้อยที่สุดของช่องว่างระหว่างพวกเขาไปได้ (โดยไม่ทับซ้อนกัน) เช่นดังกล่าวว่างูมีความใกล้เคียงกับการจูบที่เป็นไปได้
หางทั้งสองของงูนั้นได้รับการแก้ไข แต่หัวและลำตัวของมันสามารถเคลื่อนที่ได้ - เหมาะสำหรับงูที่หันไปทางขวา, ซ้ายสำหรับงูที่หันไปทางซ้าย - ตามสิ่งที่ยืดออกไป
ผลลัพธ์ของโปรแกรมของคุณคือสตริงบรรทัดเดียว (รวมถึงบรรทัดใหม่ท้ายที่เป็นตัวเลือก) ที่แสดงงูใกล้เคียงกับการจูบมากที่สุดเท่าที่จะเป็นไปได้ด้วยการสลับทับที่ถูกวาดแทนที่แถบแนวตั้ง
ตัวอย่างเช่นผลลัพธ์สำหรับ<|=||:)~.....~(:||||>
(จากด้านบน) จะเป็น:
</\=||:)~~(:/\/\/\/\>
นี่เป็นทางออกเดียวที่นี่เพราะเมื่อรวมกับส่วนที่ยืดออกอื่น ๆ แล้วงูจะทับซ้อนกันหรืออยู่ห่างจากการจูบมากขึ้น
หากมีหลายวิธีที่เป็นไปได้ผลลัพธ์อาจเป็นหนึ่งในนั้น
ตัวอย่างเช่นถ้าอินพุตเป็น
<|=||:)~.....~(:|||=|>
ผลลัพธ์อาจเป็น
<|=/\/\:)~~(:/\/\/\=|>
หรือ
</\=||:)~~(:/\/\/\=/\>
โปรดจำไว้ว่ามันเป็นไปไม่ได้เสมอที่จะทำให้งูจูบ แต่คุณยังคงต้องเข้าใกล้พวกเขาให้มากที่สุด
ตัวอย่างเช่นถ้าอินพุตเป็น
<||=||||:)~...~(:||>
ผลลัพธ์อาจเป็น
</\/\=||||:)~.~(:||>
หรือ
<||=||||:)~.~(:/\/\>
หากงูกำลังจูบกันอยู่เอาต์พุตจะเหมือนกับอินพุต เช่น
<|=||:)~~(:||||>
โดยทั่วไปเอาต์พุตจะเหมือนกับอินพุตหากส่วนขยายของส่วนที่ยืดใด ๆ จะทำให้งูทับซ้อนกัน เช่น
<|||=|||:)~..~(:||||=|||||=||||||>
หมายเหตุ
- รับอินพุตจาก stdin หรือบรรทัดคำสั่งตามปกติหรือเขียนฟังก์ชันที่รับสตริง พิมพ์หรือส่งคืนผลลัพธ์
- คุณสามารถใช้
.
เครื่องหมายมหัพภาค ( ) ในอินพุตและเอาต์พุตแทนช่องว่าง () ได้หากต้องการ
- เป็นสิ่งสำคัญที่จะทับสลับกันตามลำดับของแถบแนวตั้งที่ถูกแทนที่ คำสั่งของพวกเขาในงูใหญ่หรือว่าการเฉือนไปข้างหน้าหรือข้างหลังมาก่อนไม่สำคัญ
- ส่วนที่ยืดไม่สามารถขยายออกไปได้ครึ่งทาง - เป็นสองเท่าหรือไม่มีส่วนขยายเลย
เกณฑ์การให้คะแนน
นี่คือรหัสกอล์ฟ การส่งที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นคำตอบก่อนหน้า
>
ไม่<
เช่นนั้นจะไม่เหมือนกัน, สำหรับ(
และ)
) แต่เขายังกล่าวว่า "มันสำคัญมากที่เครื่องหมายทับจะสลับกันตามลำดับของแถบแนวตั้งที่แทนที่ งูที่มีขนาดใหญ่หรือว่าไปข้างหน้าหรือข้างหลังเฉือนมาก่อนไม่สำคัญ "