`:_64/"32}
,` (3 :=-{
"`{"; _v2$ ;`3
"`".:@ ; ".5(`3.
< "" `^`;>
Một bản collab khác với @ MartinBüttner và ở khía cạnh điên rồ hơn của phổ Labyrinth - lần đầu tiên chúng ta có tất cả bốn ^>v<
trong một chương trình. Hãy thử trực tuyến!
Giải trình
Thuật toán chung, chạy trong một vòng lặp, như sau:
1. Read a char
2. If EOF:
3. Move all digits from auxiliary stack to main
4. Output all digits on main stack
5. Halt
Otherwise:
6. If char is a letter (c >= 64):
7. If random turns left:
8. Output char XOR 32
Otherwise:
9. Output char
Otherwise:
10. Shift char to auxiliary stack
11. If char is space (c-32 == 0):
12. Pull char back from auxiliary stack
13. Output underscore
Otherwise:
14. Continue loop
Để giữ cho lời giải thích nhỏ gọn, đây là cách mỗi phần của chương trình tương ứng với mã giả ở trên:
Dưới đây là những phần thú vị.
Bắt ngẫu nhiên trong Labyrinth
Chỉ có một cách duy nhất để có được sự ngẫu nhiên trong Mê cung, và đó là khi IP cố gắng đi tiếp nhưng 1) không có đường dẫn nào cũng không có đường lùi và 2) có đường đi bên trái và phải. Trong trường hợp này, IP chọn ngẫu nhiên giữa các tuyến trái và phải.
Điều này chỉ có thể sử dụng các ^>v<
toán tử, bật n
và dịch chuyển hàng / cột n
đi 1. Ví dụ: chương trình ( Dùng thử trực tuyến! )
" 1
""v!@
2
!@
xuất ngẫu nhiên 1 hoặc 2, vì v
cột dịch chuyển cột có offset 0 (tức là cột IP được bật) bằng 1, mang lại
"
""1!@
v
2!@
IP hướng về phía bên phải và cố gắng đi tiếp (đỉnh ngăn xếp là 0) nhưng không thể. Nó cũng không thể di chuyển lùi, vì vậy nó chọn ngẫu nhiên giữa trái hoặc phải.
Thủ thuật đánh gôn
Chương trình bắt đầu từ char đầu tiên theo thứ tự đọc, mà bạn sẽ nhận thấy thực sự là bước 6. Tuy nhiên, xuất hiện từ ngăn xếp Labyrinth trống rỗng mang lại 0, do đó, các bước 10 và 14 xảy ra, chuyển số 0 sang ngăn xếp phụ, rất hiệu quả một không-op.
Ngăn xếp chính có hiệu quả trống sau mỗi lần lặp, điều này cho phép chúng ta đánh golf cách bố trí mã bằng cách sử dụng >
và <
trên các số 0 ẩn ở phía dưới. Hàng >
kết thúc hàng dưới cùng xung quanh để IP di chuyển từ dưới cùng bên phải sang dưới cùng bên trái và <
dịch chuyển hàng trở lại. IP sau đó vui vẻ di chuyển lên cột bên trái để tiếp tục vòng lặp.
Chữ số trong Labyrinth pop n
và đẩy 10*n + <digit>
. Ngoài ra, ký tự được lấy modulo 256 trước khi xuất ra. Đặt hai cái này lại với nhau cho phép chúng ta xuất 95 (gạch dưới) bằng cách thực hiện `33
đến 32 (dấu cách), hoạt động vì -3233 % 256 = 95
. Mặc dù có nhiều cách khác để biến 32 thành 95 ( ;95
dễ nhất), làm việc với số âm ở đây cho phép chúng tôi nén mã một chút với các rẽ trái.