Dòng mới được thêm vào cho rõ ràng:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
Tôi đã tự đưa ra hạn chế rằng nó phải đọc từ STDIN chứ không phải từ đầu ngăn xếp như câu trả lời Underload thông thường. Tôi cũng đã sử dụng đầu vào thập phân thích hợp, chiếm phần lớn mã.
Giải trình:
Tôi gói chương trình trong một gói quine: (a(:^)*
và ):^
. Điều này có nghĩa là tất cả mã bên trong trình bao bọc quine sẽ có mã nguồn của chương trình ở cuối ngăn xếp.
Để chuyển đổi các chữ số thành một chữ số Church bình thường, tôi sử dụng kỹ thuật thay thế từng chữ số bằng mã để nhân với 10 và thêm chữ số đó:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
Có rất nhiều sự lặp lại ở đây, vì vậy, hãy gói nó thành một chương trình con sẽ lấy một số Church từ đầu ngăn xếp và sử dụng nó để xây dựng "chuỗi chữ số:"
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
Tôi đặt nó vào một môi trường mới để có thể truy cập nhanh chóng:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
Bây giờ tôi có thể tạo mã thay thế cho R
. R
sử dụng các phần tử trên cùng của ngăn xếp để tạo bảng tra cứu để thay thế một chuỗi từ STDIN bằng mã Betaload. Nó hoạt động như thế này:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
Tuy nhiên, chúng ta có thể sử dụng chương trình con mà chúng ta vừa thực hiện để tạo các đoạn mã:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
Khi R
được chạy, nó sẽ biến đổi đầu vào thành một chuỗi các chương trình con xây dựng một số Giáo hội. Khi chương trình con này được thực thi, nó tạo ra số Church đó trên phần tử tiếp theo trên ngăn xếp (0, được đặt xuống trước đó). Điều này có nghĩa là, sau đó R^
, giá trị hàng đầu trên ngăn xếp sẽ là chữ số Church. Sau đó chúng tôi^
thêm một lần nữa để áp dụng số Church cho phần tử cuối cùng trong ngăn xếp (mã nguồn của chương trình) để có câu trả lời.
Sự thật thú vị: Tôi đã có MD cho bài nộp này trong vài tháng. Tôi đã giữ nó sau khi hiểu nhầm một câu hỏi (mà dường như tôi không thể tìm thấy nữa). Tôi đã phải đào nó từ Thùng rác của mình để đăng nó ở đây.