:?
:
#/)
\ #
!"*@
"
Hãy thử trực tuyến!
Điều này xuất ra các kết quả theo thứ tự được C, B, A
phân tách bằng các nguồn cấp.
Giải trình
Như thường lệ, một đoạn mồi Labyrinth ngắn:
- 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. Chúng tôi sẽ chỉ sử dụng chính cho câu trả lời này.
- 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.
Mặc dù hai không-op ("
) làm cho bố cục có vẻ hơi lãng phí, tôi khá hài lòng với giải pháp này, bởi vì luồng điều khiển của nó thực sự khá tinh tế.
IP bắt đầu ở góc trên cùng bên trái ở :
bên phải. Nó sẽ ngay lập tức đi vào ngõ cụt ?
và quay lại, để chương trình thực sự bắt đầu với đoạn mã tuyến tính này:
: Duplicate top of main stack. This will duplicate one of the implicit zeros
at the bottom. While this may seem like a no-op it actually increases
the stack depth to 1, because the duplicated zero is *explicit*.
? Read n and push it onto main.
: Duplicate.
: Duplicate.
Điều đó có nghĩa là bây giờ chúng tôi đã có ba bản sao n
trên ngăn xếp chính, nhưng độ sâu của nó là 4
. Điều đó thuận tiện vì điều đó có nghĩa là chúng ta có thể lấy chiều sâu ngăn xếp để lấy hệ số nhân hiện tại trong khi làm việc thông qua các bản sao của đầu vào.
Bây giờ IP đi vào một vòng 3x3 (theo chiều kim đồng hồ). Lưu ý rằng #
, việc đẩy độ sâu ngăn xếp, sẽ luôn đẩy giá trị dương sao cho chúng ta biết IP sẽ luôn quay về hướng đông tại thời điểm này.
Cơ thể vòng lặp là thế này:
# Push the stack depth, i.e. the current multiplier k.
/ Compute n / k (rounding down).
) Increment.
# Push the stack depth again (this is still k).
* Multiply. So we've now computed (n/k+1)*k, which is the number
we're looking for. Note that this number is always positive so
we're guaranteed that the IP turns west to continue the loop.
" No-op.
! Print result. If we've still got copies of n left, the top of the
stack is positive, so the IP turns north and does another round.
Otherwise, see below...
\ Print a linefeed.
Then we enter the next loop iteration.
Sau khi vòng lặp được duyệt qua (tối đa !
) ba lần, tất cả các bản sao n
được sử dụng hết và số 0 bên dưới được tiết lộ. Bởi vì"
ở phía dưới (mà mặt khác có vẻ khá vô dụng), vị trí này là một ngã ba. Điều đó có nghĩa là với số 0 trên đỉnh của ngăn xếp, IP cố gắng đi thẳng về phía trước (phía tây), nhưng vì có một bức tường, nó thực sự quay 180 độ và di chuyển về phía đông như thể nó đã đi vào ngõ cụt.
Kết quả là, bit sau đây được thực thi:
" No-op.
* Multiply two zeros on top of the stack, i.e. also a no-op.
The top of the stack is now still zero, so the IP keeps moving east.
@ Terminate the program.
C B A
) nếu nó được chỉ định rõ ràng trong câu trả lời không?