Thách thức này là một phần thưởng cho ais523 cho chiến thắng các " Rookie of the Year " mục trong " Best of PPCG 2016 ". Xin chúc mừng!
BackFlip là một ngôn ngữ lập trình bí truyền được tạo bởi người dùng ais523 , người đã tạo ra hơn 30 esolang thú vị khác .
BackFlip là ngôn ngữ 2D như Befunge hoặc > <> trong đó con trỏ lệnh đi ngang qua lưới văn bản (chương trình), di chuyển lên, xuống, trái và phải, thay đổi hướng tùy thuộc vào ký tự. Quan trọng, lưới trong chương trình BackFlip thay đổi khi nó đang đi qua, giống như Ant của Langton .
Đối với thử thách này, bạn có thể cho rằng chương trình BackFlip luôn là một lưới văn bản hình chữ nhật (tất cả các dòng có cùng độ dài), kích thước tối thiểu 1 × 1, chỉ chứa các ký tự ./\<>^V
. ( .
được sử dụng cho khả năng hiển thị thay vì không gian.) Về mặt ngữ nghĩa, BackFlip chúng tôi sẽ sử dụng ở đây giống hệt với thông số ban đầu .
Con trỏ lệnh (IP) trong BackFlip luôn bắt đầu ở bên trái góc trên cùng bên trái của chương trình, hướng sang phải. Có ba loại lệnh nó có thể gặp:
.
là một không-op. IP tiếp tục theo hướng nó đang đi. Các no-op vẫn là một no-op./
và\
là những tấm gương. Chúng phản xạ IP theo hướng được chỉ định bởi góc của chúng, sau đó chúng thay đổi thành loại gương khác .- Ví dụ, nếu các đầu IP trái sang a
\
, nó bắt đầu di chuyển lên trên thay vì trái và\
trở thành a/
.
- Ví dụ, nếu các đầu IP trái sang a
<
,>
,^
, VàV
là mũi tên. Họ chuyển hướng IP theo hướng họ chỉ vào, sau đó họ đổi thành một mũi tên chỉ theo hướng IP đến (ngược với hướng IP đang di chuyển) .- Ví dụ, nếu IP hướng xuống dưới
>
, nó bắt đầu di chuyển sang phải thay vì đi xuống và>
trở thành^
vì đó là hướng mà IP xuất phát.
- Ví dụ, nếu IP hướng xuống dưới
Chương trình BackFlip chấm dứt khi IP di chuyển ra khỏi giới hạn, tức là tắt khỏi lưới. Hóa ra tất cả các chương trình BackFlip cuối cùng đều kết thúc vì các vòng lặp vô hạn là không thể. (Bạn có thể cho rằng điều này là đúng.)
Mục tiêu của bạn trong thử thách này là viết một chương trình hoặc hàm thực hiện trong chương trình BackFlip và đưa ra số lần di chuyển mà con trỏ lệnh thực hiện trước khi chương trình kết thúc. Đó là, IP thực hiện bao nhiêu bước trong quá trình chạy chương trình? Điều này bao gồm bước ban đầu lên lưới và bước cuối cùng của nó.
Ví dụ, con trỏ lệnh thực hiện 5 bước trong lưới tầm thường ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
Vì vậy, đầu ra ....
là 5
.
Trong lưới 4 × 2 phức tạp hơn
\...
\.><
IP thoát khỏi lưới ở bước thứ 9 của nó, vì vậy đầu ra là 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
Mã ngắn nhất tính bằng byte thắng.
Bạn có thể lấy đầu vào dưới dạng một mảng các dòng hoặc ma trận ký tự thay vì một chuỗi nhiều dòng nếu muốn, nhưng bạn phải sử dụng các ký tự ./\<>^V
(không phải là số nguyên). Bạn có thể sử dụng không gian thay vì .
nếu thích. Sẽ ổn nếu các ký tự như \
cần được thoát trong đầu vào. Đầu ra luôn là một số nguyên nhiều hơn một.
Các trường hợp thử nghiệm
....
5
\...
\.><
9
.
2
..
3
.
.
2
\
2
^
2
.^.
3
<.
2
\\
\/
7
>V
^<
6
>\
>/
6
\><
2
\><
\><
7
\><
\><
\><
12
\.V.
\.\<
5
\.V.
\./<
9
V./\
V./\
>./<
..\/
14
\V..
.^..
\/><
.V..
.^..
20
\.V.V.
\./.\<
.>\<..
..^.^.
31
\.V.V.V.
\./>/.\<
.>\>\<..
..^.^.^.
69
\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.
145
\.V.V.V.V.V.V.V.V.V.V.
\./>/>/>/>/>/>/>/>/.\<
.>\>\>\>\>\>\>\>\>\<..
..^.^.^.^.^.^.^.^.^.^.
9721
/
sẽ làm cho IP đi lên và đi lên /
sẽ làm cho IP đi đúng, như thể nó là một quả bóng nảy ra từ một bức tường. (Nhưng hãy nhớ những /
thay đổi của dấu gạch chéo ngược sau khi IP chạm vào nó.)