Цей виклик є призом для ais523 за перемогу в категорії « Новачок року » у « Кращому PPCG 2016 ». Вітаємо!
BackFlip - це езотерична мова програмування, створена користувачем ais523 , який створив понад 30 інших цікавих езолангів .
BackFlip - це двовимірна мова на зразок Befunge або > <>, де вказівник інструкції перетинає сітку тексту (програма), рухаючись вгору, вниз, вліво та вправо, змінюючи напрямок залежно від символу, на якому він входить. Критично, сітка в програмі BackFlip змінюється під час її проходження, схоже на мурашник Ленґтона .
Для цього виклику ви можете припустити, що програма BackFlip - це завжди прямокутна сітка тексту (всі рядки однакової довжини), розміром 1 × 1 мінімум, містить лише символи ./\<>^V
. ( .
використовується для наочності, а не для простору.) Семантично BackFlip, який ми будемо використовувати тут, ідентичний оригіналу .
Покажчик інструкцій (IP) у BackFlip завжди починається зліва від верхнього лівого кута програми, заголовок праворуч. Існує три типи команд, з якими він може зіткнутися:
.
є не-оп. ІС триває в тому напрямку, в якому він йшов. Неоперативний залишається не-оп./
і\
є дзеркалами. Вони відображають ІР у напрямку, вказаному їх кутом, потім переходять у дзеркало іншого типу .- Наприклад, якщо IP-голова залишилася в a
\
, вона починає рухатися вгору, а не вліво, і вона\
стає a/
.
- Наприклад, якщо IP-голова залишилася в a
<
,>
,^
, ІV
є стрілки. Вони переспрямовують IP в той напрямок, в якому вони вказують, потім перетворюються на стрілку, яка вказує в напрямку, з якого прийшов IP (навпроти напрямку, по якому рухався IP) .- Наприклад, якщо IP спрямовується вниз
>
, він починає рухатися направо, а не вниз, і>
стає^
тим, що це напрямок, з якого пішов IP.
- Наприклад, якщо IP спрямовується вниз
Програма BackFlip припиняється, коли IP виходить за межі, тобто виходить з мережі. Виявляється, всі програми BackFlip врешті-решт закінчуються, оскільки безмежні петлі неможливі. (Ви можете припустити, що це правда.)
Ваша мета в цьому виклику - написати програму або функцію, яка виконує програму BackFlip і видає кількість рухів, які вказує вказівник до закінчення програми. Тобто, скільки кроків виконує ІР під час роботи програми? Сюди входить початковий крок до сітки та останній крок від неї.
Наприклад, покажчик інструкцій робить 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 торкнеться її.)