Mục tiêu của thử thách này là (cuối cùng) xuất ra mọi chương trình tạm dừng có thể bằng ngôn ngữ bạn chọn. Lúc đầu điều này nghe có vẻ bất khả thi, nhưng bạn có thể thực hiện điều này với một sự lựa chọn rất cẩn thận về thứ tự thực hiện.
Dưới đây là một sơ đồ ASCII để minh họa điều này. Để các cột biểu thị một số của mỗi chương trình có thể (mỗi chương trình là một số ký hiệu hữu hạn từ một bảng chữ cái hữu hạn). Để mỗi hàng đại diện cho một bước duy nhất trong việc thực hiện chương trình đó. Một X
đại diện cho việc thực hiện được thực hiện bởi chương trình đó tại thời điểm đó.
step# p1 p2 p3 p4 p5 p6
1 X X X X X X
2 X X X X X
3 X X X X
4 X X X X
5 X X X
6 X X
7 X X
8 X X
9 X X
∞ X X
Như bạn có thể nói, chương trình 2 và 4 không dừng lại. Nếu bạn thực hiện chúng cùng một lúc, bộ điều khiển của bạn sẽ bị kẹt trong vòng lặp vô hạn là chương trình 2 và không bao giờ xuất chương trình 3 trở lên.
Thay vào đó, bạn sử dụng một cách tiếp cận phù hợp . Các chữ cái thể hiện một thứ tự thực hiện có thể trong 26 bước đầu tiên. Các *
s là nơi chương trình đã dừng lại và được xuất ra. Đây .
là những bước chưa được thực hiện.
step# p1 p2 p3 p4 p5 p6
1 A C F J N R V
2 B E I M Q * Z
3 D H * P U
4 G L T Y
5 K O X
6 * S .
7 W .
8 . .
9 . .
∞ . .
Yêu cầu đối với ngôn ngữ đích
Ngôn ngữ đích (ngôn ngữ được giải thích song song) phải là Turing-Complete. Ngoài ra, nó có thể là bất kỳ ngôn ngữ nào Turing-Complete, bao gồm cả các tập hợp con Turing hoàn chỉnh của các ngôn ngữ lớn hơn nhiều. Bạn cũng có thể tự do diễn giải những thứ như quy tắc hệ thống thẻ tuần hoàn. Bạn cũng được phép tạo một ngôn ngữ để kiểm tra, miễn là bạn có thể chỉ ra lý do tại sao nó hoàn thành Turing.
Ví dụ, nếu bạn chọn kiểm tra brainfuck, thì tốt nhất chỉ nên kiểm tra []-+<>
tập hợp con, vì đầu vào không được hỗ trợ và đầu ra chỉ bị vứt đi (xem bên dưới).
Khi nói đến chương trình "điều khiển" (mà bạn đang chơi gôn), không có yêu cầu đặc biệt nào. Hạn chế ngôn ngữ bình thường áp dụng.
Cách tạo danh sách chương trình vô hạn
Phần lớn các ngôn ngữ lập trình có thể được biểu diễn dưới dạng một loạt các ký hiệu từ một bảng chữ cái hữu hạn. Trong trường hợp này, việc liệt kê một danh sách mọi chương trình có thể theo thứ tự độ dài là tương đối dễ dàng. Bảng chữ cái bạn sử dụng phải đại diện cho các yêu cầu của ngôn ngữ đích. Trong hầu hết các trường hợp, đây là ASCII có thể in được. Nếu ngôn ngữ của bạn hỗ trợ Unicode như một tính năng bổ sung, bạn không nên kiểm tra mọi tổ hợp ký tự Unicode có thể, chỉ ASCII. Nếu ngôn ngữ của bạn chỉ sử dụng []-+<>
thì đừng kiểm tra các kết hợp khác nhau của các ký tự ASCII "bình luận". Các ngôn ngữ như APL sẽ có bảng chữ cái đặc biệt của riêng họ.
Nếu ngôn ngữ của bạn được mô tả tốt nhất theo một số cách không phải là chữ cái, như Fractran hoặc Turing Machines, thì có những phương pháp hợp lệ khác để tạo danh sách tất cả các chương trình hợp lệ có thể.
Giải thích một danh sách các chương trình ngày càng phát triển
Phần quan trọng của thách thức này là viết một trình thông dịch song song cho một danh sách các chương trình đang phát triển. Có một số bước cơ bản cho việc này:
- Thêm số lượng chương trình hữu hạn vào danh sách
- Giải thích từng chương trình trong danh sách riêng lẻ trong một khoảng thời gian hữu hạn. Điều này có thể được thực hiện bằng cách thực hiện một bước hướng dẫn cho mỗi bước. Lưu tất cả các trạng thái.
- Xóa tất cả các chương trình chấm dứt / ném lỗi khỏi danh sách
- Xuất ra các chương trình tạm dừng *
- Thêm một số chương trình nữa vào danh sách
- Mô phỏng lần lượt từng chương trình, chọn thực hiện các chương trình cũ hơn khi chương trình bị tắt
- Xóa tất cả các chương trình chấm dứt / ném lỗi khỏi danh sách
- Xuất ra các chương trình tạm dừng *
- nói lại
* Bạn chỉ nên xuất các chương trình tạm dừng sạch sẽ. Điều này có nghĩa là không có lỗi cú pháp hoặc ngoại lệ chưa được ném trong quá trình thực thi. Các chương trình yêu cầu đầu vào cũng nên được chấm dứt mà không xuất chúng. Nếu một chương trình tạo đầu ra, bạn không nên chấm dứt nó, chỉ cần ném đầu ra đi.
Thêm quy tắc
- Bạn không được sinh ra các luồng mới để chứa các chương trình đã thử nghiệm, vì điều này giảm tải công việc song song hóa lên hệ điều hành máy chủ / phần mềm khác.
- Chỉnh sửa: Để đóng các lỗ hổng tiềm năng trong tương lai, bạn không được phép
eval
(hoặc bất kỳ chức năng liên quan nào) một phần của mã chương trình được kiểm tra . Bạn có thểeval
mã hóa từ mã của trình thông dịch. (Câu trả lời BF-in-Python vẫn hợp lệ theo các quy tắc này.) - Đây là môn đánh gôn
- Ngôn ngữ bạn viết bài nộp của bạn không cần phải giống với ngôn ngữ bạn đang kiểm tra / xuất ra.
- Bạn nên cho rằng bộ nhớ khả dụng của bạn là không giới hạn.
- Khi chứng minh tính đầy đủ của Turing, bạn có thể cho rằng đầu vào được mã hóa cứng vào chương trình và đầu ra có thể được đọc khỏi trạng thái bên trong của chương trình.
- Nếu chương trình của bạn tự xuất ra, nó có thể sai hoặc đa âm.
"If your program outputs itself, it is probably wrong or a polyglot."