Любимая рыба, которая плавает по коду > <> (эзотерическому языку программирования) , была выведена из своего естественного окружения. Это изменение сделало его неспособным перемещаться так, как раньше: то, что раньше было тороидальным движением, было ограничено простым движением слева направо. Но> <> программы по-прежнему написаны так, как будто рыба была способна перемещаться по ним. Ваша задача, дорогой программист, написать программу для линеаризации программы> <>. И сделать это как можно меньше байтов; У рыб не очень большие воспоминания.
Движение в> <>
В> <> движение является тороидальным и по одному символу за раз. Это означает, что рыба (указатель) может «оборачиваться» от конца строки до начала. В> <> рыба также способна перемещаться сверху вниз, снизу вверх и справа налево, в отличие от способа перемещения большинства указателей. Таким образом, этот шаблон движения будет действительным:
>>>^ >>>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)
. Рыба начинает анализировать команды, начиная с первой команды, которую видит, и меняет свое направление, если команда соответствует одному из вышеупомянутых переключателей направления.
Рыба перестает двигаться, когда видит ;
и завершает программу.
вход
Ввод будет действительной (например, не бесконечно зацикливающейся) программой, передаваемой через STDIN. Вы также можете прочитать файл, если хотите. Строки каждой программы не обязательно будут иметь одинаковую длину.
Входные данные даны в виде строки с символами новой строки, разделяющими каждую строку в программе.
Программы не будут зацикливаться, что также означает, что они всегда заканчиваются символом ;
.
Выход
Вывод будет линеаризован программой. То есть вы должны вернуть все символы (включая переключатели направления), которые рыба увидит, если она запускает программу «нормально». Это все персонажи на своем пути к ;
.
Если на входе есть линии неравной длины, и рыба в конечном итоге движется по линии, которая короче, чем длина самой длинной линии, вы должны рассматривать это так, как если бы рыба двигалась в пространстве (см. Контрольные примеры).
Те, кто знаком с> <>, будут знать, что переключатели направления - не единственный способ сделать движение в нем, но для простоты трактуйте входные данные так, как будто они - единственный способ повлиять на движение.
правила
- Применяются стандартные лазейки
- Вы можете написать либо полную программу, либо функцию
- Ввод осуществляется через 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;
;
;
Ответы:
Röda ,
405393392391371366361236234232230223200 байтовПопробуйте онлайн!
Проверьте выходы!
Объяснение (устарело)
Правки
%
вместо проверки, находится ли x или y за границами, что проложило путь еще на 2!`\`
вместо"\\"
c=""
на вторую строку, а затем удалил новую строку после нееwhile
(спасибо @fergusq за это)a=X
из if-операторов+1
в концеindexOf
и реструктурирован код, чтобы сохранить 2 байтаuntil[c=";"]
вместоwhile[c!=";"]
l.=[" "]*L
источник
x=((x+X)%#l)
вместоx+=X
. К сожалению,(-1)%#l
все еще возвращается-1
.y
слишком:y=y%#f
.key
вместоcmp
и используйте{...}while[...]
вместоwhile[...]do ... done
.Python 2,
262243237235234233231221219218217 байтПринимает вход как
['<line_1>', '<line_2>', ...]
Попробуйте онлайн!
-19 байтов благодаря @math_junkie
-6 байтов благодаря @ThisGuy
-2 байта путем извлечения
max(map(L,i))
в переменную (потому что это теоретически используется дважды).-1 байт за счет уменьшения количества раз
i[y][x]
появляется.-1 байт при использовании,
'\x00'
поэтому мне не нужно вносить[1:]
частьo[1:]
в выходные-2 байта, используя
\0
вместо\x00
-10 байт, благодаря @KritixiLithos за понимание того, что я могу заполнять столько, сколько хочу на правой стороне, потому что дополнительная будет игнорироваться
(без изменения байтов); исправлена ошибка, связанная с тем, что извлеченная переменная находилась вне цикла
байтов -2, потому что теперь я использую только
len
2 раза, поэтому для переназначения требуется 2 дополнительных байта-2 байта с использованием
while';'not in o
вместоwhile o[-1]!=';'
и используяo=''
вместоo='\0'
. Это не только экономит 2 байта, но также избавляет от начального нулевого байта, который был технически недействительным.объяснение
источник
try
find
-1
len
переменной, например,L
сохранить 3 байта и еще 4, изменив многострочное присвоение0
на 1 строкуx=y=k=0
.Рубин,
274200187183Сбривают только еще несколько символов, понижая массив импульса,
d
.Я очень горжусь этим. Это было весело! Он принимает массив строк и возвращает правильную строку.
Комментарий ниже.
источник
PHP 7,
291260 байтисточник
JavaScript,
242236235231220 байтПопробуйте онлайн!
источник