Beaver não bận rộn


13

Viết chương trình brainfuck gồm không quá 256 ký tự, thực hiện càng nhiều bước càng tốt, nhưng không lặp lại vô hạn. Chương trình có thể không có bất kỳ đầu vào.

Cụ thể hơn:

  • Giả sử một số lượng vô hạn các tế bào ở bên phải.
  • A <khi ở ô ngoài cùng bên trái không làm gì cả.
  • A -khi giá trị ô bằng 0 đặt ô thành 255.
  • Tất +-<>.cả các hướng dẫn được tính là một bước khi thực hiện.
  • Khi một [hoặc ]gặp phải, nó được tính là một bước. Tuy nhiên, nếu điều kiện là đúng và kiểm soát dòng chảy nhảy, tương ứng ]hoặc [không không một lần nữa được tính là một bước.
  • Giải pháp nào mất nhiều bước nhất sẽ thắng.
  • Nếu có một số kiểu mẫu trong giải pháp của bạn, việc đưa ra một hàm cho bao nhiêu bước mà một chương trình có độ dài tương tự nsẽ được đánh giá cao nhưng không bắt buộc.
  • Để đếm hướng dẫn, bạn có thể sử dụng trình thông dịch sửa đổi này :

Thí dụ:

++[-]

Các hướng dẫn gặp phải là ++[-]-], và chương trình chạy trong 7 bước.


6
Tôi sẽ ngạc nhiên nếu người chiến thắng chấm dứt mà không vượt quá số lượng thông dịch viên. Hãy nhớ rằng hải ly bận rộn 6 trạng thái TM mất ít nhất 10 ** 36534 bước.
Peter Taylor

Tôi đồng ý. Có vẻ như rất có thể bạn có thể viết một chương trình <50 char BF có thể chạy trong nhiều năm. Tôi sẽ bắt đầu.
captncraig

Đã ký. Trang nghiên cứu Busy Beaver tại drb.insel.de/~heiner/BB rất thú vị, đặc biệt là các chương trình thu âm chạy rất dài và chúng vẫn có kết quả chính xác (xem drb.insel.de/~heiner/BB/bb -xlist.txt ) - mô phỏng các trạng thái ghi nhớ, xây dựng "macro" để lưu các bước mô phỏng, v.v.
schnaader

4
@AntonGolov: thật không may, trong vũ trụ này, RAM và HD không chuyển đổi thành thiết bị lưu trữ vô hạn khi bạn cố lưu trữ các khối lượng lớn hơn 256 ^ theo byte trên chúng ...
đã ngừng quay ngược chiều

1
@boothby Hoàn toàn có thể thực hiện các tính toán chính xác liên quan đến siêu việt trên các máy tính hiện tại. Các thành phần của các giá trị chỉ cần được lưu trữ trong một biểu diễn trừu tượng hơn so với thông thường floathoặc doublenguyên thủy được sử dụng cho điện toán hàng ngày nói chung. (Tại thời điểm đó, máy tính chủ yếu chỉ thao tác các chuỗi đại diện cho phương trình)
AJMansfield

Câu trả lời:


15

Đây là một chương trình gồm 41 ký tự cuối cùng dừng lại, để lại hơn 10 (10 28) ô liền kề được đặt bằng 1 (vì vậy số lượng lệnh được thực hiện lớn hơn rất nhiều):

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

Nếu tôi không nhầm, đó là bản dịch chính xác của chương trình sau đây bằng ngôn ngữ biến thể BF sử dụng một bit cho mỗi ô nhớ (nghĩa là nội dung ô 0..1 thay vì 0..255, vì vậy '+' hành động chỉ đơn giản là lật giá trị bit):

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

Giá trị chính xác (số lượng 1 bit liền kề) được tạo bởi chương trình sau là

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


Chương trình trên khởi tạo & tính toán một hàm phát triển như 2 ↑↑ x (theo ký hiệu mũi tên lên Knuth ). Chuyển đổi tương tự chương trình BF biến thể khởi tạo & tính toán một hàm phát triển như 2 ↑ 23 x cung cấp chương trình 256 ký tự sau:

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

mà cuối cùng dừng lại, để lại hơn 2 ↑ 23 6 ô liền kề được đặt bằng 1 (vì vậy số bước là nhiều hơn thế).

NB-1 : 2 23 6 là một con số "lớn không thể tưởng tượng được"; ví dụ: thậm chí 2 ↑ 4 6 = 2 6 đã vượt qua số hạng đầu tiên (3 ↑↑↑↑ 3) trong chuỗi được sử dụng để tính số của Graham .

