ใช้กองที่สาม
หากคุณอ่านชื่อเรื่องคุณอาจสับสนเล็กน้อย แน่นอนมีเพียงสองกองใน Brain-Flak? อย่างไรก็ตามฉันรับรองว่ามันมีอยู่จริงและเป็นหนึ่งในเครื่องมือที่ทรงพลังที่สุดหากไม่ใช่เครื่องมือที่ทรงพลังที่สุดในการเขียนและเล่นเกม Brain-Flak
"กองที่สาม" คืออะไร?
โปรแกรม Brain-Flak ทุกโปรแกรมใช้กองซ้อนที่สามในทางเดียว แต่ส่วนใหญ่ของการใช้งานอยู่เบื้องหลังและมันมักจะมีประโยชน์ในการละเลยข้อเท็จจริงที่มีอยู่ แต่ละวงเล็บในโปรแกรมสามารถเพิ่มหรือลบหนึ่งรายการจากสแต็ก เหล็กดัดที่เปิดสามอัน([<
ทั้งหมดจะเพิ่มไอเท็มลงในสแต็กในขณะที่เหล็กทั้งสามคอนจูเกต)]>
ทั้งหมดจะลบไอเท็มออกจากสแต็ก มูลค่าของรายการในสแต็กคือมูลค่าของขอบเขตปัจจุบันของโปรแกรมและการใช้ nilads จะแก้ไขค่านี้ในบางวิธี วงเล็บปิด)
มีฟังก์ชั่นพิเศษในการย้ายองค์ประกอบจากกองที่สามไปยังกองซ้อนปัจจุบัน การผลักดัน
หวังว่านี่จะชัดเจนสำหรับคุณ กองที่สามคือกองซ้อนที่จำค่าส่งคืนของรหัสที่ถูกดำเนินการแล้ว ลองมาดูตัวอย่างของโปรแกรมง่ายๆที่คอยติดตามสแต็คธรรมดาสองตัวและสแต็คที่สาม
ตัวอย่าง
เราจะเดินผ่านโปรแกรมต่อไปนี้ โปรแกรมนี้พุช-3, 1, -2
ไปยังสแต็ก
(([()()()])(()))
เราเริ่มต้นด้วยวงเล็บปีกกาเปิดสามอันซึ่งทั้งหมดผลักศูนย์ให้เป็นกองที่สาม
สแต็คของเราตอนนี้มีลักษณะเช่นนี้กองที่สามคือกองที่อยู่ทางขวาและกองที่ใช้งานอยู่นั้น^
อยู่ใต้:
0
0
0 0 0
^
(([()()()])(()))
^
ตอนนี้เรามีสาม()
ศูนย์ สิ่งเหล่านี้ไม่ได้ทำอะไรกับสองสแต็คปกติ แต่พวกมันเพิ่มแต่ละอย่างที่ด้านบนของ Third Stack ทำให้สแต็คของเรามีลักษณะดังนี้:
3
0
0 0 0
^
(([()()()])(()))
^
ตอนนี้เราพบ]
ตามที่ระบุไว้ก่อนที่จะปิดวงเล็บปีกกาลบรายการจากกองที่สาม แต่]
มีฟังก์ชั่นการลบองค์ประกอบมันลบออกจากด้านบนของกอง ดังนั้นสแต็คใหม่ของเราจะมีลักษณะดังนี้:
-3
0 0 0
^
(([()()()])(()))
^
เรื่องนี้ทำให้รู้สึก; [...]
การปฏิเสธจึง]
ควรลบลง
)
ตอนนี้เราจะต้องดำเนินการ ในขณะที่คุณจำได้ว่า)
เป็นสถานที่ในโปรแกรมที่สิ่งของถูกผลักไปยังสแต็กดังนั้นเราจะย้ายด้านบนของกองที่สามไปยังกองซ้อนปัจจุบันนอกจากนี้เราจะเพิ่ม-3
องค์ประกอบถัดไปในกองที่สาม
-3 0 -3
^
(([()()()])(()))
^
อีกครั้งที่เราพบกับหนึ่งในสามวงเล็บปีกเปิดของเราดังนั้นเราจะเพิ่มองค์ประกอบอื่นในกองที่สามของเรา
0
-3 0 -3
^
(([()()()])(()))
^
ตามที่เราได้กล่าวไปแล้วก่อนหน้านี้ว่า()
จะเพิ่มจำนวนกองซ้อนที่สามขึ้นหนึ่งอันดับ
1
-3 0 -3
^
(([()()()])(()))
^
และ)
จะย้ายด้านบนของกองที่สามไปยังกองที่ใช้งานอยู่และเพิ่มลงไป
1
-3 0 -2
^
(([()()()])(()))
^
ครั้งสุดท้ายที่)
ย้ายกองที่สามไปยังกองที่ใช้งานอยู่และเนื่องจากไม่มีองค์ประกอบที่เหลืออยู่ในกองที่สามเพื่อให้เพิ่มไม่ทำอะไรเลย
-2
1
-3 0
^
(([()()()])(()))
^
โปรแกรมสิ้นสุดลงดังนั้นเราจึงยกเลิกและส่งออก
ตัวอย่างนี้มีจุดประสงค์เพื่อให้คุณรู้สึกว่ากองที่สามคืออะไรและทำอะไร มันไม่ได้รวมการดำเนินการทั้งหมด แต่หวังว่าคุณจะสามารถทราบได้ว่าการดำเนินการแต่ละอย่างของตัวเองนั้นเป็นอย่างไร หากคุณยังมีปัญหาอยู่ฉันได้ใส่ "cheatsheet" ไว้ที่ด้านล่างของคำตอบนี้เพื่อช่วยคุณ
ตกลงอะไร
ตกลงตอนนี้คุณเข้าใจ Stack ที่สาม แต่ "แล้วอะไรล่ะ" คุณใช้มันไปแล้วแม้ว่าคุณจะไม่ได้เรียกมันว่า "กองที่สาม" การคิดในแง่ของกองที่สามช่วยให้คุณเล่นกอล์ฟได้อย่างไร?
ให้ดูที่ปัญหา คุณต้องการที่จะใช้สามเหลี่ยมของจำนวน นี่คือผลรวมของตัวเลขทั้งหมดน้อยกว่า n
วิธีการหนึ่งอาจเป็นการสร้างแอคคูมูเลเตอร์บน offstack และเพิ่มเข้าไปเมื่อคุณนับถอยหลัง สิ่งนี้สร้างรหัสที่มีลักษณะดังนี้:
(<>)<>{(({}[()])()<>{})<>}{}<>({}<>)
ลองออนไลน์!
รหัสนี้ค่อนข้างเล็กและบางคนคิดว่ามันจะเล็กกว่านี้ไม่ได้ อย่างไรก็ตามหากเราเข้าใกล้มันจากมุมมองสแต็คที่สามมันก็ชัดเจนว่ามันไม่มีประสิทธิภาพอย่างมาก แทนที่จะวางสะสมของเราใน offstack เราสามารถวางมันลงบนกองที่สามกับและเรียกดูได้ที่ใช้เราปลาย(
)
เราจะวนซ้ำตัวเลขทั้งหมด แต่คราวนี้เราไม่ต้องทำอะไรมากเพื่อเพิ่มกองที่สามของเราโปรแกรมทำเพื่อเรา ดูเหมือนว่า:
({()({}[()])}{})
ลองออนไลน์
รหัสนี้มีขนาดน้อยกว่าครึ่งหนึ่งของเวอร์ชั่นกอล์ฟที่เราเคยทำมาก่อน ในความเป็นจริงการค้นหาด้วยคอมพิวเตอร์ได้พิสูจน์แล้วว่าโปรแกรมนี้เป็นโปรแกรมที่สั้นที่สุดที่สามารถทำงานนี้ได้ โปรแกรมนี้สามารถอธิบายได้โดยใช้วิธี "ผลรวมของการรันทั้งหมด" แต่ฉันคิดว่ามันง่ายกว่าและชัดเจนกว่ามากเมื่ออธิบายโดยใช้วิธีกองที่สาม
เมื่อไหร่ที่ฉันจะใช้กองที่สาม?
เมื่อไรก็ตามที่คุณเริ่มทำงานกับปัญหาใหม่ใน Brain-Flak คุณควรคิดกับตัวเองว่าฉันจะทำสิ่งนี้อย่างไรกับ Third Stack ในใจ อย่างไรก็ตามตามกฎทั่วไปของหัวแม่มือเมื่อใดก็ตามที่คุณต้องติดตามการสะสมบางประเภทหรือมีผลรวมสะสมเป็นความคิดที่ดีที่จะลองวางมันลงบนกองซ้อนที่สามของคุณแทนที่จะเป็นกองซ้อนสองตัวจริง
เวลาอื่นที่อาจเป็นความคิดที่ดีที่จะพิจารณาใช้กองซ้อนที่สามของคุณคือเมื่อคุณไม่มีที่ว่างในการจัดเก็บค่าบางอย่างในอีกสองกอง สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณทำการจัดการกับสองกองที่มีอยู่และคุณต้องการบันทึกค่าสำหรับใช้ในภายหลังโดยไม่ต้องติดตามว่ามันอยู่ที่ไหน
ข้อ จำกัด ของกองที่สาม
กองที่สามนั้นทรงพลังมากในหลาย ๆ ทาง แต่มันมาพร้อมกับข้อ จำกัด และข้อเสียของมันเอง
ประการแรกความสูงของสแต็กสูงสุดสำหรับกองที่สามที่จุดใด ๆ จะถูกกำหนดในเวลารวบรวม ซึ่งหมายความว่าหากคุณต้องการใช้พื้นที่จำนวนหนึ่งบนสแต็กคุณต้องจัดสรรพื้นที่นั้นเมื่อคุณกำลังเขียนโปรแกรม
ประการที่สองกองที่สามไม่ใช่การเข้าถึงแบบสุ่ม ซึ่งหมายความว่าคุณไม่สามารถทำการดำเนินการใด ๆ กับค่าใด ๆ แต่ค่าสูงสุด นอกจากนี้คุณไม่สามารถย้ายค่ารอบ ๆ บนสแต็ก (พูดสลับสององค์ประกอบแรก)
ข้อสรุป
The Third Stack เป็นเครื่องมือที่ทรงพลังและฉันคิดว่ามันสำคัญสำหรับผู้ใช้ Brain-Flak ทุกคน ต้องใช้ความคุ้นเคยและต้องการเปลี่ยนวิธีคิดของคุณเกี่ยวกับการเขียนโปรแกรมใน Brain-Flak แต่เมื่อใช้อย่างถูกต้องจะทำให้ความแตกต่างระหว่างความดีและความมหัศจรรย์เมื่อเล่นกอล์ฟ
cheatsheet
นี่คือรายการของการดำเนินการและสิ่งที่ส่งผลกระทบต่อกองที่สาม
Operation | Action
====================================================
(,[,< | Put a zero on top of the Third Stack
----------------------------------------------------
) | Add the top of the Third Stack to the
| second element and move it to the
| active stack
----------------------------------------------------
] | Subtract the top of the Third Stack
| from the second element and pop it
----------------------------------------------------
> | Pop the top of the Third Stack
----------------------------------------------------
() | Add one to the top of the Third Stack
----------------------------------------------------
{} | Pop the top of the active stack and
| add it to the top of the Third Stack
----------------------------------------------------
[] | Add the stack height to the Third
| Stack
----------------------------------------------------
<>,{,} | Nothing