Иногда при написании кода для мозгового отвращения вы чувствуете необходимость сделать его длиннее, чем необходимо, чтобы стимулировать отладку. Вы могли бы сделать это, просто положив ><
туда, но что это весело? Вам нужно что-то более длинное и меньшее NOPey, чтобы сбить с толку любого, кто читает ваш код.
Краткое введение в Brainfuck
Brainfuck - это эзотерический язык программирования, созданный в 1993 году Урбаном Мюллером и отличающийся чрезвычайным минимализмом. (Википедия)
Brainfuck является язык , основанный на восьми команд: +-><,.[]
. Код запускается на чем-то похожем на машину Тьюринга: бесконечную ленту, на которой можно изменять значения. В этом задании мы сосредоточимся на первых четырех:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
Brainfuck NOPs
Мозговой NOP - это последовательность персонажей, которые при исполнении из любого состояния не приводят к изменению состояния. Они состоят из четырех символов, упомянутых выше.
Соревнование
Задача состоит в том, чтобы написать программу или функцию, которая при исполнении генерирует случайный NOP для мозгового отрыва заданной длины.
вход
В качестве входных данных вы получите неотрицательное четное число n
. (НОПы для странного невозможны n
.)
Выход
Вы выведете случайный NOP мозгового траха длины n
.
правила
- Определение NOP: когда выходные данные программы вставляются в любую точку программы «мозгового штурма», поведение указанной программы не должно меняться каким-либо образом. Другими словами, он не должен изменять состояние переводчика.
- Обратите внимание, что, например,
+>-<
это неверно, так как он изменяет значения двух ячеек, не возвращая их обратно. Пожалуйста, проверьте ваше решение для них перед публикацией. - Также обратите внимание, что
+>-<->+<
это NOP, который нельзя уменьшить до нуля, просто удалив><
<>
+-
-+
. Таким образом, вы не можете использовать алгоритм, который просто вставляет их друг в друга.
- Обратите внимание, что, например,
- Каждый действительный NOP длины
n
должен иметь ненулевой шанс появления в выходных данных. Распределение не обязательно должно быть равномерным. - У рассматриваемого интерпретатора мозгового удара есть вдвойне бесконечная лента произвольных прецизионных ячеек. То есть вы можете бесконечно идти в обоих направлениях и увеличивать / уменьшать каждую ячейку до бесконечности.
- Программа должна завершиться в течение 1 минуты для
n
= 100 на моем компьютере, поэтому не нужно создавать все возможные NOP и выбирать один. - Если задан неверный ввод (нецелое, отрицательное, нечетное и т. Д.), Вы можете делать все, что захотите, включая сбой.
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Примеры
Вот все допустимые результаты для n
= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
Вот несколько возможных выходных данных для n
= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
.
имеет побочный эффект, ,
перезаписывает значение, которое не может быть восстановлено без использования []
. Но в []
итоге установим значение на ноль. Это также перезаписывает значение (поэтому нам понадобится другое []
для его восстановления), если только мы не можем быть уверены, что затронутая ячейка была нулевой для начала. Однако нам пришлось бы искать такую камеру с чем-то вроде этого [>]
, и невозможно надежно вернуться к той позиции, с которой мы пришли.
+-<>
как вы просили:a