Con cá yêu dấu bơi qua mã của > <> (một ngôn ngữ lập trình bí truyền) đã được đưa ra khỏi môi trường tự nhiên của nó. Sự thay đổi này đã khiến nó không có khả năng di chuyển theo cách mà nó đã từng sử dụng: những gì từng là chuyển động hình xuyến đã bị hạn chế đối với chuyển động từ trái sang phải đơn giản. Nhưng các chương trình> <> vẫn được viết như thể cá có khả năng di chuyển qua chúng. Nhiệm vụ của bạn là lập trình viên thân yêu, viết một chương trình để tuyến tính hóa một chương trình> <>. Và làm điều đó trong càng ít byte càng tốt; cá không có những kỷ niệm rất lớn
Di chuyển trong> <>
Trong> <>, chuyển động là hình xuyến và mỗi lần một ký tự. Điều này có nghĩa là cá (con trỏ) có thể "quấn" xung quanh từ cuối dòng trở lại từ đầu. Trong> <>, cá cũng có khả năng di chuyển từ trên xuống dưới, từ dưới lên trên và từ phải sang trái, trái ngược với cách mà hầu hết các con trỏ di chuyển. Vì vậy, mô hình chuyển động này sẽ hợp lệ:
>>>^ >>>v
>>>^ v
và nó sẽ kết thúc trên một vòng lặp vô hạn (lặp lại dòng trên cùng một khi nó vượt qua đáy vô hạn).
Cá di chuyển trong một lưới có chiều dài bằng max (chiều dài hàng) và chiều cao bằng số lượng hàng.
Làm thế nào để bạn tìm ra cách cá di chuyển? Các lệnh này thay đổi vectơ hướng di chuyển (ví dụ: (-1,0)
từ phải sang trái):
Command | Direction Change
---------------------------
> | (1,0) (default)
< | (-1,0)
^ | (0,1)
v | (0,-1)
/ | (x,y) -> (y,x)
\ | (x,y) -> (-y,-x)
| | (x,y) -> (-x,y)
_ | (x,y) -> (x,-y)
# | (x,y) -> (-x,-y)
; | (0,0)
Như đã lưu ý, cá bắt đầu di chuyển từ trái sang phải, tức là với vectơ chỉ hướng (1,0)
. Con cá bắt đầu phân tích các lệnh bắt đầu bằng lệnh đầu tiên mà nó nhìn thấy và thay đổi hướng của nó nếu một lệnh khớp với một trong những thay đổi hướng đã nói ở trên.
Con cá dừng di chuyển khi nhìn thấy a ;
và chấm dứt chương trình.
Đầu vào
Đầu vào sẽ là một chương trình hợp lệ (ví dụ: không lặp vô hạn) được đưa ra thông qua STDIN. Bạn cũng có thể đọc một tập tin nếu bạn muốn. Các dòng của mỗi chương trình sẽ không nhất thiết phải có cùng độ dài.
Đầu vào được đưa ra dưới dạng một chuỗi, với các dòng mới phân tách từng dòng trong chương trình.
Các chương trình sẽ không lặp, điều đó cũng có nghĩa là chúng sẽ luôn chấm dứt với a ;
.
Đầu ra
Đầu ra sẽ là chương trình tuyến tính hóa. Đó là, bạn nên trả lại tất cả các ký tự (bao gồm cả bộ thay đổi hướng) mà cá sẽ thấy nếu nó chạy chương trình "bình thường". Đây là tất cả các nhân vật trong đường dẫn đến ;
.
Nếu đầu vào có các dòng có độ dài không bằng nhau và cá cuối cùng di chuyển dọc theo một dòng ngắn hơn chiều dài của dòng dài nhất, bạn nên xử lý như thể cá đang di chuyển trên một không gian (xem trường hợp kiểm tra).
Những người quen thuộc với> <> sẽ biết rằng những người thay đổi hướng không phải là cách duy nhất để thực hiện chuyển động trong đó, nhưng vì đơn giản, hãy đối xử với đầu vào như thể họ là cách duy nhất ảnh hưởng đến chuyển động.
Quy tắc
- Áp dụng sơ hở tiêu chuẩn
- Bạn có thể viết một chương trình hoặc chức năng đầy đủ
- Đầu vào được cung cấp thông qua STDIN hoặc một tệp dưới dạng chuỗi chứa các dòng chương trình được phân tách bằng dòng mới (
\n
)- Bạn có thể lấy đầu vào khác nhau, theo lý do (vui lòng hỏi tôi nếu bạn có một loại đầu vào cụ thể trong đầu). Bạn không thể đệm đầu vào với khoảng trắng để độ dài dòng khớp.
- Tham khảo bài viết meta này liên quan đến đầu vào linh hoạt. Theo quan điểm của việc đăng bài, sự đồng thuận chung là phải linh hoạt nhất có thể trong lý do.
- Đầu ra là một chuỗi đơn thông qua STDOUT hoặc được trả về bởi hàm (tùy thuộc vào những gì bạn chọn làm, xem Quy tắc 2)
Các trường hợp thử nghiệm
v >v
>abcv//;
gfed<^ih
v>abcv<defghi^//>v;
v >v
>abcv//;
gfed<^
v>abcv<defg ^//>v;
abcdef;
abcdef;
abcd|;
abcd|dcba;
abcd#;
abcd#dcba;
abcd\;
_
abcd\_\dcba;
^;
>abcde/
^jihg<
^ >abcde/ <ghij^a;
;
;