NB-2 : Tôi nghĩ rằng có khả năng 256 ký tự là đủ để chương trình BF khởi tạo và tính toán một hàm có đầu ra lớn hơn nhiều so với số của Graham - nếu tôi tìm thấy thời gian, có lẽ tôi sẽ cố gắng viết một ký tự.

NB-3 : Trong trường hợp bất kỳ ai quan tâm đến nguồn gốc của các chương trình trên, đây là một số tài nguyên lập trình cho "Brainf * ck F" , với các chương trình khác nhau được viết bằng Python. ("Brainf * ck F", hoặc chỉ "F", là cái mà tôi gọi là biến thể hoàn chỉnh Turing của ngôn ngữ Smallf * ck .) trang web được liên kết chỉ là một "tủ tệp" - xem tệp Busy_Beavers.txt để biết thảo luận chi tiết liên quan đến các chương trình trên.


Đây là một người chiến thắng rõ ràng vào lúc này (trừ khi tôi chỉ đánh giá thấp những người khác). Nhiều đề xuất rất được hoan nghênh, nhưng tôi sẽ đánh dấu nó là được chấp nhận ngay bây giờ. Nếu bất cứ ai không đồng ý, xin vui lòng bình luận.
Anton Golov

Khi bạn đạt đến cấp độ này, sẽ trở nên không thực tế khi cho rằng bạn có một trình thông dịch với bộ nhớ vô hạn. Tôi bắt đầu nghĩ rằng đây sẽ là một thử thách tốt hơn với bộ nhớ gói hữu hạn, vì vậy chúng tôi thực sự có thể chạy các câu trả lời.
captncraig

9

Đây là một 39 ký tự đẹp:

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

Về cơ bản, nó làm cho một "không gian" rộng 3 không gian mà nó di chuyển sang phải và giảm xuống một. Hoàn thành trong 31.919.535.558 hướng dẫn, với vòng lặp trong cùng thực hiện 256 ^ 3 lần. Tôi vẫn còn nhiều chỗ để mở rộng điều này khá xa với tốc độ 14 ký tự đến một mức độ lớn khác theo thời gian chạy.

Hoạt động trên mọi trình thông dịch có bộ nhớ không giới hạn hoặc với bộ nhớ gói.

Tôi để lại cho người đọc một bài tập để xác định khi nào phiên bản 2 vòng được cải thiện sẽ kết thúc:

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

Hiện tại nó đã chạy qua đêm và hơn 3.000.000.000 bước. Vẫn chưa nhận được thông qua một lần lặp duy nhất của vòng lặp bên ngoài. Gần như không vượt qua được 15% của vòng lặp thứ hai.


2

Chương trình này hoạt động với số lượng tế bào. Hai giá trị được khởi tạo khi bắt đầu với giá trị ascii 255. Giá trị đầu tiên ở vòng xoay đầu tiên của vòng lặp chính được chia thành 255 ô và chúng được khởi tạo với 255, mỗi vòng quay thứ hai của vòng lặp chính, mỗi giá trị trong 255 ô lại tách ra lên tới 255 * 255 ô, theo cách tương tự cho vòng xoay 255 của vòng lặp chính, tổng số ô được khởi tạo sẽ là 255 ^ 255. Giá trị thứ hai xác định số lần lặp lại của vòng lặp chính.

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

2

Chương trình này gần giống với chương trình trước của tôi, điểm khác biệt là giá trị xác định vòng ngoài vẫn cố định trong một ô cụ thể để cả số ô được khởi tạo và tổng số bước ở cuối chương trình có thể tăng lên

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

các ô được khởi tạo ở cuối chương trình 255 ^ 255

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

các ô được khởi tạo ở cuối chương trình 255 ^ 255 ^ 3

Tôi tiếp tục sửa đổi nó để chạy cho số bước thậm chí nhiều hơn.

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

nó khởi tạo 255 ^ 255 ô trong lần xoay đầu tiên của các ô chính 255 ^ (255 ^ 255 * 255) trong vòng xoay thứ hai của vòng lặp chính 255 ^ {255 ^ (255 ^ 255 * 255) * 255} trong vòng xoay thứ ba của vòng lặp chính trong cách này lặp lại 255 lần


Trông rất tuyệt! Xin lỗi vì chưa chấp nhận câu trả lời - Tôi đã phải dành chút thời gian để xem xét những điều này và tìm ra thứ tự tăng trưởng. Khi bạn nói "255 ^ 255 * 255", bạn có nghĩa là "255 ^ (255 * 255)"? (Tôi mong đợi "255 ^ 256" nếu không.)
Anton Golov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.