<
,,}:?
.
;(" {(={}{".
,",;=};} }) "{@
อินพุตN
ตามด้วยสตริงคั่นด้วยอักขระที่ไม่ใช่ตัวเลขใด ๆ
ลองออนไลน์!
สิ่งนี้เขียนขึ้นโดยความร่วมมือกับ Sp3000 (ซึ่งหมายความว่าฉันไม่ต้องกังวลกับการหาอัลกอริทึมดังนั้นเขาจึงเริ่มทำงานกับมันขึ้นมาด้วยวิธีแก้ปัญหา 118 ไบต์ แต่ไม่สามารถตีกอล์ฟได้ดังนั้นฉันจึงตีกอล์ฟ .. ใช่สำหรับการทำงานเป็นทีม)
คำอธิบาย
ไพรเมอร์ปกติของ Sp (ตามปกติแก้ไขเล็กน้อย):
- Labyrinth เป็นภาษา 2D แบบกองซ้อนที่มีสองกองหลักและเสริม แทบทุกอย่างเกิดขึ้นบนสแต็กหลัก แต่คุณสามารถเลื่อนค่าไปที่อีกอันหนึ่งได้เช่นเพื่อย้อนกลับหรือบันทึกในภายหลัง
- สแต็กไม่มีก้นลึกและเต็มไปด้วยเลขศูนย์ดังนั้นการ popping จากสแต็กเปล่าจึงไม่ใช่ข้อผิดพลาด
- การดำเนินการเริ่มต้นจากอักขระที่ถูกต้องตัวแรก ที่ทางแยกแต่ละแห่งที่มีเส้นทางที่เป็นไปได้สองทางขึ้นไปสำหรับตัวชี้คำสั่ง (IP) ที่จะใช้ด้านบนของสแต็กจะถูกตรวจสอบเพื่อกำหนดตำแหน่งที่จะไปต่อไป ลบคือเลี้ยวซ้ายศูนย์จะไปข้างหน้าและบวกจะเลี้ยวขวา ขณะที่สิ่งนี้ถูกสร้างขึ้นเพื่อให้โค้ดดูเหมือนข้อความที่คดเคี้ยวและคดเคี้ยว แต่ก็ไม่มีอะไรหยุดคุณจากการสร้าง "ห้อง" ซึ่งมีการตรวจสอบเงื่อนไขเหล่านี้ในทุกเซลล์ สิ่งเหล่านี้สามารถสร้างพฤติกรรมที่คาดเดาไม่ได้ แต่ยอดเยี่ยมสำหรับการเล่นกอล์ฟ
- ซอร์สโค้ด (และเลย์เอาต์ของเขาวงกต) สามารถแก้ไขได้ที่รันไทม์โดยใช้
<>^v
การเลื่อนแถวหรือคอลัมน์หรือกริดแบบวนรอบ
"
ไม่มีใครรู้
ไปเลย.
รหัสเริ่มต้นขึ้นใน<
ซึ่งเป็นเคล็ดลับการเล่นกอล์ฟที่ฉันได้ใช้สองสามครั้งเมื่อเริ่มต้นด้วยรหัสเชิงเส้นยาว ๆ มันเลื่อนแถวแรกไปทางซ้ายเป็นวงกลมด้วย IP บนดังนั้นแหล่งที่มาจึงมีลักษณะดังนี้:
<
,,}:?
.
;(" {(={}{".
,",;=};} }) "{@
แต่ตอนนี้ IP ไม่สามารถเคลื่อนย้ายไปได้ทุกที่ดังนั้นจึงดำเนินการ<
อีกครั้ง สิ่งนี้จะดำเนินต่อไปจนกว่าเราจะถึงสถานะนี้:
<
,,}:?
.
;(" {(={}{".
,",;=};} }) "{@
ณ จุดนี้ IP ?
สามารถออกจากเซลล์และเริ่มดำเนินการบรรทัดที่สองเริ่มต้นจาก ดังนั้นนี่คือรหัสเชิงเส้นที่แบ่งย่อย:
? # Read the first integer on STDIN, i.e. N.
:} # Duplicate it and move one copy over to the auxiliary stack.
, # Read the separator character.
,. # Read the first character of the input string and directly print it.
ตอนนี้ IP เข้าสู่ห้อง 3x2 ซึ่งจริงๆแล้วเป็นการบีบอัดสองวง (ซ้อนทับ) 2x2 วนตามเข็มนาฬิกา การวนซ้ำครั้งแรกจะอ่านและทิ้งN-1
อักขระจาก STDIN
; # Discard the top of the stack. On the first iteration, this is the
# separator we've already read. On subsequent iterations this will be
# one of the N-1 characters from the input string.
( # Decrement N. If this hits zero, we leave the loop, otherwise we continue.
, # Read the next character from STDIN to be discarded.
ตอนนี้เราเข้าสู่วงที่สองซึ่งอ่านส่วนที่เหลือของสายป้อน เราสามารถตรวจพบ EOF เพราะ,
จะกลับมา-1
ในกรณีนั้นทำให้ IP เลี้ยวไปทางซ้าย
, # Read a character. Exit the loop if EOF.
( # Decrement it.
การลดลงนั้นไม่มีประโยชน์จริง ๆ แต่เราสามารถยกเลิกได้ฟรีในภายหลังและที่นี่ช่วยให้เราซ้อนทับสองลูป
หากเรารับ5 ABCDEFGHIJKLMNOP
อินพุตเป็นตัวอย่างสแต็กจะมีลักษณะดังนี้:
Main [ ... 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' -1 | 5 ... ] Auxiliary
โปรดทราบว่าสิ่งเหล่านี้สอดคล้องกับอักขระอินพุตFGHIJKLMNOP
(เพราะเราทำให้มันลดลง) และเราไม่ต้องการที่จะพิมพ์ตัวแรกของN-1
ตัวอักษรเหล่านั้น (เรามีเพียงอักขระที่ถูกละทิ้งแต่ต้องการข้ามN
)
ขณะนี้มีบิตเชิงเส้นสั้น ๆ ที่เตรียมสแต็กสำหรับลูปถัดไป:
; # Discard the -1.
= # Swap the tops of the stacks, i.e. N with the last character.
# By putting the last character on the auxiliary stack, we ensure that
# it doesn't get discarded in the next loop.
} # Move N over to the auxiliary stack as well.
กองตอนนี้ดูเหมือนว่า:
Main [ ... 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' | 5 'O' ... ] Auxiliary
เราเข้าไปอีกห่วง 2x2 ตามเข็มนาฬิกา ซึ่งจะละทิ้งN
อักขระตัวบนจากสแต็กหลัก:
; # Discard the top of the main stack.
{ # Pull N over from the auxiliary stack.
( # Decrement it. It it's 0 we leave the loop.
} # Push N back to the auxiliary stack.
เมื่อเราออกจากการวนซ้ำ=
แลกเปลี่ยนนั้น0
และตัวอักษรสุดท้ายของสายป้อนอีกครั้ง ตอนนี้กองหน้าจะเป็นแบบนี้:
Main [ ... 'E' 'F' 'G' 'H' 'I' 'O' | ... ] Auxiliary
เราต้องการที่จะพิมพ์เนื้อหาของกองหลัก (ยกเว้นองค์ประกอบด้านล่างและเพิ่มขึ้นทีละ 1) จากทางด้านซ้าย นั่นหมายความว่าเราต้องนำมันไปที่สแต็คเสริม นั่นคือสิ่งที่ลูป 2x2 (ตามเข็มนาฬิกา) ถัดไปทำ:
{ # Pull an element over from the auxiliary stack. This is necessary so we
# have a 0 on top of the stack when entering the loop, to prevent the IP
# from turning right immediately.
} # Move the top of the main stack back to the auxiliary stack. If this was the
# bottom of the stack, exit the loop.
) # Increment the current character.
} # Move it over to the auxiliary stack.
สแต็คตอนนี้:
Main [ ... | 'F' 'G' 'H' 'I' 'J' 'P] ... ] Auxiliary
เราย้ายครั้งแรกของเหล่านั้น (คนที่เราไม่ต้องการที่จะพิมพ์) {
กลับไปที่กองหลัก และตอนนี้เราเข้าสู่วง 2x2 สุดท้าย ( ทวนเข็มนาฬิกา ) ซึ่งพิมพ์ส่วนที่เหลือ:
{ # Pull another character over from the auxiliary stack. Exit the loop
# if that's the zero at the bottom of the stack.
. # Print the character.
@
ในที่สุดเรายุติการโปรแกรมด้วย
'
ตัวละครนับเป็นเรื่องปกติหรือไม่? ตัวอย่างเช่น:''123321
?