Lý lịch
Fractran là một ngôn ngữ lập trình hoàn chỉnh bí mật Turing được phát minh bởi John Conway. Một chương trình Fractran bao gồm một danh sách các phân số được sắp xếp. Chương trình bắt đầu bằng cách lấy một số nguyên duy nhất làm đầu vào. Mỗi lần lặp của chương trình, nó tìm kiếm danh sách cho phân số đầu tiên sao cho nhân số đó với phân số đó tạo ra một số nguyên khác. Sau đó, nó lặp lại quá trình này với số mới, bắt đầu trở lại ở đầu danh sách. Khi không có phân số nào trong danh sách có thể nhân với số, chương trình sẽ chấm dứt và đưa ra số làm đầu ra.
Lý do Fractran hoàn thành Turing là vì nó mô phỏng một máy đăng ký. Hệ số nguyên tố của số lưu trữ nội dung của các thanh ghi, trong khi phép chia và phép nhân là một cách để thêm và trừ một cách có điều kiện từ các thanh ghi. Tôi khuyên bạn nên đọc bài viết Wikipedia (liên kết đến ở trên).
Các thách thức
Nhiệm vụ của bạn là viết chương trình ngắn nhất có thể có thể lấy chương trình Fractran hợp lệ từ STDIN làm đầu vào duy nhất của nó và tạo chương trình BF hợp lệ thành STDOUT mô phỏng chương trình Fractran. Có hai cách bạn có thể mô phỏng chương trình Fractran với BF.
LƯU Ý: Câu trả lời của bạn không phải là chương trình BF. Câu trả lời của bạn là mã tạo ra chương trình BF từ bất kỳ chương trình Fractran nào. Mục tiêu là để chương trình BF tương đương với chương trình Fractran. (về mặt kỹ thuật bạn có thể thực hiện cuộc thi trong BF, nhưng sẽ rất khó)
lựa chọn 1
Chương trình của bạn sẽ xuất ra một chương trình BF thực hiện như sau:
- Lấy chính xác 1 số từ STDIN dưới dạng ký tự ASCII tương ứng (do cách thức hoạt động của đầu vào BF), là đầu vào cho chương trình Fractran.
- In chính xác 1 số thành STDOUT dưới dạng ký tự ASCII tương ứng, là đầu ra từ chương trình Fractran.
Tùy chọn này có nghĩa là đại diện cho đầu vào và đầu ra chính xác từ máy ảo Fractran.
Lựa chọn 2
Mã BF mà chương trình của bạn tạo ra phải làm như sau:
- Lấy đầu vào bằng cách lấy thừa số nguyên tố của số đã được mã hóa trong bộ nhớ (trước khi chạy chương trình). Nếu đầu vào là 28 (2 * 2 * 7), thì sẽ có giá trị 2 trong ô thứ hai và giá trị 1 trong ô thứ bảy (con trỏ bắt đầu trên ô 0). Tất cả các ô khác sẽ bằng không.
- Đưa ra đầu ra bằng cách nhân tố chính của đầu ra được mã hóa trong bộ nhớ khi chương trình kết thúc. Nếu đầu ra là 10, thì phải có giá trị 1 trong mỗi ô 2 và 5. Tất cả các ô có số nguyên tố khác phải có giá trị bằng 0. Nội dung của các tế bào khác không quan trọng.
Tùy chọn này đại diện cho mô hình điện toán đằng sau ngôn ngữ Fractran.
Quy tắc và yêu cầu
- Đầu vào (đầu chương trình của bạn) sẽ là danh sách các phân số trên STDIN. Sẽ có một phân số trên mỗi dòng có dấu phẩy giữa tử số và mẫu số. Một dòng trống đại diện cho sự kết thúc của đầu vào. Các phân số sẽ luôn luôn được giảm đến các điều khoản thấp nhất.
- Đầu ra của chương trình của bạn phải là một chương trình BF hợp lệ, một dòng thành STDOUT. Chương trình này sẽ có thể mô phỏng chương trình Fractran cụ thể đó theo một trong hai tùy chọn. Đối với bất kỳ đầu vào nào, chương trình BF được tạo sẽ có thể tạo ra cùng một đầu ra như chương trình Fractran.
- Bạn phải nói rõ tùy chọn bạn đã chọn.
- Bạn có thể chọn giới hạn trên bộ nhớ BF và băng, và liệu chúng có bao bọc không
- MÃ GOLF. Ngoài ra, kích thước của các chương trình BF xuất ra không quan trọng, chỉ có kích thước của chương trình đang thực hiện chuyển đổi.
- Các chương trình chỉ nên bao gồm ASCII có thể in được
Nếu tôi mơ hồ ở bất cứ đâu, đừng ngần ngại hỏi. Đây là một thách thức rất phức tạp để mô tả.
Ngoài ra, vui lòng gửi mã BF được tạo cho chương trình của bạn cho đầu vào sau, để cung cấp một cách dễ dàng để kiểm tra xem chương trình của bạn có hoạt động không:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Chương trình này tính toán số 1 trong phần mở rộng nhị phân của một số. Tuy nhiên, đầu vào và đầu ra được định dạng kỳ lạ (như với tất cả các chương trình Fractran). Đầu vào có dạng 2 ^ A, trong khi đầu ra có dạng 13 ^ B.