กระชับโปรแกรม Befunge


17

Befungeเป็นภาษาโปรแกรมลับสองมิติ แนวคิดพื้นฐานคือคำสั่ง (อักขระหนึ่งตัว) ถูกวางไว้บนกริด 2 มิติ โฟลว์ควบคุมเดินข้ามตารางดำเนินการคำสั่งที่ส่งผ่านและเปลี่ยนทิศทางเมื่อกระทบกับลูกศร ( >^<v) คำสั่งเป็นแบบสแต็ก ดูรายการนี้ ดูเพิ่มเติมhttp://esolangs.org/wiki/Befunge

ข้อมูลจำเพาะสำหรับ Befunge-98มีให้บริการ

ปัญหา

เขียนโปรแกรมที่แปลงโปรแกรม Befunge เป็นรูปแบบที่กะทัดรัดยิ่งขึ้น ตัวอย่างเช่นโปรแกรมต่อไปนี้จะพิมพ์0:

>   0   v

>   @   .

^       <

ในกรณีนี้มันสามารถบีบอัดได้โดยไม่ต้องเปลี่ยนพฤติกรรมของโปรแกรมโดยการลบแถวของช่องว่างเพื่อให้

>0v
>@.
^ <

การแปลงซับซ้อนมากขึ้นสามารถหมุนหรือเรียงลำดับคำสั่งของมิเรอร์และกำจัดคำสั่งควบคุมโฟลว์ที่ไม่จำเป็นเพื่อให้โปรแกรมมีขนาดกะทัดรัด ตัวอย่างเช่นด้วยโปรแกรมนี้:

>12345v
      6
v....7<
.
.
.
@

คุณอาจปิดท้ายโปรแกรมเข้าไปในรู:

>12345v
>...@ 6
^....7<

สำหรับตัวอย่างแรกโปรแกรมขนาดกะทัดรัดที่สุดที่เป็นไปได้คือ

>0.@

คุณสามารถใช้การแปลงใด ๆ ตราบใดที่โปรแกรมเอาต์พุตให้ผลลัพธ์เหมือนกัน

โปรแกรมอินพุต

โปรแกรมอินพุตเป็นโปรแกรม Befunge-98 ที่ถูกต้อง

คุณอาจคิดว่าโปรแกรมอินพุตนั้นถูกกำหนดไว้แล้ว นั่นคือมันไม่ได้ใช้คำสั่งที่อ่านสถานะภายนอก: คำสั่งที่ผู้ใช้ป้อนข้อมูล&และ~, randomizer ?และตนเองปรับเปลี่ยนคำสั่งรหัสและpg

คุณอาจจะสมมติว่าโปรแกรมอินพุตสิ้นสุดลง

เกณฑ์การให้คะแนน

นี่ไม่ใช่การเขียนโค้ด แต่เป็นปัญหาในการเขียนโปรแกรมที่ทำการตีกอล์ฟ

อินพุตเป็นชุดกรณีทดสอบ (โปรแกรม Befunge ที่ตรงตามข้อ จำกัด การป้อนข้อมูลด้านบน) คะแนนรวมคือผลรวมของคะแนนสำหรับกรณีทดสอบ

คะแนนสำหรับแต่ละกรณีทดสอบ

คะแนนเป็นพื้นที่ของตัวเรือนูนของเซลล์ที่ไม่ว่างเปล่าในโปรแกรมเอาท์พุทซึ่งแต่ละเซลล์จะได้รับการปฏิบัติเสมือนเป็นสี่เหลี่ยมจัตุรัสซึ่งทั้งสี่มุมนั้นเป็นจุดขัดแตะในระนาบคาร์ทีเซียน ตัวอย่างเช่นโปรแกรมของ

>   v
 @  <

ได้รับคะแนน 9.5

หากโปรแกรมของคุณไม่ยุติในเวลาและหน่วยความจำที่เหมาะสมในอินพุตที่ระบุคะแนนจะเป็นของโปรแกรมอินพุต (นี่เป็นเพราะคุณสามารถเพิ่ม wrapper การ จำกัด เวลาซึ่งส่งผลให้โปรแกรมอินพุตไม่เปลี่ยนแปลงหากโปรแกรมของคุณไม่สิ้นสุดในเวลา)

หากโปรแกรมกรณีทดสอบมีผลลัพธ์ที่แตกต่างกัน (หรือล้มเหลวในการยกเลิก) หลังจากประมวลผลกับโปรแกรมของคุณคะแนนคือคะแนนของโปรแกรมอินพุตบวกกับการลงโทษ 100 คะแนน


8
จะป้องกันไม่ให้โปรแกรมทำงานจนเสร็จสมบูรณ์และเขียนโปรแกรม Befunge ที่พิมพ์ผลลัพธ์เดียวกันได้อย่างไร
Keith Randall

5
อนุญาต "รับ" และ "วาง" หรือไม่ หากคุณอนุญาตให้ "ใส่" (รหัสแก้ไขตัวเอง) มันจะยากที่จะทำอะไร
Keith Randall

2
การประหารชีวิตเริ่มต้นจากที่ไหน? มุมซ้ายบน ถ้าเป็นเช่นนั้นคุณสามารถอธิบายผลลัพธ์ของตัวอย่างที่ 2 ได้หรือไม่ .หมายถึงจำนวนเต็มเอาต์พุต แต่ถ้าคุณเริ่มจากด้านบนซ้ายแสดงว่าไม่มีจำนวนเต็มในสแต็กไปยังเอาต์พุต
elssar

