ฉันจะร้อยสายและอะแดปเตอร์ทั้งหมดเข้าด้วยกันได้หรือไม่


30

สมมติว่าวันหนึ่งคุณขุดผ่านสายคอมพิวเตอร์และอะแดปเตอร์ขนาดใหญ่ที่ไม่ได้ใช้ (USB เป็น USB mini, VGA กับ DVI, ฯลฯ ) มีสายพันกันทุกที่ทำให้เกิดความยุ่งเหยิงและคุณสงสัยว่าคุณสามารถทำให้สิ่งต่าง ๆ ง่ายขึ้นหรือไม่โดยการรวมสายทั้งหมดเข้าด้วยกันในสายยาวเส้นเดียวแล้วก็กลิ้งมันขึ้นมา

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

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

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในสตริงหลายบรรทัดโดยที่ทุกบรรทัดแสดงหนึ่งในสายที่คุณเป็นเจ้าของ สายไฟประกอบด้วยเส้นประอย่างน้อยหนึ่งเส้น ( -) พร้อมปลั๊กที่ปลายทั้งสองด้าน ปลั๊กเป็นหนึ่งใน 8 ตัวอักษร()[]{}<>เสมอ

ดังนั้นนี่คือบางส่วนสายที่ถูกต้อง:

>->
(--[
}-{
<-----]
(---)

แต่นี่ไม่ใช่:

-->
(--
)--
[{
---

เมื่อเชื่อมต่อสายเชื่อมต่อเท่านั้นที่สามารถใช้ตัวยึดประเภทเดียวกันได้

ดังนั้นนี่คือการเชื่อมต่อสายไฟที่ถูกต้อง:

...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...

และสิ่งเหล่านี้ไม่ถูกต้อง:

...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...

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


ตัวอย่างเช่นถ้าอินพุตเป็น

[-->
{---]
>----{

ผลลัพธ์อาจเป็น

[-->>----{{---]

ที่ซึ่งสายไฟทั้งหมดอยู่ด้วยกัน

อย่างไรก็ตามหากอินพุตถูก

[-->
{---]

สายไฟไม่สามารถเชื่อมต่อได้ดังนั้นจึงไม่มีเอาท์พุท


โปรดทราบว่าสายสามารถพลิกไปมาได้เท่าที่จำเป็นเพื่อทำการเชื่อมต่อ เช่น[-->และ<--]มีประสิทธิภาพสายเดียวกันเพราะพวกเขาสามารถทำให้การเชื่อมต่อชนิดเดียวกัน เอาต์พุตบางตัวอาจขึ้นอยู่กับการพลิกสายอินพุต


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

(-[
}--]

อาจมีผลผลิต

(-[[--{

ที่สายที่สองพลิกหรือ

}--]]-)

ที่สายแรกพลิก

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


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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

กรณีที่มีการส่งออก:

[-->
{---]
>----{
gives
[-->>----{{---]
or
[---}}----<<--]

(-[
}--]
gives
(-[[--{
or
}--]]-)

(-)
gives
(-)

[--{
gives
[--{
or
}--]

[-]
]-[
gives
[-]]-[
or
]-[[-]

[----->
)------------[
{--<
}---)
could give
[----->>--}}---))------------[
or
>--}}---))------------[[----->
or
}---))------------[[----->>--}
or
{--<<-----]]------------((---{
etc.

>-->
>->
>--->
could give
>-->>->>--->
or
>--->>-->>->
or
>->>-->>--->
or
<--<<---<<-<
etc.

(-]
]->
>-}
}-)
)-[
[-<
<-{
{-(
could give
(-]]->>-}}-))-[[-<<-{{-(
or
{-((-]]->>-}}-))-[[-<<-{
or
<-{{-((-]]->>-}}-))-[[->
etc.

กรณีที่ไม่มีเอาท์พุท:

[-->
{---]

[-]
[-]

(-]
]->
}-)

>->
>-->
]---]

[-------------------]
]-------------------[
[-----------------]
[-----------------]

{--[
]--}

6
กล่องใหญ่ของสายคอมพิวเตอร์และอะแดปเตอร์ ที่ไม่ได้ใช้ซึ่งทำให้ฉันรู้สึกดีขึ้น - ฉันไม่ใช่คนเดียว ที่จริงฉันมีกล่องเหล่านี้หลายกล่อง
Digital Trauma

แต่ถ้าคุณเสียบสายเข้ากับตัวเองล่ะ?
anOKsquirrel

สายไฟรับประกันว่าถูกต้องหรือไม่?
R. Kap

@ R.Kap ใช่แล้ว
งานอดิเรกของ Calvin

คำตอบ:


10

ไม่สามารถอ่านได้ 3924 ไบต์

นี่เป็นครั้งแรกที่ฉันใช้โครงสร้างการโทรคล้ายสแต็กใน Unreadable

(รุ่นแรกของรุ่นนี้มีขนาดมากกว่า 5300 ไบต์เพียงเพื่อให้ทราบว่าฉันเล่นกอล์ฟนี้มากแค่ไหน)

' '' '' ' ' '''' '' '' ' ' '' '' "'' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" "" '' ' ' '' '' '''' ' '' ' ' '' '' '' '' '''' '' ' ' '' '''' '' "' '' "" "" ' ''' "" ' ''' "" ' ''' "" ' '' '' '' "' '' "" '' ''" " '' '' ''""" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" " '' '' ''" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' ''' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" """" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" ' ''' "" ' '' '' '' "' '' "" '' ''""" "" " ' '' '' '' '''" "" " '' ' ' '' '''' '' '' ' ' '''' ' ' ''''" '' " ' '' '' '' ' ' '''' "' '' '' '' "" '' ' ' '' '' ''''" ' '' '' '' "' '' """ " ' '' '' '' ' ' '''' '' '' '''" "" " '' '' ' ' '' '' ''''" '' "" ''""" "" ' '' '' '' ' ' '' ' ' '' '''' '' '' ' ' '''' ' ' '''' '' '' '''' ''' "" "" "" "" " ' '' '' '''" " '' ' ' '' '' '' '''' '' '' ''" " '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' '''""" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" " ''""" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" " '' ''""" '"' "" "" '' '' '' '' ' ' '' '' ''''" '' ' ' '' '' '' '''' '' '' '' '"' """ " '' '' '' '' ' ' '' '' '''' ' '' ' ' '' '' '' '''' '' '' ''"' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" " ''"" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" " '' '' ''" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' ' '"'' '''" "" "" "" "" ' '' '' '''" ' '' "'""" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" " ''""" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" " '"'" ""' '' '' '' '' ' ' '' '' '' '''' '' '' '' ' ' '' '' '' '''' '' '' '' "' ''" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' '''"" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" " '' ''" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" ''"" "" "" ' '' '' '' ' '"'' ''' "" "" "" "" ' '' '' '' ''' "" "" """ " '' "" "" " '' ' ' ''''" ' '' '' '' "' '' '' '' "" '' ' ' ''''" ' '' '' '' "' "" "" "" "" '' ' ' ''''" ' '' '' ''"' '' '' '' "" ''" ' '' '' '' '''"" "" "" " ' '' '' '' ' ' '' ' ' '''' '' '' '''' '' '' '''" "" ' '' '' "' "" " ' '''" "" '' '' ''" ' '' ' ' '' '' '''' ' ' ''''"' '' '' '' "" ''"" "" "" "" " ' '' '' '' '''" "" "" "" " '' ' ' '' '' '' '' '''' '' ''""" "" "" " ' '' ' ' '' '' '' '''' '' '' ' ' '''' ' '"'' '''" "" """ " '' "" "" '"' "" " ' '''" "" "" "" ' ''"' '' "" '' ''"" '' '' '' ' ' '''' " '"' "" " ' '' '''" "" " ' '' '' '''" " '"'" "" ' '' '' "' """ " ''"" '' '' ' ' '' '' '' ' ' '' '' "'' '''' ' ' '''' ' ' ''''" ' '' '' '' "' "" "" '' '' '' ''" ' '' '' '' ' ' '''' ' ' ''''"' '' '' '' "" ''" ' ''"' "" "" "" ' ''' " ' '' ' ' '' '' '' '''' ''' "" "" "" "" "" '' '' ''" """ '"' "" " ' '' '' '''" " ' '''" " '' ' ' '' '' '' '''' '' "" "" "" '' "" ' '' '' "' "" " ' '' '' '' ' ' '' '' '' ' '"'' '''' '' '''" "" "" "" ' '' '' "' "" " ' '''" " ' '''" " ' '''" "" "" "" ' ''"' '' '' '' '' "' '' '' '' ' ' '''' ' ' '''' "' '' '' '' "" ''" ' '' "' '' '' '' '' "" ''" "" "" "" ' '' '' '' ' ' '' '' '' '''' '' '' ''' " ' '' ' ' '' '''' ''"' " "" "" " ' '' '' '' '''" "" ' '' '' '' ' ' '''' "' '' '' ''" " '' '' ''"" ' '' '' '' ' '"'' ''' "" "" "" ' '''" ' '' ' ' '''' '' '' ''' "" "" "" "" ''" ' '' '' '' '' ' ' '' '' ' ' '' '' '''' ' '"'' '''' '' '' '' "' "" "" "" " ' '''" " '' ' ' '' '' '''' '' '' ''" " ''" ' '' '' '' '''"" "" "" " ' '' '' '' '''" "" ' '' '' '' ''' "" "" ''"" '' ' ' '' '' '''' "" ' '' '' '' ''' "" "" "" ' ''' " ' '' ' ' '' '' '''' '' '' '''" " ''" ' '' '' '' "' '' "" ''" ' '' '' '' '' "' '' '' '' ' ' ''''" '' "" ''"" "" ' '' '' ''' " ' '' ' ' '''' '' '' '''" " '' ' ' '' '' '''' '' ''" " '' ' ' '' '' '''' '' '' '' ''"" "" "" "" ' '' '' '' ''' "" "" """ " '' " ' '''" " ' '''" " ' '''" "" "" "" ' '' ' ' '' '' '' '''' '' '' '' "'"" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' "' '' "" ''" " '' '' ''" "" ' '' '' "' "" "" '' '' '' ' ' '' '' ''''" '' ' ' '' '' '' '''' '' '' "" '"' "" " ' '' '' '''" " ' '''" " ' '''" "" "" "" ' ''"' '' '' ''' '' '' '' '' ' ' '' '' '' ' ' '''' ' ' '''' '' '' '''' ''' "" ' ''' "" "" " ' '''" " ' '''" " ' '''" "" "" "" ' '' ' ' '' '' '' '''' '' '' ''' "" "' "" "" "" "" " '' ' ' '' '' '''' ' ' '''' ' '' ' ' '' '' '' '''' ''"'""" "" "" "" '' '' ''"" '' ' ' '' '' ' ' '' '' '' '''' '' '' '''' '' '' " "" " ' '''" "" "" "" ' '' ' ' '' '''' '' "' "" '' '' ''" ' '' '' '' "' ''" "" "" ' '' ' ' '' '' ' ' '''' '' '' ' ' '''' '' '' '''' '' '' ''' """' '' '' '' ''' "" "" "" " ' '''" "" "" "" ' '' '' '' "' '' """ " '' '' ''" ' ''' "" ' ''' " ' ''"' "" '' '' '' ' ' ''''" ' '' '' ''"' '' '' '' """ "" ''"" '' '' '' ' ' '''' ' ' ''''" '' """ ' '' '' '' ' ' ''''"' '' '' '' """ "" "" "" ' '' "' ''"" '' '' '' ' ' '''' ' ' ''''" '' """ ' '' '' '' ' ' ''''"' '' '' '' """ "" "" "" ' '' "' ''"

คำอธิบาย

พิจารณาตัวอย่างอินพุตนี้:

>--{
[---}

ตลอดการดำเนินการส่วนใหญ่เทปจะถูกจัดวางดังนี้:

  • เซลล์ 0 ถึง 5 เป็นตำแหน่งสำหรับตัวแปรต่าง ๆ

  • Cell 6 เป็นต้นไปมีข้อมูลทั้งหมดเกี่ยวกับชุดสายเคเบิลในกล่องของคุณ:

    ตัวอย่างรูปแบบเทป

  • เซลล์ที่เหลืออยู่หลังจาก“ zero terminator” มีสแต็ก "สแต็กเฟรม" แต่ละเซลล์เป็นเซลล์เดียวที่ชี้ไปที่เซลล์แรกของสายเคเบิล (เซลล์ "เริ่มปลั๊ก") ในตัวอย่างข้างต้นเมื่อโปรแกรมตัดสินใจว่าจะพบวิธีแก้ไขปัญหาสแต็กจะมี 6 (หมายถึง>--{สายเคเบิลแรก) และ 21 (หมายถึง{---]กระจกของสายเคเบิลที่สอง)

โปรแกรมดำเนินการในสามขั้นตอนหลัก:

  1. อ่านอินพุตทั้งหมดและสร้างโครงสร้างข้างต้นรวมถึงสายเคเบิลที่มิเรอร์ทั้งหมด
  2. ลองชุดค่าผสมทั้งหมด (แต่หยุดถ้าพบวิธีแก้ไข)
  3. หากพบวิธีแก้ปัญหาให้ส่งออกมัน

ขั้นตอนแรก (อ่านอินพุตและสร้างโครงสร้างสายเคเบิล) ใช้เซลล์ # 1 เท่านั้น (ซึ่งฉันจะโทรหาp) และ # 2 (ซึ่งฉันจะโทรหาch) และดำเนินการในขณะที่ลูปดังนี้:

  • ในขณะที่เงื่อนไข: เพิ่มขึ้นp6 อ่านตัวอักษรถัดไป (เริ่มปลั๊ก) ลงในเซลล์*pและตรวจสอบว่ามันไม่ใช่-1(EOF)

  • อ่านตัวละครที่ตามมาเข้ามา*(p+2)และนับเข้า*(p+1)จนกระทั่งเราพบสิ่งอื่นนอกจาก-(ยัติภังค์) ณ จุดนั้น*(p+1)จะมีจำนวนยัติภังค์ (ความยาวสายเคเบิล) และ*(p+2)อักขระที่ไม่ใช่เครื่องหมายขีดคั่นสุดท้าย (ปลั๊กท้าย) (นอกจากนี้เรายังคัดลอกอักขระยัติภังค์ไปยังเซลล์ # 5 เพื่อให้เราสามารถเข้าถึงรหัส ASCII นี้ในภายหลังในขั้นตอนการส่งออก)

  • ในลูปสักครู่ค้นหาปลั๊กมิเรอร์และเก็บไว้ที่*(p+3)จากนั้นเพิ่มขึ้นp2 จนกระทั่ง*pเป็นศูนย์ ลูปมีลักษณะเช่นนี้ใน pseudocode:

    while (ch = *p) {
        *(p+3) = (ch -= 40) ? (ch -= 1) ? (ch -= 19) ? (ch -= 31) ? ch-32 ? *p-2 : *p+2 : *p+2 : *p+2 : *p-1 : *p+1
        p += 2
    }
    
  • การวนซ้ำนี้จะทำซ้ำสองครั้งเสมอ (ปลั๊กเริ่มและปลายปลั๊ก) และเก็บผลลัพธ์ไว้ในเซลล์ที่สี่และหกของสายเคเบิลนี้ ตอนนี้ถ้าคุณให้ความสนใจคุณรู้ว่าเซลล์ที่หกเป็นตำแหน่งที่ถูกต้องสำหรับปลั๊กท้ายแบบมิรเรอร์ แต่ปลั๊กเริ่มต้นแบบมิรเรอร์นั้นอยู่ในเซลล์ที่มีป้ายกำกับว่า "บูลีนระบุว่าสายเคเบิลเดิม" นี่ก็โอเคเพราะเราแค่ต้องการให้เซลล์นี้เป็นค่าที่ไม่เป็นศูนย์

  • เนื่องจากpเพิ่งได้รับการเพิ่มขึ้นทั้งหมด 4 ตอนนี้ก็ชี้ไปที่เซลล์ที่มีข้อความ“ บูลีนระบุว่าสายเคเบิลกำลังใช้งานอยู่” ตั้ง*(p+3)ค่า*(p-1)เป็น สิ่งนี้ทำให้ปลั๊กเริ่มต้นแบบมิเรอร์อยู่ในตำแหน่งที่ถูกต้อง

  • อ่าน (และทิ้ง) อีกหนึ่งตัวละคร (ซึ่งเราคาดว่าจะเป็นบรรทัดใหม่ แต่โปรแกรมไม่ได้ตรวจสอบสิ่งนั้น)

pเริ่มแรกเริ่มที่ 0 แต่เพิ่มขึ้น 6 ภายในเงื่อนไข while ดังนั้นข้อมูลสายเริ่มที่เซลล์ # 6 pจะเพิ่มขึ้น 4 ภายในร่างกายของลูปและทำให้รวม 10 สำหรับแต่ละสายซึ่งเป็นสิ่งที่เราต้องการ

ในระหว่างขั้นตอนที่สองเซลล์ # 0-4 จะถูกครอบครองโดยตัวแปรที่ฉันจะเรียกa, p, q, และm notdone(เซลล์ # 5 ยังคงจดจำรหัส ASCII ของเครื่องหมายขีดคั่น)

เพื่อให้พร้อมสำหรับขั้นตอนที่ 2 เราจำเป็นต้องตั้งค่า*pกลับเป็น 0 (เซลล์ที่มีป้ายกำกับว่า "zero terminator") เพื่อให้สามารถทำหน้าที่เป็นเทอร์มิเนเตอร์สำหรับรายการสายเคเบิล เรายังตั้งค่าq(ซึ่งเป็นตัวชี้สแต็กของเรา) เป็นp+1(เช่นเซลล์หลัง“ zero terminator” นี่คือที่ที่สแต็คเริ่มต้น); *qถึง 1 (รายการแรกบนสแต็คเหตุใด 1 จะปรากฏในภายหลัง) และnotdoneถึง 1 ทั้งหมดนี้ทำในคำสั่งเดียว:

*p = (notdone = *(q = p+1) = 1)-1

ขั้นตอนที่สองยังเป็นวงในขณะที่ notdoneสภาพเป็นเพียง ในแต่ละการวนซ้ำของสิ่งนั้นในขณะที่วนซ้ำสิ่งใดสิ่งหนึ่งในสี่สิ่งต่อไปนี้อาจเกิดขึ้นได้:

  1. เราพบว่าสายเคเบิลทั้งหมดถูกทำเครื่องหมายว่า“ ใช้งาน” ซึ่งหมายความว่าเราได้พบวิธีแก้ปัญหา (ซึ่งแสดงโดยเนื้อหาสแต็กปัจจุบัน)
  2. เราสามารถเลื่อน*qไปยังสายเคเบิลที่มีสิทธิ์อื่นได้ (ซึ่งเราทำเครื่องหมายทันทีว่า“ กำลังใช้งาน” พร้อมกับฝาแฝดคู่ของมัน) จากนั้นจึงทำการคืนค่า (เช่นสร้างสแต็กเฟรมใหม่)
  3. เราไม่สามารถเดินหน้าต่อได้*qเนื่องจากไม่มีสายเคเบิลที่มีสิทธิ์เพิ่มเติมดังนั้นเราจึงต้องย้อนกลับ (ลบสแต็กเฟรมและทำเครื่องหมายสายเคเบิลก่อนหน้าและสายเคเบิลคู่ว่า "ไม่ใช้แล้ว")
  4. เราไม่สามารถล่วงหน้าได้*qเนื่องจากไม่มีสายเคเบิลที่มีสิทธิ์เพิ่มเติมและเราไม่สามารถย้อนกลับได้เนื่องจากเรามาถึงด้านล่างสุดของสแต็ก ซึ่งหมายความว่าไม่มีวิธีแก้ปัญหา

ร่างกายลูปตรวจสอบเงื่อนไขทั้งสี่เหล่านี้ตามลำดับ นี่คือรายละเอียด:

  1. ชุดmและp1 และในขณะที่วงเพิ่มpขึ้น 5 (ดังนั้นการทำซ้ำผ่านสายเคเบิ้ล) และตรวจสอบว่า*(p+4)(“ในการใช้งาน”) เป็นชุด หากไม่ใช่ให้ตั้งค่าmเป็น 0 ที่ส่วนท้ายของลูปนั้นmบอกเราว่าสายเคเบิลทั้งหมดถูกใช้งานหรือไม่ หากเป็นเช่นนั้นให้ตั้งค่าnotdoneเป็น 0 เพื่อยกเลิกการวนซ้ำหลัก มิฉะนั้นดำเนินการต่อในขั้นตอนที่ 2 ด้านล่าง

  2. ตั้งค่าpเป็น*q(สายเคเบิลที่ด้านบนของสแต็ค) และในขณะที่คล้ายกับห่วงด้านบนเพิ่มขึ้นp5 เพื่อวนซ้ำผ่านสายเคเบิล เริ่มต้นที่*qทำให้มั่นใจได้ว่าเราจะพิจารณาเฉพาะสิ่งที่เราไม่ได้พิจารณามาก่อน อย่างไรก็ตามจำไว้ว่าค่าเริ่มต้นสำหรับสแต็กสแต็กใหม่คือ 1 ดังนั้นสายแรกที่ดูคือหนึ่งในเซลล์ 6 ซึ่งแน่นอนว่าเป็นสายเคเบิลแรก

    สำหรับสายเคเบิลแต่ละอันเราต้องตรวจสอบ*(p+4)เพื่อให้แน่ใจว่ายังไม่ได้ใช้งานและนั่นก็ *(q-1)เป็นศูนย์ (หมายความว่าเราอยู่ที่ด้านล่างของสแต็กดังนั้นจึงไม่มีข้อ จำกัด ในการเสียบปลั๊กเริ่มต้น) หรือ *p (เริ่มต้นของสายเคเบิล) ปลั๊ก) เท่ากับ*(*(q-1)+2)(ปลั๊กท้ายของสายเคเบิลด้านล่างบนสแต็ก) เราตรวจสอบเพื่อความเท่าเทียมกันโดยการตั้งค่าaไป*(*(q-1)+2)และmจะ*p+1แล้ว decrementing ทั้งในขณะที่ห่วง +1เป็นเพราะmเป็น decremented ภายในขณะที่สภาพจึงเป็น decremented aครั้งเดียวมากกว่า หากaเป็นศูนย์ในตอนท้ายของเรื่องนี้ทั้งสองปลั๊กจะเท่ากัน

    ดังนั้นหาก*(q-1)เป็นศูนย์หรือการเปรียบเทียบความเท่าเทียมกันสำเร็จเคเบิลก็มีสิทธิ์ ตั้งค่า*qเป็นpเพื่อเปลี่ยนสายเคเบิลที่ด้านบนของสแต็กด้วยอันใหม่ ตั้งค่าmเดียวกันเพื่อระบุว่าเราพบสายเคเบิลที่ตรงกัน pและลดลงแล้ว การลดลงนั้นเป็นเคล็ดลับเล็ก ๆ น้อย ๆ ที่ทำให้เกิดห่วง while (วนซ้ำผ่านสายเคเบิล) เพื่อยุติก่อน มันจะเพิ่มขึ้นpอีก 5 ครั้งจึงนำไปยังเซลล์ที่มีธง“ ใช้งาน” ของสายเคเบิลนี้และเรารู้ว่านั่นเป็นศูนย์เพราะเราเพิ่งตรวจสอบว่า ในที่สุดหลังจากการวนซ้ำของสายเคเบิลในขณะที่วนรอบเราจะตรวจสอบว่าmไม่ใช่ศูนย์หรือไม่ หากเป็นเช่นนั้นเราพบสายเคเบิลที่ตรงกันและpชี้ไปที่ธง“ ใช้งาน” สำหรับสายเคเบิลที่ตรงกัน ตั้งค่าเป็น 1 เพื่อทำเครื่องหมายตามที่ใช้งานอยู่ นอกจากนี้ยังตั้ง*(*(p-1) ? p+5 : p-5)ถึง 1 เพื่อทำเครื่องหมายฝาแฝดตามที่ใช้งานอยู่ สุดท้ายเพิ่มqและตั้งค่าใหม่*qเป็น 1 เพื่อสร้างสแต็กเฟรมใหม่

  3. หากหลังจากการวนซ้ำของสายเคเบิลในขณะที่วนเราพบว่าmเป็นศูนย์ไม่มีสายที่ตรงกันอีกต่อไปดังนั้นเราจึงต้องย้อนกลับ ลดqลงเพื่อเลื่อนสแต็กและตรวจสอบว่ายังคงชี้ไปที่สายเคเบิล (ค่าที่ไม่เป็นศูนย์) ถ้าเป็นเช่นนั้นทำเครื่องหมายว่าสายเคเบิลและฝาแฝดของมันเป็นไม่ได้ใช้งาน (เราเก็บค่าของ*qในpเพื่อให้นิพจน์นี้สั้นลงในโค้ด)

  4. หากหลังจากลดลงqเราจะพบว่ามันชี้ไปที่ค่าศูนย์จากนั้นนั่นคือ“ zero terminator” ซึ่งหมายความว่าเราได้ผ่านสแต็ก เราสรุปได้ว่าไม่มีวิธีแก้ปัญหา เราตั้งค่าnotdoneเป็น 0 เพื่อยกเลิกการวนรอบหลัก

ขั้นตอนที่สามคือขั้นตอนการส่งออก มีสองสิ่งที่สามารถเกิดขึ้นได้:

  • ลูปหลักพบวิธีแก้ปัญหาที่เราต้องการเพื่อส่งออกหรือ
  • การวนรอบหลักสรุปว่าไม่มีวิธีแก้ปัญหาและเราไม่แสดงผลอะไร

สะดวกถ้าไม่มีวิธีการแก้ปัญหาpเป็นศูนย์เพราะเราตั้งค่าเป็นค่า*qก่อนการตรวจสอบว่าเป็นศูนย์ และถ้ามีเป็นวิธีการแก้ปัญหาpคือการชี้ไปที่“ศูนย์ Terminator” เพราะมันก็ซ้ำผ่านสายเคเบิลดังนั้นตอนนี้เราสามารถใช้pเพื่อย้ำผ่านสแต็ค ดังนั้นเพียงวนซ้ำสแต็กเอาท์พุทสำหรับแต่ละสายปลั๊กเริ่มต้น ( *(*p)), ยัติภังค์ (โดยการลดลง*(*p+1)ในขณะที่ห่วงและใช้รหัส ASCII ยัติภังค์ที่เก็บไว้ในเซลล์ # 5) และปลั๊กท้าย ( *(*p+2)) ไม่เป็นไรหรอกว่านี่จะเป็นการทำลายข้อมูลความยาวสายเคเบิล เราไม่ต้องการสิ่งนั้นอีกแล้ว


3

CJam, 67

qN%e!{_,2,m*\f{.{_{"()[]{}<>--"_@#1^=}%W%?}_2ew{~\W=#}%0-{;}&}~}%1<

ลองออนไลน์

หมายเหตุ: ลิงก์กำลังใช้รหัสล่าสุดจากที่เก็บ (พุช แต่ยังไม่ออก) เนื่องจากมีการแก้ไขข้อบกพร่อง

คำอธิบาย:

โปรแกรมเพียงแค่พยายามเรียงสับเปลี่ยนทั้งหมดและทิศทางทั้งหมดของสาย

qN%             read the input and split into lines
e!              generate all permutations
{…}%            map each permutation of cords
  _,            get the number of cords (n)
  2,m*          generate all patterns of n bits (cartesian power of [0 1])
  \f{…}         for each bit pattern and the cord permutation
    .{…}        apply the block to each bit and cord (flipping cords for bit 0)
      _         duplicate the cord
      {…}%      map each character of the cord
        "…"_    push the string of all the plugs (and 2 dashes) and duplicate it
        @#      get the index of the character in the string
        1^      XOR with 1
        =       get the character at this new index (plugs get toggled)
      W%        reverse the cord
                 the stack now has the bit, the original cord and the flipped cord
      ?         if the bit is 1, use the original cord, else use the flipped one
    _           duplicate the array of cords
    2ew         get all pairs of adjacent cords
    {…}%        map each pair of cords
      ~\        dump the 2 cords on the stack and swap them
      W=        get the right plug of the first cord
      #         find its position in the second cord (if 0, we have a match)
    0-          remove all the zeros
    {…}&        if the array is not empty (i.e. we have a mismatch)
      ;         pop the array of cords
  ~             dump all the results for this permutation on the stack
                 (to avoid nested arrays)
1<              get the first result (if any) from the array of all results

บางทีคำอธิบายว่ามันทำงานอย่างไร
Timwi

@ Timwi ตกลงฉันยังเล่นกอล์ฟเพิ่มอีกนิด
aditsu

การแก้ปัญหานี้ไม่ถูกต้องที่จะไม่ผลิตออกใด ๆ (-] ]-> >-} }-) )-[ [-< <-{ {-(สำหรับการป้อนข้อมูล
R. Kap

@ R.Kap ช่วยแก้ปัญหาการป้อนข้อมูลนั้น แต่ล่ามออนไลน์นั้นมีการหมดเวลา (และค่อนข้างเงียบเกี่ยวกับมัน) คุณสามารถลองที่นี่แทน (และให้เวลาหลายนาที) หรือใช้ล่าม java (เร็วที่สุด)
aditsu

อันที่จริงล่ามที่ฉันลิงค์ไว้ด้านบนอาจใช้เวลานานในการแก้ไขอินพุตนั้น Java ล่ามแก้มันในเวลาน้อยกว่า 1.5 นาทีในคอมพิวเตอร์ของฉัน
aditsu

2

JavaScript (ES6), 206

ฟังก์ชั่นวนซ้ำ

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

อ่านเพิ่มเติม

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>
  l[0]?
  l.some((b,i)=>
     r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])]
     .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)
     &&(l=[...l],l[i]=r,f(l))
    )?r:''
 :a

ทดสอบ

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

console.log=(...x)=>O.textContent+=x+'\n'

;[
 //OK
 ['[-->','{---]','>----{']
,['(-[','}--]']
,['(-)']
,['[--{']
,['[-]',']-[']
,['[----->',')------------[','{--<','}---)']
,['>-->','>->','>--->']
,['(-]',']->','>-}','}-)',')-[','[-<','<-{','{-(']
 //KO
,['[-->','{---]']
,['[-]','[-]']
,['(-]',']->','}-)']
,['>->','>-->',']---]']
,['[-------]',']-------[','[-------]','[---------]'] // shortened a little,
,['{--[',']--}']
].forEach(t=>{
  console.log(t+' : "'+f(t)+'"\n')
})
<pre id=O></pre>


1

Javascript, 800 ไบต์

ไกลจากโซลูชันที่ปรับให้เหมาะสมที่สุด แต่นี่คือการแฮ็คอย่างรวดเร็วร่วมกันใน javascript (ไม่มี ecma5 แฟนซีหรืออะไรเลยเพราะฉันไม่รู้)

function a(r){function t(r,t){var n=r.slice();return n.splice(t,1),n}function n(r){var t,n={"[":"]","]":"[",">":"<","<":">","(":")",")":"(","{":"}","}":"{"},e=r.split("").reverse();for(t=0;t<e.length;t++)n.hasOwnProperty(e[t])&&(e[t]=n[e[t]]);return e.join("")}function e(r,t){return r.unshift(t),r}var h,u,f=[];if(1==r.length)return r[0];for(h=0;h<r.length;h++){var l=r[h],i=t(r,h),c=l.charAt(0),g=l.charAt(l.length-1);for(u=0;u<i.length;u++){var o=i[u],s=o.charAt(0),p=o.charAt(o.length-1);c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o)),o=n(o),s=o.charAt(0),p=o.charAt(o.length-1),c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o))}}if(f.length<1)return!1;for(h=0;h<f.length;h++){if(1===f[h].length)return f[h][0];f[h]=a(f[h])}for(h=0;h<f.length;h++)if(f[h]!==!1)return f[h];return!1}

Ungolfed นี่คือ ... ฉันแน่ใจว่าอย่างน้อย 2 สำหรับลูปนั้นไม่จำเป็นที่นี่และการตรวจสอบอินพุตอินพุทองค์ประกอบเดียวที่ด้านบนและการจับคู่องค์ประกอบเดี่ยวที่ด้านล่างนั้นมั่นคง ... แต่ดูเหมือนว่าจะทำงานและ ประมวลผลอินพุตทดสอบ

function a(inputs)
{
	var i, ii, matches = [];
	if (inputs.length == 1) {
		return inputs[0];
	}
	// For each of the elements in inputs (e1)
	for (i = 0; i < inputs.length; i++) {
		var e1 = inputs[i],
			others = except(inputs,i),
			e1s = e1.charAt(0),
			e1e = e1.charAt(e1.length-1);
		// Compare to each of the other elements in inputs (e2)
		for (ii = 0; ii < others.length; ii++) {
			// get the start and end of the elements to compare (e1s,e1e,e2s,e2e)
			var e2 = others[ii],
				e2s = e2.charAt(0),
				e2e = e2.charAt(e2.length-1);
			// if any of them match up (e1s == e2e || e1s == e2s || e1e == e2s || e1e = e2e)
			// Make a new array of inputs containing the joined elements (as a single element) and all other elements which might join with them
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
			e2 = flip(e2);
			e2s = e2.charAt(0);
			e2e = e2.charAt(e2.length-1);
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
		}
	}

	if (matches.length < 1) {
		return false;
	}

	for (i = 0; i < matches.length; i++) {
		if (matches[i].length  === 1) {
			return matches[i][0];
		} else {
			matches[i] = a(matches[i]);
		}
	};

	for (i = 0; i < matches.length; i++) {
		if (matches[i] !== false) {
			return matches[i];
		}
	};

	return false;

	function except(list,idx)
	{
		var newList = list.slice();
		newList.splice(idx,1);
		return newList;
	}
	function flip(s) {
		var replacements = {
			'[':']',
			']':'[',
			'>':'<',
			'<':'>',
			'(':')',
			')':'(',
			'{':'}',
			'}':'{'
		}, i, a = s.split('').reverse();
		for (i = 0; i < a.length; i++) {
			if (replacements.hasOwnProperty(a[i])) {
				a[i] = replacements[a[i]];
			}
		}

		return a.join('');
	}
	function addTo(arr,newEl)
	{
		arr.unshift(newEl);
		return arr;
	}
}


1
คุณสามารถเปลี่ยนชื่อฟังก์ชั่นเพื่อบันทึกได้ไม่กี่ไบต์ stackoverflow.com/questions/6156319/…
noɥʇʎԀʎzɐɹƆ

1
หลีกเลี่ยง. charAt ใน JavaScript ทุกเวอร์ชัน s.charAt(x)===s[x]
edc65

1

Python 3, 217 ไบต์

from itertools import*
a='()[]{}<>'
all(any(c[-1]!=d[0]for c,d in zip(q,q[1:]))or print(''.join(q))for p in permutations(open(0))for q in product(*[(c[:-1],a[a.find(c[-2])^1]+c[-3:0:-1]+a[a.find(c[0])^1])for c in p]))

(การสาธิตเกี่ยวกับ Ideone )


สิ่งนี้นำเข้าอย่างไร
R. Kap

@ R.Kap บน stdin หนึ่งสายต่อบรรทัด
Anders Kaseorg

อย่างน้อยก็ตอนที่ฉันวิ่ง
R. Kap

นอกจากนี้มันสามารถหาคำตอบที่ถูกต้องได้เร็วแค่ไหน(-] ]-> >-} }-) )-[ [-< <-{ {-(?
R. Kap

@ R.Kap ดูตัวอย่างของ Ideone เพื่อรับอินพุตและสร้างเอาต์พุต (อาจใช้งานไม่ได้กับ Windows หากเป็นสิ่งที่คุณพยายามจะทำ) มันจะทำงานทันที ~ ในกรณีทดสอบของคุณ มีหลายกรณีที่ต้องใช้เวลาชี้แจงแทน
Anders Kaseorg

0

Lua 477 ไบต์

function r(s)return s:reverse():gsub("[()%[%]{}<>]",{["("]=")",[")"]="(",["["]="]",["]"]="[",["{"]="}",["}"]="{",["<"]=">",[">"]="<"})end
function a(c,b)for i, v in next,b do
m=c:sub(-1,-1)n=v:sub(1,1)o=r(c):sub(-1,-1)p=r(v):sub(1,1)l=table.remove(b,i)if m==n then
return a(c..v,b)elseif o==n then
return a(r(c)..v,b)elseif m==p then
return a(c..r(v),b)elseif o==p then
return a(r(c)..r(v),b)end
table.insert(b,i,l)end
return#b>0 and""or c
end
print(a(table.remove(arg,1),arg))

ยอมรับสายเป็นอาร์กิวเมนต์บรรทัดคำสั่ง


0

Python 3.5, 448 432 427 424 286 311 ไบต์:

( +25 เนื่องจากมีข้อผิดพลาดที่เอาต์พุตอาจยาวกว่าที่ควรเป็นสำหรับอินพุตบางตัว )

def g3(z):
 B=z.split();M='i[::-1].translate({41:40,40:41,125:123,123:125,62:60,60:62,93:91,91:93})';f=B+[eval(M)for i in B if eval(M)not in B];d=[f.pop(0)]
 for h in d:
  try:[d.append([f.pop(f.index(c))for c in f if h[-1]==c[0]][0])if len(d)<len(B)else E]
  except:break
 return''.join(d)if len(d)>=len(B)else''

ทำงานได้อย่างสมบูรณ์แบบ! ยกเว้นอินพุตที่มี 7 ค่าขึ้นไป มันใช้เวลานานสำหรับคนส่วนใหญ่น่าจะเป็นเพราะมันต้องผ่านการเรียงสับเปลี่ยนทั้งหมดของอินพุทรวมทั้งอินพุทกลับด้าน ฉันจะพยายามแก้ไขปัญหานี้ถ้าและเมื่อฉันทำได้ แต่สำหรับตอนนี้ดูเหมือนว่าจะดีพอ ตอนนี้ดีแล้ว! ถ้าเพียง แต่ฉันก็สามารถใช้try-exceptบล็อกในรายการเข้าใจมันอาจจะเป็นเพียงเล็กน้อยสั้นและมองมากดีกว่า อย่างไรก็ตามตอนนี้มันใช้งานได้กับทุกกรณีทดสอบและที่ดีที่สุดคือไม่มีการนำเข้า! :)

ลองออนไลน์! (Ideone) (284 ไบต์ที่นี่)

(เคล็ดลับ: หากต้องการลองเพียงเลือก "ทางแยก" จากนั้นป้อนตัวเลือกของคุณคั่นด้วยช่องว่างแล้วเลือก "เรียกใช้")

คำอธิบาย

โดยทั่วไปสิ่งที่เกิดขึ้นคือ ...

  1. รายการBถูกสร้างขึ้นจากอินพุตโดยการแยกที่ช่องว่างลงใน "cords" ของคอมโพเนนต์
  2. Mคือสตริงฉันสร้างขึ้นซึ่งเมื่อประเมินกลับรายการตั้งอยู่บนพื้นฐานBที่มีสายทั้งหมด แต่เวลานี้ย้อนหลัง
  3. ในที่สุดรายการที่สร้างขึ้นMจะถูกต่อกับBตัวเองเพื่อสร้างรายการfโดยมีทิศทางที่เป็นไปได้ทั้งหมดของ "สาย"
  4. รายการอื่น ๆdที่ถูกสร้างขึ้นซึ่งจะเริ่มต้นได้ด้วยค่าแรก (คุ้มค่าf[0]) fของ
  5. สุดท้ายค่าทั้งหมดที่อยู่ในdกำลังซ้ำผ่านและแต่ละค่าของตัวอักษรตัวสุดท้ายถูกเมื่อเทียบกับตัวอักษรตัวแรกขององค์ประกอบในแต่ละfและเมื่อการแข่งขันพบตัวละครที่โผล่ (หรือออก) fและกลับจากรายการ นี้เกิดขึ้นจนกว่าIndexErrorจะเพิ่มขึ้นหรือความยาวของรายการdเกินBและNameErrorจะเพิ่มขึ้นหลังจากการเรียกร้องให้Eทั้งสองที่ได้รับการจัดการแล้วรายการdเนื้อหา 's จะเข้าร่วมเป็นสตริงและกลับตราบเท่าที่ความยาวของรายการdมากขึ้น Bกว่าหรือเท่ากับความยาวของรายการ มิฉะนั้นสตริงว่างจะถูกส่งกลับ ( '') เนื่องจากdไม่มีความยาวเท่ากับที่Bแสดงว่า "สาย" ทั้งหมดในรายการB ไม่สามารถรวมเป็น "สาย" ที่ยาวหนึ่งเส้นได้

@KennyLau คุณเปลี่ยนอะไร จากสิ่งที่ฉันเห็นคุณเพิ่งเพิ่มเข้าไป<!-- language: lang-python -->สิ่งนั้นมีการเปลี่ยนแปลงอย่างไร
R. Kap

ที่สามารถเปิดใช้งานการเน้นไวยากรณ์สำหรับรหัสของคุณ
แม่ชีที่รั่ว

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