บีเวอร์สมองไม่ว่าง


13

เขียนโปรแกรม brainfuck ที่มีอักขระไม่เกิน 256 ตัวซึ่งดำเนินการตามขั้นตอนมากที่สุดเท่าที่จะทำได้ แต่ไม่วนซ้ำอย่างไม่สิ้นสุด โปรแกรมอาจไม่รับอินพุตใด ๆ

โดยเฉพาะอย่างยิ่ง:

  • สมมติว่ามีจำนวนเซลล์ที่ไม่ จำกัด ทางด้านขวา
  • A <เมื่ออยู่ที่เซลล์ด้านซ้ายสุดไม่ทำอะไรเลย
  • เมื่อค่าในเซลล์เป็นเซลล์ศูนย์ชุด-255
  • คำแนะนำ+-<>.ทั้งหมดนับเป็นขั้นตอนเดียวเมื่อดำเนินการ
  • เมื่อ a [หรือ]พบมันนับเป็นขั้นตอนเดียว แต่ถ้าเงื่อนไขเป็นจริงและการควบคุมการไหลกระโดดที่สอดคล้องกัน]หรือ[ไม่ไม่ได้อีกครั้งนับเป็นขั้นตอน
  • ทางออกที่ทำตามขั้นตอนมากที่สุดเป็นผู้ชนะ
  • หากมีวิธีการแก้ปัญหาของคุณอยู่บ้างการให้ฟังก์ชั่นสำหรับจำนวนขั้นตอนที่โปรแกรมที่มีความยาวคล้ายกันnจะได้รับการชื่นชม แต่ไม่จำเป็น
  • หากต้องการนับคำแนะนำคุณสามารถใช้ล่ามที่ปรับเปลี่ยนนี้ได้ :

ตัวอย่าง:

++[-]

คำแนะนำที่พบคือ++[-]-]และโปรแกรมรัน 7 ขั้นตอน


6
ฉันจะแปลกใจถ้าผู้ชนะสิ้นสุดลงโดยไม่นับจำนวนล่ามมากเกินไป โปรดทราบว่า 6-state TM busy Beaver ใช้เวลาอย่างน้อย 10 ** 36534 ขั้นตอน
Peter Taylor

ฉันเห็นด้วย. ดูเหมือนจะเป็นไปได้สูงว่าคุณสามารถเขียนโปรแกรม <50 char BF ที่สามารถทำงานได้นานหลายปี ฉันจะเริ่มต้น
captncraig

ลงนาม หน้าวิจัย Busy Beaver ที่drb.insel.de/~heiner/BBนั้นน่าสนใจมากโดยเฉพาะอย่างยิ่งความจริงที่ว่าโปรแกรมบันทึกทำงานได้นานมากและพวกเขาก็ยังมีผลลัพธ์ที่แน่นอน (ดูdrb.insel.de/~heiner/BB/bb -xlist.txt ) - การจำลองจำรัฐสร้าง "macros" เพื่อบันทึกขั้นตอนการจำลอง ฯลฯ
schnaader

4
@AntonGolov: น่าเสียดายที่ในจักรวาลนี้ RAM และ HD ไม่ได้แปลงเป็นอุปกรณ์เก็บข้อมูลที่ไม่มีที่สิ้นสุดเมื่อคุณพยายามที่จะเก็บ bignums ที่มีขนาดใหญ่กว่า 256 ^ เป็นไบต์ในนั้น ...
หยุดที่จะเปิด counterclockwis

1
@boothby เป็นไปได้อย่างสมบูรณ์ที่จะทำการคำนวณที่แน่นอนที่เกี่ยวข้องกับ transcendentals บนคอมพิวเตอร์ปัจจุบัน ส่วนประกอบของค่านั้นจะต้องถูกเก็บไว้ในรูปแบบที่เป็นนามธรรมมากกว่าแบบปกติfloatหรือdoubleแบบดั้งเดิมที่ใช้สำหรับการคำนวณทั่วไปในชีวิตประจำวัน ( ณ จุดที่คอมพิวเตอร์ส่วนใหญ่จะเป็นเพียงแค่การจัดการกับสายที่เป็นตัวแทนของสมการ)
AJMansfield

คำตอบ:


15