1
@elssar ใช่.ส่งออกจำนวนเต็ม แต่ยังเมื่อมีพารามิเตอร์ไม่เพียงพอในสแต็ก befunge อ้างว่ามีจำนวนศูนย์ที่เพียงพอแทน 000ดังนั้นตัวอย่างที่สองจะเอาท์พุท
daniero

@KeithRandall: การเขียนโปรแกรมใหม่ด้วยเอาต์พุตเดียวกันใช้ได้กับโปรแกรมที่มีเอาต์พุตแบบสั้นเท่านั้น gและpไม่ได้รับอนุญาต (ขออภัยลืมเกี่ยวกับสิ่งเหล่านี้; แก้ไข)
หอยทากเครื่องกล

คำตอบ:


12

ฉันใช้เวลานั่งเครื่องบินนาน ๆ เขียนโค้ดอันนี้ขึ้น ฉันได้เขียนคอมไพเลอร์ befunge หลอกซึ่งรันโปรแกรม befunge แยกบล็อกพื้นฐานและวางมันออกมาในรูปแบบกะทัดรัด

เชื่อมโยงไปยังโปรแกรม

เมื่อเรียกใช้โปรแกรม 99 ขวดนี้:

92+9*                           :. v  <
>v"bottles of beer on the wall"+910<
,:
^_ $                             :.v
            >v"bottles of beer"+910<
            ,:
            ^_ $                     v
>v"Take one down, pass it around"+910<
,:
^_ $                           1-v
                                 :
        >v"bottles of beer"+910.:_          v
        ,:
        ^_ $                          ^
                    >v" no more beer..."+910<
                    ,:
                    ^_ $$ @

มันสร้างผลลัพธ์ต่อไปนี้:

92+9*:.019+"llaw eht no "v
v  _v# :"bottles of beer"<
>    ,:    v
^  _v#     <
    >$:.019+"reeb f"v
 v _  v#:"bottles o"<
 >     ,:  v
 ^ _  v#   <
      >$019+"dnuo"v
     v"pass it ar"<
     >" ,nwod eno"v
 v _    v#:"Take "<
 >       ,:v
 ^ _    v# <
        >$1-:v
 v _      v# <
 >         :.019+"reeb "v
  v_  v#   :"bottles of"<
  >        ,v
  ^_  v#   :<
      >    $019+"llaw"v
           v" on the "<
           >"reeb fo "v
^  _^#      :"bottles"<
          >019+"...r"v
v  _v#:" no more bee"<
>    ,:    v
^  _v#     <
    >$$@    

จริง ๆ แล้วมันไม่ได้มีขนาดกะทัดรัดกว่าแหล่งที่มามากนัก แต่มันอาจจะทำได้ดีกว่าในโปรแกรมที่มีขนาดใหญ่กว่า

โปรแกรมจะถูกจัดวางด้วยพื้นที่การจัดเส้นทางด้านซ้ายและเนื้อหาบล็อกพื้นฐานทางด้านขวา โดยปกติบล็อกพื้นฐานจะถูกจัดวางในจำนวนแถวเท่า ๆ กันดังนั้นทางเข้าและออกจะอยู่ติดกับพื้นที่เส้นทาง ในตอนท้ายของแต่ละบล็อกพื้นฐานแกดเจ็ต#^_vและชุดรูปแบบวางจากขวาไปซ้ายให้ทำตามเงื่อนไขและไหลตามเส้นทางไปยังคอลัมน์ ที่จุดเริ่มต้นของบล็อกพื้นฐานแต่ละคอลัมน์เหล่านี้จะถูกส่งไปยังแถวสำหรับบล็อกพื้นฐานปลายทาง

นอกจากนี้หากผลลัพธ์สั้นมันก็แค่สร้างผลลัพธ์อย่างชัดเจนเช่นนี้

"output">:#,_@

ฉันไม่ได้ทำสิ่งใดเพื่อปรับพื้นฐานบล็อกให้เหมาะสมที่สุดเพียงเลย์เอาต์ ทำ.

ดังนั้นการทดสอบอยู่ที่ไหน


1
ลิงค์ซอร์สโค้ดน่าจะเป็น 500 ในขณะนี้ เซิร์ฟเวอร์กำหนดค่าผิดพลาดหรือไม่
John Dvorak

1
@JanDvorak: แน่นอน แก้ไขแล้ว.
Keith Randall

1

Seded 5 ตัวอักษร

ดังนั้นแม้ว่านี่จะไม่ใช่ codegolf นี่เป็นวิธีแก้ปัญหาที่จะมีอัตราส่วนความยาวต่อคะแนนที่ดี แต่ไม่จำเป็นต้องเป็นคะแนนที่ดี

/^$/d

มันเพียงแค่ลบบรรทัดว่าง


10
รหัสของคุณไม่ถูกต้อง! คุณไม่สามารถลบบรรทัดว่างเปล่าได้ ฉันไม่สามารถเขียนรหัส 2d ในความคิดเห็นได้ แต่ให้พิจารณากรณีที่ทิศทางนั้นลดลงและสตริงคงที่จะเริ่มต้น ( ") ควรเว้นบรรทัดว่างทุกบรรทัดในลักษณะอักขระเว้นวรรค หากเราพิมพ์สตริงนั้นรหัสที่คุณสร้างไม่มีช่องว่างนั้นในเอาต์พุต!
saeedn

3
ดูรหัสในideone.com/BdcRcfb aมันควรพิมพ์ แต่หลังจากย่อให้สั้นก็จะพิมพ์ออกbaมา
saeedn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.