Trong thử thách này, bạn sẽ viết một thông dịch viên cho 2 Ω (phiên âm như TwoMega ), một ngôn ngữ dựa trên lỏng lẻo Brainfuck với một không gian lưu trữ vô hạn chiều.
Ngôn ngữ
2 Ω chứa ba mẩu của nhà nước:
Các băng , mà là một danh sách vô hạn các bit, tất cả khởi tạo là 0. Nó có một yếu tố tận cùng bên trái, nhưng không có yếu tố ngoài cùng bên phải.
Các Memory Pointer , mà là một số nguyên dương đó là một chỉ số của một phần tử trong băng. Một con trỏ bộ nhớ cao hơn đề cập đến một ô băng ở bên phải; một con trỏ bộ nhớ bằng 0 đề cập đến phần tử ngoài cùng bên trái. Con trỏ bộ nhớ được khởi tạo thành 0.
Các Hypercube , mà là một khái niệm ∞ "hộp" chiều của các tế bào, mỗi trong số đó có chứa một chút khởi tạo là 0. Chiều rộng của Hypercube được ràng buộc trong mọi khía cạnh để chỉ có 2 tế bào, nhưng tính vô hạn của kích thước có nghĩa là số tế bào là không thể đếm được .
Một chỉ mục vào hypercube là một danh sách các bit liên quan đến một ô trong hypercube (giống như cách mà một danh sách các bit hữu hạn có thể được sử dụng để chỉ một hypercube có kích thước hữu hạn). Bởi vì băng là một danh sách các bit vô hạn, toàn bộ băng luôn đề cập đến một phần tử của Hypercube; yếu tố này được gọi là người giới thiệu .
2 Ω cho ý nghĩa cho 7 nhân vật khác nhau:
<
giảm con trỏ bộ nhớ bằng 1. Giảm xuống dưới 0 là hành vi không xác định, do đó bạn không cần phải xử lý nó.>
tăng con trỏ bộ nhớ lên 1.!
lật bit tại người giới thiệu..
đầu ra bit tại tham chiếu.^
thay thế bit tại ô được trỏ bởi con trỏ bộ nhớ trên băng bằng nghịch đảo của bit tại tham chiếu.[x]
chạy mãx
miễn là bit tại tham chiếu là 1.
Các thách thức
Nhiệm vụ của bạn là viết một chương trình lấy một chuỗi làm đầu vào và thực hiện đầu vào đó là chương trình 2 Ω .
Đây là môn đánh gôn , vì vậy câu trả lời hợp lệ ngắn nhất (tính bằng byte) sẽ thắng.
Ghi chú
- Bạn có thể giả định rằng chương trình sẽ chỉ bao gồm các ký tự
<>!.^[]
và[]
sẽ được lồng đúng cách. - Thông dịch viên của bạn chỉ nên bị giới hạn bởi bộ nhớ khả dụng trên hệ thống. Nó sẽ có thể chạy các chương trình mẫu trong một khoảng thời gian hợp lý.
Chương trình mẫu
In 1:
!.
In 010:
.!.!.
In 0 mãi mãi:
![!.!]
In 0 mãi mãi hoặc 1 mãi mãi nếu !
được trả trước:
[.]![!.!]
cat
chương trình: dường như không có một hướng dẫn nào để nhận đầu vào.
.
- in một số 0 duy nhất và sau đó tồn tại; !^!.
- in một cái duy nhất sau đó thoát ra. Nhiều hơn sẽ tốt mặc dù. Tại thời điểm này, người ta phải hiểu các bài nộp để xác minh chúng (và do đó nâng cao chúng!)
[0,0,0,0,0,0,0...]
(tức là sự hiện diện của a !
khi bắt đầu chương trình).
[.]![!.!]
để in giá trị của ô đó mãi mãi
1
s trên băng luôn luôn là hữu hạn. Trên thực tế, có một sự lựa chọn khá đơn giản giữa các số tự nhiên và trạng thái băng (diễn giải nội dung băng là số nhị phân ngược), cho thấy Hypercube về cơ bản là một mảng 1D vô hạn, được truy cập bằng cách lật các bit trong một giá trị con trỏ nguyên , thay vì trong / giảm như trong brainfuck.