ต่อไปนี้เป็นโปรแกรม 41 อักขระที่หยุดการทำงานชั่วคราวโดยปล่อยเซลล์ที่ต่อเนื่องกันมากกว่า 10 ↑ (10 ↑ 28) ให้เท่ากับ 1 (ดังนั้นจำนวนคำสั่งที่ดำเนินการจะยิ่งใหญ่กว่านั้น):

>+>+>+>+[->[>]+[->[>]+[->[>]+[<]+<]+<]+<]

ถ้าฉันไม่เข้าใจผิดนั่นเป็นคำแปลที่ถูกต้องของโปรแกรมต่อไปนี้ในภาษา BF- ตัวแปรที่ใช้บิตเดียวสำหรับแต่ละหน่วยความจำเซลล์ (เช่นเนื้อหาของเซลล์ 0..1 แทน 0..255 ดังนั้น '+' ทำหน้าที่เพียงแค่พลิกบิตค่า):

>+>+>+>+[+>[>]+[+>[>]+[+>[>]+[<]+<]+<]+<]

ค่าที่แน่นอน (จำนวน 1-bits ที่อยู่ติดกัน) ที่สร้างโดยโปรแกรมหลังคือ

3 * (2 ↑ 118842243771396506390315925503 - 1) + 1.


โปรแกรมข้างต้นจะเริ่มต้นและคำนวณฟังก์ชันที่เพิ่มขึ้นเช่น 2 ↑↑ x (ในสัญลักษณ์ Knuth up-arrow ) การแปลงที่คล้ายกันของโปรแกรม Variant-BF ที่เริ่มต้นและคำนวณฟังก์ชันที่เพิ่มขึ้นเช่น 2 like 23 x ให้โปรแกรม 256 ตัวอักษรต่อไปนี้:

>+>+>+>+>+>+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+

ซึ่งในที่สุดก็หยุดเหลือมากกว่า 2 ↑ 23 6 เซลล์ที่อยู่ติดกันตั้งเท่ากับ 1 (ดังนั้นจำนวนขั้นตอนนั้นยิ่งใหญ่กว่านั้น)

NB-1 : 2 ↑ 23 6 เป็นหมายเลข "มีขนาดใหญ่มากอย่างไม่น่าเชื่อ" เช่นแม้ 2 ↑ 4 6 = 2 ↑↑↑↑ 6 แล้วเกินกว่าระยะแรก (3 ↑↑↑↑ 3) ในลำดับที่ใช้ในการคำนวณจำนวนของเกรแฮม

NB-2 : ฉันคิดว่ามันน่าจะเป็นที่ตัวละคร 256 ตัวก็เพียงพอแล้วสำหรับโปรแกรม BF ในการเริ่มต้นและคำนวณฟังก์ชั่นที่มีเอาต์พุตมากกว่าหมายเลขของ Graham - ถ้าฉันหาเวลาบางทีฉันอาจจะลองเขียนมัน

NB-3 : ในกรณีที่ทุกคนสนใจที่มาของโปรแกรมข้างต้นนี่คือแหล่งข้อมูลการเขียนโปรแกรมสำหรับ "Brainf * ck F"พร้อมโปรแกรมต่าง ๆ ที่เขียนด้วย Python ("Brainf * ck F" หรือเพียงแค่ "F" คือสิ่งที่ฉันเรียกว่าตัวแปรทัวริงที่สมบูรณ์ของSmallf * ck esolanguage) ตอนนี้ฉันเพิ่งอัปโหลดไฟล์เหล่านี้ซึ่งออฟไลน์มาหลายปีแล้วและตอนนี้ หน้าเว็บที่เชื่อมโยงเป็นเพียง "ตู้เก็บเอกสาร" - ดูไฟล์ Busy_Beavers.txt สำหรับการสนทนาโดยละเอียดที่เกี่ยวข้องกับโปรแกรมข้างต้น


นี่เป็นผู้ชนะที่ชัดเจนในขณะนี้ (เว้นแต่ฉันจะประเมินค่าต่ำ ๆ ของผู้อื่น) คำแนะนำเพิ่มเติมยินดีต้อนรับมาก แต่ฉันจะทำเครื่องหมายว่าเป็นที่ยอมรับในตอนนี้ หากใครไม่เห็นด้วยกรุณาแสดงความคิดเห็น
Anton Golov

เมื่อคุณมาถึงระดับนี้มันจะไม่สมจริงที่จะสมมติว่าคุณมีล่ามที่มีหน่วยความจำไม่สิ้นสุด ฉันเริ่มคิดว่านี่จะเป็นความท้าทายที่ดีกว่าด้วยการ จำกัด หน่วยความจำที่ จำกัด ดังนั้นเราจึงสามารถหาคำตอบได้
captncraig

