Эта задача является призом для ais523 за победу в категории « Новичок года » в номинации « Лучший из PPCG 2016 ». Поздравляем!
BackFlip - это эзотерический язык программирования, созданный пользователем ais523 , который создал более 30 других интересных эзолангов .
BackFlip это 2D-язык, как Befunge или > <>, где указатель инструкций пересекает сетку текста (программу), перемещаясь вверх, вниз, влево и вправо, изменяя направление в зависимости от символа, на котором он находится. Крайне важно, что сетка в программе BackFlip изменяется по мере прохождения, немного как муравей Лэнгтона .
Для этой задачи вы можете предположить, что программа BackFlip всегда представляет собой прямоугольную сетку текста (все строки одинаковой длины), размером не менее 1 × 1, содержащую только символы ./\<>^V
. ( .
используется для видимости, а не для пробела.) Семантически BackFlip, который мы здесь используем, идентичен оригинальной спецификации .
Указатель инструкций (IP) в BackFlip всегда начинается слева от верхнего левого угла программы, направляясь вправо. Есть три типа команд, с которыми он может столкнуться:
.
это неоперация. IP продолжается в том же направлении, в котором он шел. Без операции остается без операции./
и\
являются зеркалами. Они отражают IP в направлении, указанном их углом, затем они превращаются в зеркало другого типа .- Например, если IP направляется в a
\
, он начинает двигаться вверх, а не влево, и\
становится a/
.
- Например, если IP направляется в a
<
,>
,^
, ИV
являются стрелки. Они перенаправляют IP-адрес в указанном направлении, а затем превращаются в стрелки, указывающие направление, в котором появился IP-адрес (в противоположном направлении от IP-адреса) .- Например, если IP направляется вниз
>
, он начинает двигаться вправо, а не вниз, и>
становится^
так, потому что это направление, откуда пришел IP.
- Например, если IP направляется вниз
Программа BackFlip завершается, когда IP выходит за границы, то есть выходит из сетки. Оказывается, все программы BackFlip в конце концов заканчиваются, потому что бесконечные циклы невозможны. (Вы можете предположить, что это правда.)
Ваша задача в этой задаче состоит в том, чтобы написать программу или функцию, которая принимает программу BackFlip и выводит количество ходов, которые указатель инструкций совершил до завершения программы. То есть, сколько шагов IP делает в ходе работы программы? Это включает в себя начальный шаг в сетке и последний шаг от нее.
Например, указатель инструкции выполняет 5 шагов в тривиальной сетке ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
Итак, вывод ....
есть 5
.
В более сложной сетке 4 × 2
\...
\.><
IP выходит из сетки на своем 9-м шаге, поэтому вывод 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
Самый короткий код в байтах побеждает.
Вы можете принять ввод как массив строк или матрицу символов вместо многострочной строки, если хотите, но вы должны использовать символы ./\<>^V
(не целочисленные коды операций). Вы можете использовать пространство вместо.
если предпочитаете. Это хорошо, если такие символы, как например, \
необходимо экранировать при вводе. Вывод всегда является целым числом больше одного.
Тестовые случаи
....
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
/
, IP поднимется, а вверх /
- IP, как если бы мяч отскакивал от стены. (Но помните, что /
изменения коснулись после того, как IP коснулся его.)