Улюблену рибу, яка плаває за кодом > <> (езотерична мова програмування) , вивели з природного середовища. Ця зміна зробила його нездатною рухатись так, як вона звикла: те, що було тороїдальним рухом, було обмежено простим рухом вліво-вправо. Але> <> програми все ще пишуться так, ніби риба здатна рухатися через них. Ваше завдання, шановний програміст, написати програму для лінеаризації програми> <>. І робити це в якомога менше байтах; риба не має дуже великих спогадів.
Рух у> <>
У> <> рух є тороїдальним і одним символом одночасно. Це означає, що риба (вказівник) може «обернутись» від кінця рядка назад до початку. У> <> риба також здатна рухатися зверху вниз, знизу вгору та праворуч наліво, на відміну від того, як рухається більшість покажчиків. Отже, ця схема руху буде дійсною:
>>>^ >>>v
>>>^ v
і воно закінчиться на нескінченному циклі (петля назад до верхньої лінії, коли нескінченно пройде повз нижню).
Риба рухається сіткою довжиною, рівною max (довжина рядка) і висотою, що дорівнює кількості рядів.
Як ви зрозумієте, яким шляхом рухається риба? Ці команди змінюють вектор напрямку руху (наприклад, (-1,0)
означає, що направо-наліво):
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)
Як зазначалося, риба починає рухатися зліва направо, тобто з вектором напрямку (1,0)
. Риба починає розбирати команди, починаючи з першої команди, яку вона бачить, і змінює свій напрямок, якщо команда відповідає одному з вищезгаданих змінників напрямів.
Риба перестає рухатись, коли бачить a ;
і припиняє програму.
Вхідні дані
Вхід буде дійсною (наприклад, нескінченно циклічною) програмою, що надається через STDIN. Ви також можете прочитати файл, якщо бажаєте. Рядки кожної програми не обов'язково повинні бути однакової довжини.
Введення подається у вигляді рядка, при цьому нові рядки розділяють кожен рядок програми.
Програми не циклічно, а це означає, що вони завжди закінчуються з a ;
.
Вихідні дані
Вихід буде програмою лінеаризований. Тобто, ви повинні повернути всіх символів (включаючи змінні напрямків), які риба побачила б, якщо вона запускає програму "нормально". Це все символи на його шляху до ;
.
Якщо вхід має рядки з неоднаковою довжиною, і риба закінчується рухом по лінії, коротшій за довжину найдовшої лінії, слід ставитися до цього, ніби риба рухається через пробіл (див. Тестові випадки).
Знайомі з <<> знають, що зміна напрямів - не єдиний спосіб робити рух в ньому, але для простоти ставляться до вводу так, ніби вони є єдиним способом впливати на рух.
Правила
- Застосовуються стандартні лазівки
- Ви можете написати або повну програму, або функцію
- Вхід подається через STDIN або файл у вигляді рядка, що містить програмні рядки, розділені новими рядками (
\n
)- Ви можете сприймати інформацію по-різному, в межах причини (не соромтеся запитати мене, чи маєте ви на увазі конкретний вид введення). Ви не можете прошивати вхід пробілами, щоб довжини рядків відповідали.
- Дивіться цей мета-пост щодо гнучкого введення. Наскільки це є розміщенням, загальний консенсус повинен бути максимально гнучким в межах розуму.
- Вихід - це один рядок через STDOUT або повертається функцією (залежно від того, що ви вирішили зробити, див. Правило 2)
Випробування
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;
;
;