Иногда при написании кода для мозгового отвращения вы чувствуете необходимость сделать его длиннее, чем необходимо, чтобы стимулировать отладку. Вы могли бы сделать это, просто положив ><
туда, но что это весело? Вам нужно что-то более длинное и меньшее 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
.
имеет побочный эффект,,
перезаписывает значение, которое не может быть восстановлено без использования[]
. Но в[]
итоге установим значение на ноль. Это также перезаписывает значение (поэтому нам понадобится другое[]
для его восстановления), если только мы не можем быть уверены, что затронутая ячейка была нулевой для начала. Однако нам пришлось бы искать такую камеру с чем-то вроде этого[>]
, и невозможно надежно вернуться к той позиции, с которой мы пришли.Ответы:
CJam,
6259 байтСпасибо nhahtdh за сохранение 3 байта.
Поскольку нет никакого требования к какому-либо конкретному распределению, если каждый неоператор появляется с конечной вероятностью, мы можем упростить это много, просто генерируя строку, содержащую сбалансированное число
-+
и<>
, соответственно, проверяя, является ли она NOP, и сортируя ее, если она нет.Конечно, для более длинных входных данных это почти всегда приводит к сортировке выходных данных, но вы можете проверить код с некоторыми входными
8
данными, например, чтобы убедиться, что он в принципе может генерировать любой NOP заданной длины.Попробуйте онлайн.
источник
CJam,
118116 байтовЭто немного вышло из-под контроля ... особенно вторая половина кажется, что это должно быть очень пригодным для игры в гольф.
Проверьте это здесь.
Это обрабатывает
N = 100
почти мгновенно. У меня нет времени, чтобы написать полную разбивку кода сейчас, поэтому вот алгоритм:<
и>
со случайной (даже) между длиной0
иN
включительно."<>><"
становится[0 '< -1 '> 0 '> 1 '< 0]
.N
.+-
строку случайной позиции.Выполнено. Это основано на наблюдении, что:
<
и>
возвращать головку ленты в исходное положение.Распределяя случайные, но сбалансированные количества
+
s и-
s между всеми местами, где головка ленты находится в данной ячейке, мы гарантируем, что мы найдем все возможные NOP.источник
Mathematica, 350 байт
Слишком долго? Да. Меня это вообще волнует? Нет, пока кто-то еще не отправит правильный ответ.
источник
+
.+
--
и<
->
пар , пока не случится быть NOP. Половина из них берется простым BF-интерпретатором.Python 3 , 177 байт
Попробуйте онлайн!
Я использовал код из ответа Bubbler для симуляции BF.
источник
Python 3 , 163 байта
Попробуйте онлайн!
Полная программа, которая печатает результаты в STDOUT. Линия с кодом BF может быть пригодна для игры в гольф.
Принял подход Tyilo; если сгенерированный код BF не является NOP, откажитесь от него и вернитесь к
'+-'
повторному.источник
JavaScript (Node.js) , 160 байт
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 224 байта
Попробуйте онлайн!
Вот версия без гольфа (или, скорее, перед игрой в гольф):
Сначала мы выбираем случайное число
<
«и>
» для использования, и генерируем случайный список с равным числом каждого.Чтобы заполнить остальные символы, мы выбираем позицию, в которую нужно добавить
+
, затем находим позицию, в которой указатель указывает на то же место, и добавляем-
туда.Повторяйте, пока список не
n
станет длинным, и зафиксируйте результат.источник