Cubix, 94 83 82 79 63 56 ไบต์
p>q'-?w.uh'e@U7.'hqi?oqB-!ul.-..$WWu_q<o'\;>....6t?.../!@
ขยาย:
p > q '
- ? w .
u h ' e
@ U 7 .
' h q i ? o q B - ! u l . - . .
$ W W u _ q < o ' \ ; > . . . .
6 t ? . . . / ! @ . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
หมายเหตุ
- ล่ามจะปิดใช้งานฟิลด์อินพุตเมื่อโปรแกรมเริ่มทำงาน เช่นนี้กระแสที่ไม่สิ้นสุดของการป้อนข้อมูลเป็นไปไม่ได้ โปรแกรมนี้ใช้อินพุตแบบอักขระต่ออักขระดังนั้นหากไม่มีข้อ จำกัด นี้โปรแกรมจะทำงานอย่างถูกต้อง
- โปรแกรมนี้ไม่ได้ล้างสแต็คและมันจะยุ่งอย่างรวดเร็ว เนื่องจากเครื่องนี้จะใช้งานได้อย่างเห็นได้ชัดสามารถให้กระแสอินพุทที่ไม่มีที่สิ้นสุดดูเหมือนว่ามีเหตุผลที่จะสมมติว่ามันยังมีหน่วยความจำที่ไม่มีที่สิ้นสุด
- ความช่วยเหลือด้านการเล่นกอล์ฟใด ๆ และทั้งหมดเป็นที่ชื่นชมมาก
ลองออนไลน์
คุณสามารถลองโปรแกรมที่นี่
คำอธิบาย
ความคิดทั่วไป
แนวคิดทั่วไปคือเราต้องการอ่านตัวอักษรจากนั้นตรวจสอบกับตัวละครที่แตกต่างกัน (ก่อนh
แล้วe
จึงl
เป็นต้น) เพื่อติดตามตัวละครที่เราพลาดไปเราเก็บไว้ที่ด้านล่างสุดของสแต็ก เมื่อเราต้องการเราสามารถนำมันขึ้นไปด้านบนอีกครั้งได้อย่างง่ายดาย
อ่าน / เขียนลูป
ห่วงอ่านเขียนเป็นเพียง 5 THบรรทัด อักขระทั้งหมดที่ไม่ได้ใช้จะถูกแทนที่ด้วย no-ops ( .
):
. . . .
. . . .
. . . .
@ . . .
' h q i ? o q B - ! u l . - . .
. . . . _ . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
สามารถแบ่งออกเป็นสองส่วนคือการอ่านและ (การเขียนและการตรวจสอบ) ส่วนแรกประกอบด้วยคำแนะนำถึงและรวมถึงเครื่องหมายคำถาม ส่วนที่สองคือส่วนที่เหลือของบรรทัด เนื่องจากสิ่งนี้วนรอบเราถือว่าเราเริ่มต้นด้วยสแต็กของ[...]
@
'hqi?
_
Explanation
'h Push the character code of the h
Stack: [..., 104]
q Send it to the bottom
Stack: [104, ...]
i Read one character of the input (-1 for EOF)
Stack: [104, ..., input]
? Start of condition:
if (input < 0):
@ execute '@', ending the program
if (input = 0):
continue going right
if (input > 0):
_ turn to the right, reflect back ('_') and
turn right again, effectively not changing
the direction at all
ส่วนที่สอง (การเขียนและตรวจสอบ) เป็นเส้นตรงอีกครั้ง [next-char, ..., input]
สแต็คเริ่มเป็น เราแยกตัวอักษรตัวต่อไปเพราะการเปลี่ยนแปลงในโปรแกรม
oqB-!ul.- Explanation
o Output the character at the top of the stack
q Send the input to the bottom of the stack
Stack: [input, next-char, ...]
B Reverse the stack
Stack: [..., next-char, input]
- Push the difference of the top two characters, which
is 0 if both are equal, something else otherwise
Stack: [..., next-char, input, diff]
! if (diff = 0):
u make a u-turn to the right
else:
l. execute two no-ops
- push [input - next-char - input], which is disregarded
later, so it effectively is a no-op as well.
ตอนนี้ IP จะเริ่มต้นอีกครั้งที่จุดเริ่มต้นของวงนี้, h
การตั้งค่าตัวอักษรถัดไปตรวจสอบเพื่อ
จับคู่ตัวละครถัดไป
หาก IP ทำการเลี้ยวกลับ (เช่นตัวอักษรที่เราอ่านและพิมพ์ตรงกับตัวละครตัวต่อไป'hello'
) เราต้องตรวจสอบว่าตัวอักษรที่ป้อนเข้านั้นขึ้นอยู่กับว่าตัวอักษรตัวต่อไปที่ด้านล่างของสแต็ค หลังจากนั้นเราต้องกลับไปที่ลูปการอ่าน / เขียนโดยไม่ต้องกดh
ไปที่สแต็กดังนั้นเราจึงต้องการวิธีอื่นในการไปที่นั่น
สิ่งแรกสิ่งแรก: พิจารณาว่าอักขระที่ป้อนเข้านั้นคืออะไร [..., prev-char, input, 0]
สแต็คมีลักษณะเช่นนี้
. . . .
- ? . .
u h ' e
. . . .
. . . . . . . . . ! u . . . . .
. . . . . . . . . \ ; . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
เพื่อเปรียบเทียบอินพุตเราใช้โค้ดอักขระh
อีกครั้ง ในขั้นต้นนี่เป็นเพราะฉันไม่รู้จริง ๆ ว่าฉันจะจัดการกับเรื่องนี้อย่างไรและh
เป็นตัวละครตัวแรกในสตริงที่จะตรวจสอบ แต่มันก็จบลงด้วยความสะดวก ถ้าเราลบรหัสอักขระของชั่วโมงจากการป้อนข้อมูลที่เราได้รับ-3
ถ้าใส่เป็นe
, 0
ถ้าใส่เป็นh
, 4
ถ้าใส่เป็นl
และถ้าใส่เป็น7
o
สิ่งนี้มีประโยชน์เพราะ?
คำสั่งให้เราแยกค่าลบจากค่าบวกและศูนย์ได้อย่างง่ายดาย เช่นถ้าเปลี่ยน IP ซ้ายแตกต่างเป็นลบดังนั้นการป้อนข้อมูลที่เป็นดังนั้นตัวอักษรถัดไปควรจะเป็นe
l
หากยังคง IP จะตรงความแตกต่างก็คือ0
เพื่อให้การป้อนข้อมูลที่เป็นดังนั้นตัวอักษรถัดไปควรจะเป็นh
e
หากการป้อนข้อมูลเป็นl
หรือ an o
IP เลี้ยวขวา
คำแนะนำทั้งหมดดำเนินการก่อนเครื่องหมายคำถามข้างต้นคือ:
;!e'h- Explanation
; Delete the top of the stack
Stack: [..., prev-char, input]
! if (input = 0):
e execute 'e' (no-op)
'h Push the character code of h
Stack: [..., prev-char, input, 104]
- Push the difference of the input and 104
Stack: [..., prev-char, input, 104, diff]
ตอนนี้ IP เปลี่ยนทิศทางตามรายละเอียดด้านบน เรามาดูความเป็นไปได้ที่แตกต่างกัน
อินพุต 'e'
ก่อนอื่นเราจะพิจารณาอินพุตe
ซึ่งทำให้ IP เลื่อนขึ้นจาก?
เนื่องจากความแตกต่างคือ 3 อักขระที่ไม่เกี่ยวข้องทั้งหมดถูกลบออกจากคิวบ์
. > q '
. ? . .
. . . .
. . . .
. . q . . . . . . . . l . . . .
$ W W . . . . . . . . > . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
อักขระจะถูกดำเนินการตามลำดับนี้ (ไม่รวมอักขระการควบคุมโฟลว์บางตัว):
q'l$WWq
q Save the difference (-3) to the bottom of the stack so
we can tell whether the l on the bottom of the stack is
the first or the second l in hello
Stack: [-3, ...]
'l Push the character code of l to the stack
Stack: [-3, ..., 108]
$W no-op
W Sidestep into the loop
q Send the character code to the bottom
Stack: [108, -3, ...]
ตอนนี้ IP มาถึงลูปการอ่าน / เขียนอีกครั้ง
อินพุต 'h'
หากอินพุตเป็น'h'
ส่วนต่างคือ 0 ดังนั้น IP จะไม่เปลี่ยนทิศทาง นี่คือคิวบ์อีกครั้งโดยลบอักขระที่ไม่เกี่ยวข้องทั้งหมดออก เนื่องจากเส้นทางนี้มีการใช้งานไม่กี่ครั้งจึงไม่มีการแทนที่ทั้งหมดที่ผ่าน&
มา IP เริ่มต้นที่เครื่องหมายคำถาม
. . . .
. ? w .
. . ' e
. . . .
. . . . . . . . . ! . . . . . .
. . . u _ q < . . \ . . . . . .
. . ? & & & / . . & . . . . . .
. . & . . . . . . & . . . . . .
. . . .
& & & &
. . . .
. . . .
คำแนะนำดำเนินการคือ:
'e!\?q_
'e Push the character code of the e
Stack: [..., 101]
! if (101 = 0):
\ reflect away (effectively a no-op)
? if (101 > 0):
turn right (always happens)
q Move 101 to the bottom of the stack
Stack: [101, ...]
_ No-op
และตอนนี้เรากำลังเข้าสู่ลูปการอ่าน / เขียนอีกครั้งดังนั้นเราเสร็จแล้ว
อินพุตอื่น ๆ
อินพุตอื่นทั้งหมดส่งผลให้เกิดความแตกต่างในเชิงบวกดังนั้น IP จะเลี้ยวขวาที่เครื่องหมายคำถาม เรายังต้องแยกl
และo
เพื่อให้เป็นสิ่งที่เราจะทำต่อไป
การแยก'l'
และ'o'
เก็บไว้ในใจที่แตกต่างกันคือ 7 o
และ 4 สำหรับและที่เราต้องจบโปรแกรมถ้าใส่เป็นl
o
นี่คือคิวบ์อีกครั้งด้วยชิ้นส่วนที่ไม่เกี่ยวข้องถูกแทนที่ด้วย a .
และไอพีโอพีข้ามถูกแทนที่ด้วยเครื่องหมายแอมเปอร์แซนด์
. . q .
. ? w .
. h ' .
. U 7 .
. . . . . . . . . . . . . - . .
. . . . . . . . . . . . . & . .
. . . . . . / ! @ . . . . & . .
. . . . . . & . . . . . . & . .
. . & .
. . & .
. . & .
. . & .
h7'wq-!@
h no-op
7 Push 7 to the stack
Stack: [..., diff, 7]
'wq Push w to the stack and send it to
the bottom. We don't care about it,
so it's now part of the ellipsis.
Stack: [..., diff, 7]
-! if (diff = 7):
@ End the program
ฉลาดระหว่างสอง'l'
s
ดังนั้นตอนนี้เราจึงรู้ว่าอินพุตเป็นl
แต่เราไม่รู้ว่าตัวl
ไหน ถ้ามันเป็นอันแรกเราต้องดันอีกอันl
ไปที่ด้านล่างของสแต็ก แต่ถ้ามันเป็นอันที่สองเราต้องกดo
อัน จำได้ไหมว่าเราบันทึกไว้-3
ที่ด้านล่างของสแต็กก่อนที่เราจะผลักครั้งแรกl
? เราสามารถใช้มันเพื่อแยกสองสาขา
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
6 t ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
สแต็กเริ่มต้นเป็น [..., -3 or 140, ...]
Explanation
6t?
6t Take the 6th item from the top and move
it to the top (which is either -3 or 140)
? If that's positive, turn right, otherwise,
turn left
เป็นครั้งแรก 'l'
หากนี่เป็นครั้งแรก'l'
เราจำเป็นต้องผลักดันอีก'l'
ครั้ง 'l'
หากต้องการบันทึกไบต์เราจะใช้ตัวอักษรเดียวกันเป็นครั้งแรก [...]
เราสามารถลดความซับซ้อนของสแต็คที่จะ นี่คือส่วนที่เกี่ยวข้องของคิวบ์โดยไม่ต้องแทนที่ด้วยเครื่องหมายแอมเปอร์แซนด์
p > q '
. . . .
. . . .
. . . .
' . q . . . . . . . . l . . . .
$ W W . . . . . . . . > & & & &
. . ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
ดำเนินการตามคำแนะนำต่อไปนี้:
$'pq'lq
$' no-op
pq no-op
'l Push the character code of l
Stack: [..., 108]
q Send it to the bottom
Stack: [108, ...]
เรากำลังจะเข้าสู่ลูปการอ่าน / เขียนดังนั้นเราจึงดำเนินการกับสาขานี้
ที่สอง 'l'
หากการป้อนข้อมูลเป็นครั้งที่สอง'l'
ใน'hello'
IP จะเลี้ยวขวาที่เครื่องหมายคำถาม อีกครั้งเราสามารถทำให้สแต็คไปถึงได้ง่ายขึ้น[...]
และ IP เริ่มต้น?
โดยชี้ไปทางทิศใต้ในเวลานี้
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . .
. . . u _ q < o ' \ . . . . . .
. . ? . . . . . . & . . . . . .
. . & . . . . . . & . . . . . .
. . . .
& & & &
. . . .
. . . .
คำแนะนำดำเนินการคือ:
'oq_
'o Push the character code of 'o'
Stack: [..., 111]
q Move the top item to the bottom
Stack: [111, ...]
_ No-op
และ IP กำลังจะเข้าสู่ลูปการอ่าน / เขียนอีกครั้งดังนั้นเราจึงทำกับสาขานี้เช่นกัน