เคล็ดลับสำหรับการเล่นกอล์ฟใน Befunge


12

คุณมีเคล็ดลับทั่วไปอะไรสำหรับการเล่นกอล์ฟใน Befunge ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ Befunge (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ


ฉันไม่แน่ใจว่าสิ่งนี้ควรเปลี่ยนเป็น Befunge โดยทั่วไป แต่ Befunge 93 เหมาะสำหรับการเล่นกอล์ฟน้อยกว่า 98 มาก
Justin

6
เรามีหัวข้อBefunge 93เมื่อเร็ว ๆนี้ แต่ฉันคิดว่ามันจะเป็นการดีกว่าที่จะพูดคุยเรื่องนี้แทน จะเป็นไรไหม (และอาจทำเครื่องหมายเคล็ดลับที่ดีสำหรับเวอร์ชัน / s ในลักษณะเดียวกับที่เคล็ดลับของ Python ระบุว่าเป็น Python 2 / Python 3 โดยเฉพาะหรือไม่)
Sp3000

คำตอบ:



7

ต้องการลดค่าหลังจากเงื่อนไข (เช่นเนื่องจากเส้นทางอื่นขึ้นอยู่กับค่า แต่อันนี้ไม่ได้)? แทนที่จะใช้>$หรือ$<ใช้ความก้าวหน้าของความจริงที่ว่าคุณรู้ค่าความจริงของตัวแปรและใช้_แทนทั้งเปลี่ยนทิศทางและป๊อปสแต็คแทน

ตัวอย่าง

'* : 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/ :!#^_ \.

6

อย่าลืมว่า0อยู่ในกองซ้อนเสมอ ตัวอย่างเช่นนี้หมายถึงว่ามีสแต็คที่ว่างเปล่าgจะเทียบเท่ากับ00gและเทียบเท่ากับp000p


5

หากคุณต้องการกดตัวเลขที่มากกว่า 15 ใช้'เพื่อดึงค่า ASCII ของอักขระตัวถัดไป:

'*

ที่จะผลักดัน 42 มากกว่า:

4a*2+

หรือ67*ทำงานด้วย
Doorknob

4
@Doorknob บางทีฉันควรเลือกหมายเลขเฉพาะเพื่อให้ได้คะแนนที่ชัดเจนยิ่งขึ้น แต่ 42 เป็นจำนวนที่ดีมาก
Justin

2
โปรดทราบว่าเคล็ดลับนี้ใช้กับ Befunge-96 และใหม่กว่าเท่านั้น Befunge-93 ไม่สนับสนุนการ'เรียนการสอน
James Holderness

4

แทนการใช้|ต้องใช้สายอื่น (มักจะมีช่องว่างพิเศษอีกมากมาย) jลองใช้ ตัวอย่างเช่น:

01-`j@more code here

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

01-`4*j01-*more code

ซึ่งจะลบล้างจำนวนลบ


โปรดทราบว่าเคล็ดลับนี้ใช้กับ Befunge-96 และใหม่กว่าเท่านั้น Befunge-93 ไม่สนับสนุนการjเรียนการสอน
James Holderness

4

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

"!iH",,,@

อาจทำให้สิ่งนี้ง่ายขึ้น:

!iH",,,@

ลองออนไลน์!

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

เมื่อ"พบจะถือว่าเป็นจุดเริ่มต้นของสตริง แต่เนื่องจากไม่มีเครื่องหมายอัญประกาศปิดล้อมรอบรอบสนามแข่งขันจนกว่า"จะพบครั้งที่สอง อะไรคือสิ่งที่ผลักลงบนสแต็กคือตอนนี้:

,,,@  ···72 spaces···  !iH

เนื่องจากเราสนใจเฉพาะตัวละครสองสามตัวสุดท้ายเท่านั้นไม่มีสิ่งอื่นใดที่สำคัญ ดังนั้นหลังจากอัญประกาศเราก็จะดำเนินการทั้งสาม,คำสั่งเขียนข้อความและ@คำสั่งที่ออก

โปรดทราบว่าโดยทั่วไปจะไม่สามารถใช้งานได้ใน Befunge-98 เนื่องจากคำสั่งที่ไม่รู้จักจะทำให้ล่ามสะท้อนแทนที่จะเพิกเฉย


ใน Befunge-98 คุณสามารถใส่สตริงที่ต้องการที่ท้ายบรรทัดแทนเช่น; ",,,@!iH. โปรดทราบว่า Pyfunge เพิ่มพื้นที่พิเศษในขณะที่ FBBI ไม่ได้
Jo King

@ โจกิ้งฉันไม่ต้องการที่จะแนะนำเพราะในขณะที่คุณชี้ให้เห็นพฤติกรรมที่แตกต่างจากล่ามหนึ่งไปยังอีก และถึงแม้ว่ามันจะทำงานได้มันก็ไม่สอดคล้องกัน (สังเกตว่าพื้นที่พิเศษใน FBBI ในกรณีนี้ ) ดังนั้นจึงอาจเป็นข้อผิดพลาดที่อาจสิ้นสุดลงในบางจุด
James Holderness

อืม ... ฉันคิดว่าพื้นที่นั้นอาจเป็นส่วนหนึ่งของข้อมูลจำเพาะ ฉันจำได้ว่าอ่านที่ไหนสักแห่งว่ามีการเว้นวรรคหลายรายการจะถูกข้ามและนับเป็นช่องว่างเดียว ตัวอย่างทั้งใน PyFunge และ FBBI ดูเหมือนว่า FBBI จะวางแต่ละบรรทัดตามความยาวของบรรทัดที่ยาวที่สุดในขณะที่ PyFunge จะเพิ่มช่องว่างพิเศษโดยปริยาย
Jo King

คุณพูดถูก - สเปคบอกว่าช่องว่างหลาย ๆ อันในสตริงควรจะถือว่าเป็นช่องว่างเดียว ในความเป็นจริงแล้วกฎได้เสนอให้จัดการกับปัญหาของการพันสายในสนามเด็กเล่นที่ไม่มีที่สิ้นสุด (ดังนั้น PyFunge จึงถูกต้องอย่างชัดเจน AFAIC) แต่คำอธิบายสเปคของอัลกอริทึมการห่อนั้นค่อนข้างเปิดให้ตีความดังนั้นฉันสามารถเข้าใจได้ว่าทำไมการใช้งานบางอย่างอาจทำสิ่งที่แตกต่างกัน แต่สิ่งที่สำคัญที่สุดคือปัญหานี้ค่อนข้างซับซ้อนและฉันคิดว่ามันน่าจะครอบคลุมได้ดีกว่าโดยเฉพาะกับ Befunge-97/98
James Holderness

4

ใน 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

คุณสามารถเห็นได้อย่างชัดเจนว่าตอนนี้สิ่งนี้ตรงกับรหัสรุ่นสองบรรทัดเดิมอย่างไร


3

ส่งออกโดยรหัสทางออกซึ่งเป็นรูปแบบการส่งออกที่ได้รับอนุญาต หากความท้าทายขอให้คุณพิมพ์หมายเลขหนึ่งคุณสามารถบันทึกไบต์ด้วยการสิ้นสุดโปรแกรมด้วยqแทน.@


2
โปรดทราบว่าเคล็ดลับนี้ใช้กับ Befunge-98 และใหม่กว่าเท่านั้น ในเวอร์ชันก่อนหน้าของ Befunge qคำสั่งมีฟังก์ชั่นที่แตกต่างกัน (โหมดคิว) หรือไม่ได้รับการสนับสนุน
James Holderness

3

ใน Befunge-93 คำสั่งป้อนอักขระ ( ~) สามารถใช้เป็นทางลัดสำหรับ -1 ได้บ่อยครั้งเนื่องจากเป็นค่าที่ส่งคืนบน EOF

เป็นตัวอย่างรหัสด้านล่างจะส่งออก -1:

~.@

ลองออนไลน์!

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

ที่กล่าวว่าการปกครองใน PPCG คือว่าโปรแกรมอาจถือว่ากระแสอินพุทที่ว่างเปล่าและที่ว่ามันจะมักจะถูกเรียกใช้ในTIO

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


2

ใช้ทิศทางของ IP เมื่อจัดการกับ_หรือมากกว่าการใช้ตัวอักษรพิเศษสำหรับ|!

ตัวอย่างจริง (จากโพสต์นี้ ):

#v~
,>:!#@_

สามารถเปลี่ยนเป็น

#v~
:<,_@#

2

อย่าลืม0kว่าไม่ได้ใช้คำสั่งต่อไป ซึ่งหมายความว่าแทนที่จะทำ:

;some boolean test;!jv;code if false;
       ;code if true;<

คุณสามารถบันทึกตัวละครโดยการทำ

;some boolean test;kv;code if false;
      ;code if true;<

โปรดทราบว่าเคล็ดลับนี้ใช้กับ Befunge-98 และใหม่กว่าเท่านั้น รุ่นก่อนหน้าของ Befunge ไม่รองรับการkเรียนการสอน
James Holderness

1

อย่าลืมkผู้ประกอบการ แทนการทำ"!dlroW olleH",,,,,,,,,,,,@ "!dlroW olleH"bk,@โปรดทราบว่าkการดำเนินการในเซลล์ที่เป็นเช่นนั้น9k,จะไม่พิมพ์ 9 ครั้ง แต่ 10; 9 ครั้งด้วยและครั้งเดียวกับk,


1
โปรดทราบว่าเคล็ดลับนี้ใช้กับ Befunge-98 และใหม่กว่าเท่านั้น รุ่นก่อนหน้าของ Befunge ไม่รองรับการkเรียนการสอน
James Holderness

1

เมื่อกดตัวเลขขนาดเล็กบนสแต็คคุณอาจจะคิดออกได้อย่างง่ายดายพอที่45*จะได้รับคุณ20และคุณจะได้รับ67* 42เมื่อพูดถึงตัวเลขที่มากขึ้นคุณต้องมีโปรแกรมที่สามารถคำนวณการแสดงที่มีประสิทธิภาพที่สุดสำหรับคุณได้

ตัวเลือกที่ง่ายที่สุดสำหรับเรื่องนี้คือไมค์Schwörerของอินเตอร์เฟซออนไลน์สำหรับ BefunRep คุณเพียงแค่พิมพ์ตัวเลขและมันจะคายออกมาเป็นตัวแทน Befunge เทียบเท่า มันไม่ได้ดีที่สุดเสมอไป แต่ใกล้พอและแน่นอนว่าเกือบจะดีกว่าทุกอย่างที่คุณคิดด้วยมือ

ระบบออนไลน์นั้น จำกัด อยู่ที่ตัวเลขในช่วง 0 ถึง 16777215 ดังนั้นหากคุณต้องการอะไรที่ใหญ่กว่านั้นคุณจะต้องดาวน์โหลดยูทิลิตี BefunRep แบบสแตนด์อโลนแล้วทำการคำนวณด้วยตัวเอง

หากคุณกำลังเขียนโปรแกรมใน Befunge-98, ตัวเลือกที่จะต้องพิจารณาอีกคือFungify โดยทั่วไปแล้วมันไม่เหมาะสมเกือบเท่ากับ BefunRep แต่สำหรับตัวเลขที่ต่ำกว่าบางตัวที่ตัวเลขฐานสิบหกและอักขระอัญประกาศเดี่ยวมีประสิทธิภาพมากที่สุดบางครั้งก็สามารถให้ผลลัพธ์ที่ดีกว่า


เมื่อกดตัวเลขขนาดเล็กใน Befunge 98 'คุณต้องการใช้ เช่นสำหรับ42:'*
Justin

@ จัสตินฉันพูดถึงว่าในย่อหน้าสุดท้าย แต่ประเด็นทั้งหมดของเคล็ดลับนี้คือคุณไม่จำเป็นต้องรู้เทคนิคมากมายสำหรับการสร้างตัวเลขหากคุณใช้เครื่องมือเพื่อทำสิ่งนี้ให้กับคุณ
James Holderness
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.