Mê cung , 394 386 byte
Tôi tự hào giới thiệu ...
<}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111
? @
:" }}_47}_95 3""""""""(
_ : } _ } {=}
2 23_}29_ _ ; : \
0 ; 3 +_( 3_" 60{ .{.{.
"-_95:}}"" 2 0 ) 2 " _ _ {
"" _ : 2 _ ."(; } 3 .{
;_92}_47} : _ 0 = : * ;
: "" 2 {.{{ . -""(
}}:59_}}:::: "";_ . { _ "
} " {.{.{. 32.
}}}_95:}}}}_20-
... Mê cung esolang hai chiều mới của tôi! Đoạn mã trên không được chơi tốt đến mức khó tin (có 161 khoảng trắng và 25 NOP, vì vậy bố cục tốt hơn có thể rút ngắn điều này rất nhiều), nhưng ít nhất tôi đã xoay sở để chứng minh rằng ngôn ngữ có thể sử dụng được cho các nhiệm vụ không tầm thường. :)
Làm thế nào nó hoạt động
Đầu tiên, tổng quan nhanh về ngôn ngữ:
- Labyrinth hoạt động trên hai ngăn xếp, chính và phụ , có thể chứa các số nguyên được ký tùy ý. Ở dưới cùng của cả hai ngăn xếp có một số lượng vô hạn.
- Các lệnh là các ký tự riêng lẻ trên lưới 2D và chúng tạo thành một mê cung (đó là các ký tự không xác định, đặc biệt là các khoảng trắng, là các bức tường).
"
là một NOP không phải là một bức tường và có thể hữu ích cho việc đệm các đường dẫn nhất định trong mã. Trái ngược với nhiều ngôn ngữ 2D khác, các cạnh không bao quanh.
- Con trỏ lệnh (IP) bắt đầu ở ký tự không tường đầu tiên (theo thứ tự đọc) di chuyển sang phải.
@
chấm dứt chương trình.
- Nếu có thể, IP sẽ theo các hành lang (cũng quanh các khúc cua). Nếu IP có nhiều ô để di chuyển, nó thường sẽ rẽ trái nếu đỉnh của ngăn chính là âm, di chuyển thẳng về phía trước nếu nó bằng 0 hoặc rẽ phải nếu nó dương. Khi IP chạm vào tường, nó sẽ đảo ngược hướng. (Có thêm một vài sự tinh tế, nhưng chúng không quan trọng đối với mã này.) Đây là cách duy nhất để thực hiện luồng điều khiển.
- Ngoài các lệnh thao tác số học và ngăn xếp, mã nguồn có thể được sửa đổi trong thời gian chạy với bốn lệnh
>v<^
sẽ dịch chuyển một hàng hoặc cột của mã nguồn theo chu kỳ bởi một ô. Hàng hoặc cột nào bị ảnh hưởng phụ thuộc vào đỉnh của ngăn xếp. Nếu hàng hoặc cột riêng của IP bị dịch chuyển, nó sẽ di chuyển theo ca. Điều này làm cho nó có thể nhảy từ một cạnh của mã nguồn sang bên kia.
Bây giờ cho thử thách đặc biệt này, đây là ý tưởng chung của thuật toán:
- Đẩy các đầu của xe lên tới các nắp ca-pô (tức là
/ \_o oo o
) vào ngăn phụ.
- Đọc đầu vào và xác định xem có nên đẩy
__
hay không/\
tiếp theo.
- Đẩy phần còn lại của những chiếc xe (tức là
__ __ _/ \
và hai khoảng trống dẫn đầu) lên ngăn phụ.
- Kẹp đầu vào với giá trị tối đa là
20
, hãy gọi N này .
- Bây giờ làm 3 lần sau:
- In N khoảng trắng.
- In 6 ký tự được lưu trữ.
- In khoảng trắng 60 - 3 * N.
- In 6 ký tự được lưu trữ.
- In một dòng mới.
Cuối cùng, hãy xem xét một số phần của mã. IP bắt đầu ở góc trên cùng bên trái, trên lệnh dịch chuyển lưới. Đỉnh của ngăn xếp chính là 0
(được sử dụng như một chỉ số tương đối), vì vậy hàng đầu tiên được dịch sang trái, nó cũng di chuyển IP sang đầu bên phải của lưới. Bây giờ hàng đầu tiên được thực hiện đơn giản từ phải sang trái, sẽ đẩy tập hợp các ký tự cố định đầu tiên lên ngăn xếp phụ trợ:
}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111<
Dịch chuyển hàng này rất hữu ích cho việc chơi golf khi bạn muốn bắt đầu với một lượng lớn mã tuyến tính.
Tiếp theo chúng ta đọc đầu vào và đẩy các bon chính xác:
?
:"
_
2
0 ;
"-_95:}}""
"" _
;_92}_47}
Bit bên trái với ba NOP gửi kết quả âm tính dọc theo nhánh trên cùng và kết quả không âm dọc theo nhánh dưới cùng. Ở bên phải họ được nối lại với nhau.
Bây giờ đi theo một phần tuyến tính lớn khác (có thể được đánh gôn rất nhiều với một mẹo chuyển hàng khác):
}}_47}_95
: }
23_}29_ _
3
2
:
:
:
}}:59_}}::::
}
}}}_95:}}}}
Điều này đẩy phần còn lại của những chiếc xe lên chồng phụ.
Tiếp theo, chúng tôi tính toán min(20, input)
, tương tự như nhánh đầu tiên:
;
+_(
0 )
2 _
_ 0
"" 2
"";_
"
_20-
Cuối cùng, chúng ta có vòng lặp chạy ba lần để in các dòng. Mỗi lần lặp của vòng lặp chứa hai vòng lặp nhỏ (3x3) để in các khoảng trắng, cũng như hai phần để in 6 ký tự từ ngăn xếp phụ:
@
3""""""""(
_ } {=}
: \
3_" 60{ .{.{.
2 " _ _ {
."(; } 3 .{
= : * ;
{.{{ . -""(
. { _ "
{.{.{. 32.
Một mẹo tiện lợi mà tôi muốn thu hút sự chú ý là .{.{.
ở cạnh phải. Đây là một ngõ cụt, do đó, .
ở cuối, mã được thực thi hai lần, một lần tiến và một lần lùi. Điều này cung cấp một cách gọn gàng để rút ngắn mã palindromic (điều cần lưu ý là bạn cần đảm bảo IP thực hiện lần lượt chính xác khi thoát khỏi ngõ cụt một lần nữa).
/ \
trái ngược với xuống_ _
?