9

นี่คือ 39 ตัวละครที่ดีอย่างหนึ่ง:

-[>-[>-[-[>+<-]<[>+<-]<[>+<-]>>>]<-]<-]

โดยทั่วไปแล้วจะทำให้เลื่อนพื้นที่กว้างทั้ง 3 ช่องซึ่งจะเลื่อนไปทางขวาและลดลงทีละอัน เสร็จสิ้นใน 31,919,535,558 คำแนะนำโดยที่วงในสุดจะดำเนินการ 256 ^ 3 ครั้ง ฉันยังคงมีพื้นที่เหลือเฟือที่จะขยายขนาดของตัวละครให้อยู่ในระดับ 14 อักขระไปจนถึงระยะเวลาที่ยาวนาน

ทำงานกับล่ามใด ๆ ที่มีหน่วยความจำไม่ได้ จำกัด หรือมีหน่วยความจำห่อ

ฉันปล่อยให้แบบฝึกหัดแก่ผู้อ่านเพื่อพิจารณาว่าเมื่อใดที่การปรับปรุงโดยลูป 2 เวอร์ชั่นจะเสร็จสิ้น:

-[>-[>-[>-[>-[-[>+<-]<[>+<-]<[>+<-]<[>+<-]<[>+<-]>>>>>]<-]<-]<-]<-]

ตอนนี้มันวิ่งข้ามคืนแล้วและมีมากกว่า 3,000,000,000 ขั้นตอน ยังไม่ได้ผ่านการวนซ้ำเดียวของลูปด้านนอก ทำให้แทบจะไม่ถึง 15% ของวงที่สอง


2

โปรแกรมนี้ทำงานในจำนวนเซลล์ไม่ จำกัด สองค่าเริ่มต้นในการเริ่มต้นด้วยค่า ascii 255 ค่าแรกที่การหมุนครั้งแรกของการวนรอบหลักถูกแบ่งเป็น 255 เซลล์และเริ่มต้นด้วย 255 แต่ละครั้งที่การหมุนครั้งที่สองของการวนรอบหลักแต่ละค่าใน 255 เซลล์แยกอีกครั้ง มากถึง 255 * 255 เซลล์ในทางเดียวกันสำหรับการหมุนวนรอบ 255 หลักเซลล์ทั้งหมดที่เริ่มต้นจะเป็น 255 ^ 255 ค่าที่สองกำหนดจำนวนครั้งที่จะวนซ้ำหลัก

>->>-[<<[<]>[[[>]>>>[>]-[<]<<<[<]>-]>]>[>>[>]>+<<[<]<-]>>[>]>-]

2

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

->>-<<[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]

เริ่มต้นเซลล์เมื่อสิ้นสุดโปรแกรม 255 ^ 255

-[>-[>->>[-]-<<[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]<-]<-]

เริ่มต้นเซลล์เมื่อสิ้นสุดโปรแกรม 255 ^ 255 ^ 3

ฉันแก้ไขเพิ่มเติมเพื่อให้ทำงานได้หลายขั้นตอนยิ่งขึ้น

->>>->>-<<<<<[>>>[>]<[[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]<[>>>[[<+>-]>]<<[<]]<]>>>>[[<<+>>-]>]<-<<[<]<<-]

มันเริ่มต้นเซลล์ 255 ^ 255 ระหว่างการหมุนครั้งแรกของเซลล์หลัก 255 ^ (255 ^ 255 * 255) ในระหว่างการหมุนรอบที่สองของวงหลัก 255 ^ {255 ^ (255 ^ 255 * 255) * 255} เซลล์ในระหว่างการหมุนรอบที่สามของห่วงหลัก วิธีนี้วนซ้ำ 255 ครั้ง


ดูดี! ขออภัยที่ยังไม่ได้รับคำตอบ - ฉันต้องใช้เวลาสักครู่เพื่อดูสิ่งเหล่านี้และหาลำดับการเติบโต เมื่อคุณพูดว่า "255 ^ 255 * 255" คุณหมายถึง "255 ^ (255 * 255)" หรือไม่ (ฉันคาดหวังว่า "255 ^ 256" เป็นอย่างอื่น)
Anton Golov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.