_8
,%
;
"}{{+_5
"= %_!
= """{
;"{" )!
Chấm dứt với lỗi chia cho 0 (thông báo lỗi trên STDERR).
Hãy thử trực tuyến!
Bố cục cảm thấy thực sự không hiệu quả nhưng tôi không thấy cách nào để chơi nó ngay bây giờ.
Giải trình
Giải pháp này dựa trên thủ thuật số học của Dennis: lấy tất cả các mã ký tự modulo 8
, thêm một cặp từ cả hai đầu và đảm bảo rằng nó chia hết cho5
.
Mê cung mồi:
- Labyrinth có hai ngăn xếp các số nguyên tùy ý chính xác, chính và aux (iliary), được điền ban đầu với một (ngầm) số lượng vô hạn các số không.
- Mã nguồn giống như một mê cung, trong đó con trỏ lệnh (IP) đi theo hành lang khi nó có thể (thậm chí quanh các góc). Mã bắt đầu ở ký tự hợp lệ đầu tiên theo thứ tự đọc, tức là ở góc trên cùng bên trái trong trường hợp này. Khi IP đến bất kỳ hình thức giao nhau nào (tức là một số ô liền kề ngoài một ô mà nó xuất phát), nó sẽ chọn một hướng dựa trên đỉnh của ngăn xếp chính. Các quy tắc cơ bản là: rẽ trái khi âm, tiếp tục đi về phía trước khi số 0, rẽ phải khi dương. Và khi một trong những điều này là không thể bởi vì có một bức tường, thì IP sẽ đi theo hướng ngược lại. IP cũng quay vòng khi nhấn vào ngõ cụt.
- Các chữ số được xử lý bằng cách nhân đỉnh của ngăn xếp chính với 10 và sau đó thêm chữ số.
Mã bắt đầu bằng một vòng lặp 2x2 nhỏ, theo chiều kim đồng hồ, đọc tất cả các modulo đầu vào 8:
_ Push a 0.
8 Turn into 8.
% Modulo. The last three commands do nothing on the first iteration
and will take the last character code modulo 8 on further iterations.
, Read a character from STDIN or -1 at EOF. At EOF we will leave loop.
Bây giờ ;
loại bỏ -1
. Chúng ta nhập một vòng lặp theo chiều kim đồng hồ khác để di chuyển đỉnh của ngăn xếp chính (tức là ký tự cuối cùng) xuống phía dưới:
" No-op, does nothing.
} Move top of the stack over to aux. If it was at the bottom of the stack
this will expose a zero underneath and we leave the loop.
= Swap top of main with top of aux. The effect of the last two commands
together is to move the second-to-top stack element from main to aux.
" No-op.
Bây giờ có một bit tuyến tính ngắn:
{{ Pull two characters from aux to main, i.e. the first and last (remaining)
characters of the input (mod 8).
+ Add them.
_5 Push 5.
% Modulo.
IP hiện đang ở một ngã ba hoạt động như một nhánh để kiểm tra khả năng chia hết cho 5. Nếu kết quả của modulo khác không, chúng ta biết rằng đầu vào không phải là một palindrom Watson-Crick và chúng ta quay về hướng đông:
_ Push 0.
! Print it. The IP hits a dead end and turns around.
_ Push 0.
% Try to take modulo, but division by zero fails and the program terminates.
Mặt khác, chúng ta cần tiếp tục kiểm tra phần còn lại của đầu vào, để IP tiếp tục đi về phía nam. Các {
kéo trên dưới cùng của đầu vào còn lại. Nếu chúng tôi đã kiệt sức đầu vào, thì đây sẽ là một 0
(từ đáy aux ), và IP tiếp tục di chuyển về phía nam:
) Increment 0 to 1.
! Print it. The IP hits a dead end and turns around.
) Increment 0 to 1.
{ Pull a zero over from aux, IP keeps moving north.
% Try to take modulo, but division by zero fails and the program terminates.
Mặt khác, có nhiều ký tự trong chuỗi cần kiểm tra. IP quay về hướng tây và di chuyển vào vòng 2x2 tiếp theo (theo chiều kim đồng hồ), bao gồm phần lớn không có op:
" No-op.
" No-op.
{ Pull one value over from aux. If it's the bottom of aux, this will be
zero and the IP will leave the loop eastward.
" No-op.
Sau vòng lặp này, chúng ta lại có đầu vào trên ngăn xếp chính, ngoại trừ ký tự đầu tiên và cuối cùng của nó và với số 0 ở trên cùng. Việc ;
loại bỏ 0
và sau đó =
hoán đổi đỉnh của các ngăn xếp, nhưng đây chỉ là để hủy bỏ đầu tiên =
trong vòng lặp, bởi vì chúng ta hiện đang đi vào vòng lặp ở một vị trí khác. Rửa sạch và lặp lại.