คุณมีเคล็ดลับทั่วไปอะไรสำหรับการเล่นกอล์ฟใน Befunge ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ Befunge (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คุณมีเคล็ดลับทั่วไปอะไรสำหรับการเล่นกอล์ฟใน Befunge ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ Befunge (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คำตอบ:
เมื่อใช้การวนซ้ำหลายบรรทัดพยายามใช้ให้มากที่สุด:
>1234....v
^ <
VS
>1234v
^....<
ต้องการลดค่าหลังจากเงื่อนไข (เช่นเนื่องจากเส้นทางอื่นขึ้นอยู่กับค่า แต่อันนี้ไม่ได้)? แทนที่จะใช้>$
หรือ$<
ใช้ความก้าวหน้าของความจริงที่ว่าคุณรู้ค่าความจริงของตัวแปรและใช้_
แทนทั้งเปลี่ยนทิศทางและป๊อปสแต็คแทน
'* : v >$ .. @ Prints number in binary followed by the original
decimal number.
> :2%\2/ :!#^_ \.
กลายเป็น
'* : v _ .. @ Since we know that the topmost value on the stack
will be 0, we combine `>$` into `_`.
> :2%\2/ :!#^_ \.
อย่าลืมว่า0
อยู่ในกองซ้อนเสมอ ตัวอย่างเช่นนี้หมายถึงว่ามีสแต็คที่ว่างเปล่าg
จะเทียบเท่ากับ00g
และเทียบเท่ากับp
000p
หากคุณต้องการกดตัวเลขที่มากกว่า 15 ใช้'
เพื่อดึงค่า ASCII ของอักขระตัวถัดไป:
'*
ที่จะผลักดัน 42 มากกว่า:
4a*2+
67*
ทำงานด้วย
'
เรียนการสอน
แทนการใช้|
ต้องใช้สายอื่น (มักจะมีช่องว่างพิเศษอีกมากมาย) j
ลองใช้ ตัวอย่างเช่น:
01-`j@more code here
จะหยุดถ้าจำนวนที่อยู่ด้านบนของสแต็กเป็นลบและดำเนินการต่อไปเป็นอย่างอื่น หากคุณต้องการตัวละครหลายการใช้งานn*j
ที่n
เป็นจำนวนตัวอักษรที่คุณต้องการเมื่อค่าที่ส่งไปมีj
0
ตัวอย่าง:
01-`4*j01-*more code
ซึ่งจะลบล้างจำนวนลบ
j
เรียนการสอน
ใน Befunge-93 ถ้าสิ่งแรกที่คุณกดลงไปบนสแต็กคือสตริงคุณมักจะหนีไปด้วยการทิ้งข้อความเปิด ตัวอย่างเช่นนี้
"!iH",,,@
อาจทำให้สิ่งนี้ง่ายขึ้น:
!iH",,,@
สิ่งที่เกิดขึ้นคือล่ามตัวแรกพยายามเรียกใช้อักขระในสตริงที่ไม่มีเครื่องหมาย !
ดำเนินการที่ไม่เป็นอันตรายไม่ได้และi
และH
ไม่ได้เป็นคำแนะนำที่ถูกต้องเพื่อให้พวกเขากำลังละเลย (แม้ว่าในการใช้งานบางอย่างที่คุณอาจได้รับการเตือน)
เมื่อ"
พบจะถือว่าเป็นจุดเริ่มต้นของสตริง แต่เนื่องจากไม่มีเครื่องหมายอัญประกาศปิดล้อมรอบรอบสนามแข่งขันจนกว่า"
จะพบครั้งที่สอง อะไรคือสิ่งที่ผลักลงบนสแต็กคือตอนนี้:
,,,@ ···72 spaces··· !iH
เนื่องจากเราสนใจเฉพาะตัวละครสองสามตัวสุดท้ายเท่านั้นไม่มีสิ่งอื่นใดที่สำคัญ ดังนั้นหลังจากอัญประกาศเราก็จะดำเนินการทั้งสาม,
คำสั่งเขียนข้อความและ@
คำสั่งที่ออก
โปรดทราบว่าโดยทั่วไปจะไม่สามารถใช้งานได้ใน Befunge-98 เนื่องจากคำสั่งที่ไม่รู้จักจะทำให้ล่ามสะท้อนแทนที่จะเพิกเฉย
",,,@!iH
. โปรดทราบว่า Pyfunge เพิ่มพื้นที่พิเศษในขณะที่ FBBI ไม่ได้
ใน Befunge-93 มันมักจะเป็นข้อได้เปรียบในการทำให้ลูปแบนเป็นบรรทัดเดียวโดยที่ส่วนลูปของโค้ดจะถูกดำเนินการทั้งสองทิศทาง
ตัวอย่างเช่นพิจารณาโค้ดด้านล่างซึ่งแสดงผลตัวอักษรa
แปดครั้ง:
"a"9>1-:#v_@
^\,:\<
สิ่งนี้สามารถทำให้แบนได้เป็นบรรทัดเดียวโดยสลับลำดับลูปด้วยคำสั่งบริดจ์ ( #
):
"a"9>1#\-#,:#:>#\_@
หากคุณเพียงแค่ดูที่อักขระที่ไม่ใช่ช่องว่างคุณอาจได้รับความประทับใจว่านี่ยาวกว่าเดิม แต่เมื่อคุณคำนึงถึงตัวป้อนบรรทัดและการขยายเพิ่มเติมที่จำเป็นในรุ่นสองบรรทัดแล้วคุณจะต้องจบการบันทึกสี่ไบต์
ในกรณีนี้โดยเฉพาะรหัสถูกบีบอัดให้ดียิ่งขึ้นโดยสังเกตว่าลำดับที่สามารถเพียงแค่ถูกแทนที่ด้วย:#:
:
"a"9>1#\-#,:>#\_@
ในความเป็นจริงเมื่อใดก็ตามที่คุณมีคำสั่งซ้ำ ๆ กันทั้งสองด้านของ#
คำสั่งคุณสามารถทำให้มันง่ายขึ้นเพียงแค่คำสั่งเดียวดังนั้นนี่คือสิ่งที่คุณควรระวังเมื่อทำการวนซ้ำ
เพื่อให้เข้าใจถึงวิธีการทำงานมันสามารถช่วยในการเขียนลำดับลูปสองครั้งครั้งเดียวกับตัวละครทั้งหมดที่#
ถูกลบออก (เช่นสิ่งที่เกิดขึ้นเมื่อดำเนินการจากซ้ายไปขวา) และอีกครั้งกับตัวละครก่อน#
ลบออก (เช่นดำเนินขวาไปซ้าย )
"a"9>1#\-#,:>#\_@
>1 - :> _ ; executing left to right
> \ ,: \_ ; executing right to left
คุณสามารถเห็นได้อย่างชัดเจนว่าตอนนี้สิ่งนี้ตรงกับรหัสรุ่นสองบรรทัดเดิมอย่างไร
ส่งออกโดยรหัสทางออกซึ่งเป็นรูปแบบการส่งออกที่ได้รับอนุญาต หากความท้าทายขอให้คุณพิมพ์หมายเลขหนึ่งคุณสามารถบันทึกไบต์ด้วยการสิ้นสุดโปรแกรมด้วยq
แทน.@
q
คำสั่งมีฟังก์ชั่นที่แตกต่างกัน (โหมดคิว) หรือไม่ได้รับการสนับสนุน
ใน Befunge-93 คำสั่งป้อนอักขระ ( ~
) สามารถใช้เป็นทางลัดสำหรับ -1 ได้บ่อยครั้งเนื่องจากเป็นค่าที่ส่งคืนบน EOF
เป็นตัวอย่างรหัสด้านล่างจะส่งออก -1:
~.@
ไม่แนะนำในรหัสการผลิตเนื่องจากเมื่อทำงานในสภาพแวดล้อมแบบโต้ตอบโปรแกรมจะหยุดและรออินพุตของผู้ใช้ และถ้าผู้ใช้ป้อนข้อมูลผลลัพธ์จะไม่เป็น -1 อีกต่อไป
ที่กล่าวว่าการปกครองใน PPCG คือว่าโปรแกรมอาจถือว่ากระแสอินพุทที่ว่างเปล่าและที่ว่ามันจะมักจะถูกเรียกใช้ในTIO
นอกจากนี้โปรดทราบว่าคุณไม่จำเป็นต้องถูกห้ามไม่ให้ใช้เคล็ดลับนี้เพียงเพราะโปรแกรมของคุณจำเป็นต้องอ่านบางอย่างจากอินพุตสตรีม คุณต้องตรวจสอบให้แน่ใจว่าคุณดำเนินการอินพุตของคุณล่วงหน้าแล้วหลังจากนั้นการใช้ในอนาคตทั้งหมด~
ควรส่งคืน -1
ใช้ทิศทางของ IP เมื่อจัดการกับ_
หรือมากกว่าการใช้ตัวอักษรพิเศษสำหรับ|
!
ตัวอย่างจริง (จากโพสต์นี้ ):
#v~
,>:!#@_
สามารถเปลี่ยนเป็น
#v~
:<,_@#
อย่าลืม0k
ว่าไม่ได้ใช้คำสั่งต่อไป ซึ่งหมายความว่าแทนที่จะทำ:
;some boolean test;!jv;code if false;
;code if true;<
คุณสามารถบันทึกตัวละครโดยการทำ
;some boolean test;kv;code if false;
;code if true;<
k
เรียนการสอน
อย่าลืมk
ผู้ประกอบการ แทนการทำ"!dlroW olleH",,,,,,,,,,,,@
"!dlroW olleH"bk,@
โปรดทราบว่าk
การดำเนินการในเซลล์ที่เป็นเช่นนั้น9k,
จะไม่พิมพ์ 9 ครั้ง แต่ 10; 9 ครั้งด้วยและครั้งเดียวกับk
,
k
เรียนการสอน
เมื่อกดตัวเลขขนาดเล็กบนสแต็คคุณอาจจะคิดออกได้อย่างง่ายดายพอที่45*
จะได้รับคุณ20
และคุณจะได้รับ67*
42
เมื่อพูดถึงตัวเลขที่มากขึ้นคุณต้องมีโปรแกรมที่สามารถคำนวณการแสดงที่มีประสิทธิภาพที่สุดสำหรับคุณได้
ตัวเลือกที่ง่ายที่สุดสำหรับเรื่องนี้คือไมค์Schwörerของอินเตอร์เฟซออนไลน์สำหรับ BefunRep คุณเพียงแค่พิมพ์ตัวเลขและมันจะคายออกมาเป็นตัวแทน Befunge เทียบเท่า มันไม่ได้ดีที่สุดเสมอไป แต่ใกล้พอและแน่นอนว่าเกือบจะดีกว่าทุกอย่างที่คุณคิดด้วยมือ
ระบบออนไลน์นั้น จำกัด อยู่ที่ตัวเลขในช่วง 0 ถึง 16777215 ดังนั้นหากคุณต้องการอะไรที่ใหญ่กว่านั้นคุณจะต้องดาวน์โหลดยูทิลิตี BefunRep แบบสแตนด์อโลนแล้วทำการคำนวณด้วยตัวเอง
หากคุณกำลังเขียนโปรแกรมใน Befunge-98, ตัวเลือกที่จะต้องพิจารณาอีกคือFungify โดยทั่วไปแล้วมันไม่เหมาะสมเกือบเท่ากับ BefunRep แต่สำหรับตัวเลขที่ต่ำกว่าบางตัวที่ตัวเลขฐานสิบหกและอักขระอัญประกาศเดี่ยวมีประสิทธิภาพมากที่สุดบางครั้งก็สามารถให้ผลลัพธ์ที่ดีกว่า
'
คุณต้องการใช้ เช่นสำหรับ42
:'*